mysqldump备份恢复,原库名恢复到另外一个新库名,备份A库,还原到新B库(mysql数据库改名)【2020实践防踩坑】

本文介绍了如何将MySQL数据库A(Abby)备份并恢复到新数据库B(Boy),过程中遇到了数据导入错误,如"MySQL server has gone away",解决方案是调整max_allowed_packet参数。此外,分享了两种方法:一是使用Navicat数据传输(未成功),二是通过mysqldump备份和sed命令修改库名。还强调了在全实例备份中恢复单个数据库的注意事项,避免数据覆盖风险。

需求:A服务器中的Abby库,需要复制(备份→还原)一份到B服务器新建的Boy库中。

方法一(数据量不大):

直接通过navicat工具,打开两个数据库的链接,使用数据传输功能即可。

(本次未成功,遇到大量INSERT INTO报错,或者在命令行中还原遇到“MySQL server has gone away”,引用:

查询该问题是max_allowed_packet配置的默认值设置太小,只需要相应调大该项的值之后再次导入便能成功。该项的作用是限制mysql服务端接收到的包的大小,因此如果导入的文件过大则可能会超过该项设置的值从而导致导入不成功!

查看 max_allowed_packet 的值

show global variables like 'max_allowed_packet';

+--------------------+---------+
| Variable_name      | Value   |
+--------------------+---------+
| max_allowed_packet | 4194304 |
+--------------------+---------+
可以看到默认情况下该项的大小只有4M,接下来将该值设置成150M(1024*1024*150)

set global max_allowed_packet=157286400;

此时再查看大小

show global variables like 'max_allowed_packet';

通过调大该值,一般来说再次导入数据量大的sql应该就能成功了,如果仍然报错,则继续再调大一些就行,请注意通过在命令行中进行设置只对当前有效,重启mysql服务之后则恢复默认值,但可以通过修改配置文件(可以在配置文件my.cnf中添加max_allowed_packet=150M即可)来达到永久有效的目的,可其实我们并不是经常有这种大量数据的导入操作,所以个人觉得通过命令行使得当前配置生效即可,没有必要修改配置文件。)

方法二:

备份:

mysqldump  -uroot -p --databases test --single-transaction --hex-blob --triggers --flush-logs --events --routines --log-error=error1.log >test.sql

重要参数说明:
-n安静模式 -i直接修改读取的文件内容

替换库名:

sed '1,40s/oldname/newname/g' /before.sql>after.sql

以上适合备份文件是单个库的,1,40选定了前40行,如果是全库,不一定在前40行中,如果不限制行数,替换的内容担心替换到不是切换数据库的相同关键字,最好看情况修改成完整确切的USE 'databaseName',
本次前40行没问题,注意判断。
用head下面语句查看前面成功修改了。

head -n 40 after.sql

恢复-o newname单个库:

mysql -uroot -p -o newname<after.sql


导入后检查原库名,新库名的内容,没有问题。

重要提示:

①如果是整个实例的备份(备份了多个dbname数据库,使用-o参数恢复单个数据库,以下列出全写和简写参数)

mysql -uroot -p dbname -o <test.sql
mysql -uroot -p --one-database dbname <test.sql

会出现其他数据库的空库,没有大的影响,需结合实际考虑!

sed -n '/^-- Current Database: `testdb`/,/^-- Current Database: `/p' all_databases.sql > testdb.sql

该语句应该是从整个实例的备份中提取你需要的某一个库的语句出来,testdb是你需要的库,未实践,以下解释取自互联网。

引用:

(10.从全量备份中恢复单库
可能有这样的需求,比如说我们只想恢复某一个库,但是我们有的是整个实例的备份,这个时候我们想到能不能从全量备份中分离出单个库的备份,答案是可以的,下面这个简单的shell可以帮到你哦:

sed -n '/^-- Current Database: `testdb`/,/^-- Current Database: `/p' all_databases.sql > testdb.sql

#分离完成后我们再导入testdb.sql即可恢复单个库)
超级重要提示

③网上有帖子提到用--no-create-db参数备份,然后↓引用“

3、导入数据库(改为新数据库名称NEW_DB_NAME的导入 ):

sed -n '/^-- Current Database: `testdb`/,/^-- Current Database: `/p' all_databases.sql > testdb.sql

”那就不带create语句了,但是!!!

还是会带USE 'DBNAME'语句啊!你恢复的时候还是会切换到原来的库名中!!!

如果你是在线上环境,如果你还是在原库!!!你的数据就被覆盖了!!!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数据威龙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值