不积跬步,无以至千里;不积小流,无以成江海。

mysql备份

在执行mysqldump命令时候报如下错误:

[root@localhost ~]# mysqldump -uroot -p --all-databases > all.sql

mysqldump: Got error: 2002: Can't connect to local MySQL server through socket '/data/mysql/mysql.sock' (2) when trying to connect

找到正确的套接字的路径:
[root@localhost ~]# netstat -ln | grep mysql

unix 2 [ ACC ] STREAM LISTENING 2447213870 /data/mysql/data/mysql.sock

再运行dump命令:

mysqldump --socket=/data/mysql/data/mysql.sock -uroot -hlocalhost -p db_err_2017 >/data/mysql/da_err_2017.sql
·············································································································································································································································································································································

1、只导出表结构不导出数据,--no-data

mysqldump -uroot -p --socket=/data/mysql/data/mysql.sock --set-gtid-purged=off --no-data --databases db1 >/tmp/db1.sql

2、导出db1中的a1、a2表

注意导出指定表只能针对一个数据库进行导出,且导出的内容中和导出数据库也不一样,导出指定表的导出文本中没有创建数据库的判断语句,只有删除表-创建表-导入数据
(--set-gtid-purged=off 在dump导出时,添加--set-gtid-purged=off参数,避免将gtid信息导出,不加的话,导入有可能报错。)

补充:如果仅仅是备份单个库或者是导入单个库到其它的数据库(也是开启了GTID),那么GTID号有重复概率(GTID由UUID+顺序事务ID组成),所以如果想在数据导入的时候不想导入另外一个数据库全部的GTID,那么可以使用`--set-gtid-purged=OFF`来禁止。如果想备份整个mysql数据库而不是一个或者数据数据库的话,请使用`--all-databases --triggers --routines --events`等参数,当备份整个数据库的时候,建议备份GTID全局唯一事务号。
如果仅仅是导出一个数据库中的某一个库,该数据不是用于主从复制,那么GTID号可以不进行备份,因为一旦备份的话是备份全部的GTID,所以备份单个库的时候最好是关闭GTID,也就是使用`--set-gtid-purged=OFF`,那么该数据导入其它DB的时候会产生新的GTID号。
如果备份单个库时不使用`--set-gtid-purged=OFF`,那么就会导出整个数据库的GTID号码,如果该数据导入其它的数据库,会连着GTID号码一起导入,虽然基本不可能会有GTID重复的概率,但是被导入的数据库会出现多余的GTID号,所以一般情况下备份单个库建议关闭。如果备份整个库的时候,用于全备恢复,一般情况下都是要打开的,其实不打开也会生成新的GTID,主要用于主从复制的时候新建从库,避免主从的GTID不一致,因为按这种方式与主库建立主从复制的话,从库的GTID号与主库一致,如果导出数据时不导出GTID,那么从库数据难以与主库同步(其实这种方式建立主从的情况也很少,一般情况下从库的所有数据都是通过主从复制从主库获取的)。
mysqldump -uroot -p --socket=/data/mysql/data/mysql.sock --set-gtid-purged=off --databases db1 --tables a1 a2  >/tmp/db1.sql

3、导出所有数据库

该命令会导出包括系统数据库在内的所有数据库

mysqldump -uroot -p --default-character-set=utf8 --flush-logs  --all-databases >/tmp/all.sql
flush logs命令的作用就是关闭当前使用的binary log,然后打开一个新的binary log文件,文件的序号加1.
查看当前数据库binary log的位置
mysql> show master status;

4、导出db1、db2两个数据库的所有数据

mysqldump -uroot -p --socket=/data/mysql/data/mysql.sock --set-gtid-purged=off --databases db1 db2 >/tmp/user.sql

······································································································································································································································································
导入表数据
第一种方法:
链接远程:mysql -uroot -p

mysql> use test;

mysql> source /home/test/database.sql

第二种方法: 注意导入是mysql,导出是mysqldump。
格式:mysql -h[ip] -P[(大写)端口] -u[用户名] -p[密码] [数据库名] < (路径).sql

5、从库mysqldump导出数据

mysqldump -uroot -proot --single-transaction --dump-slave=2 -A > all.sql
--dump-slave=2,会在导出的数据文件中有一个注释的主库binlog信息,会先执行stop slave;导完数据,再执行start slave;
不加这个会跟主从复制进程冲突,导致复制进程阻塞。
--dump-slave=1.是不注释的意思,一般注释掉,自己根据binlog信息创建主从复制。用于再创建一个从库

--single-transaction这个不太理解,加上没问题,没试过不加的

保证导出的一致性状态--single-transaction

该选项在导出数据之前提交一个BEGIN SQL语句,BEGIN 不会阻塞任何应用程序且能保证导出时数据库的一致性状态。它只适用于多版本存储引擎(它不显示加锁通过判断版本来对比数据),仅InnoDB。本选项和--lock-tables 选项是互斥的,因为LOCK TABLES 会使任何挂起的事务隐含提交。要想导出大表的话,应结合使用--quick 选项。
``
posted @ 2021-07-07 17:01  |是吴啊|  阅读(76)  评论(0编辑  收藏  举报