需求: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'语句啊!你恢复的时候还是会切换到原来的库名中!!!

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