mysqldump备份数据库(mysqldump 备份 100G 数据库只花 6 分钟:一文说透导出与导入)

mysqldump备份数据库(mysqldump 备份 100G 数据库只花 6 分钟:一文说透导出与导入)
mysqldump 备份 100G 数据库只花 6 分钟:一文说透导出与导入

概念

mysqldump 是 MySQL 官方自带的逻辑备份工具。它把表数据“转成可执行的 SQL 文本”或“CSV/定长文本”输出,因此也叫逻辑导出。与之相对的是物理备份(xtrabackup、filesystem snapshot 等),后者直接拷贝 InnoDB 数据页。

mysqldump是一个客户端命令,只要安装mysql-client 就有,可以访问其他服务器的mysql。


导出

mysqldump -h $host -P $port -u $user -p -S $sock --add-locks=0 --single-transaction --set-gtid-purged=off databasename tablename --where="a>900" --result-file=/home/t.sql

参数说明:

--add-locks=0:禁用 LOCK TABLES 和 UNLOCK TABLES 语句的添加。默认为1,添加 LOCK TABLES 和 UNLOCK TABLES。

--all-databases:导出所有数据库。

--databases: db1 db2,指定要导出的数据库,生成的sql文件里包含 CREATE DATABASE 和 USE DATABASE语句。这个语句会确保在导入时,数据库会被创建(如果它不存在的话)。

--set-gtid-purged=OFF 生成的sql文件里没有GTID的配置。

--no-data:只导出数据库结构,不导出数据。

--no-create-info:只导出数据,不导出表结构。

--single-transaction:导出时不对表加表锁,而是使用 START TRANSACTION WITH CONSISTENT SNAPSHOT。

--complete-insert:使用完整的 INSERT 语句(包括列名)。

--extended-insert:使用扩展的 INSERT 语句(多行插入)。5.6后默认扩展insert,可以通过 --skip-extended-insert 去除扩展insert。

--quick:导出时直接将结果输出到输出文件,而不是先加载到内存中。5.6之后默认为此无需指定。

--routines:导出存储过程和函数。

--events:导出事件调度器的事件。

--result-file=/dump.sql :将输出保存到指定文件,而不是标准输出;它是mysqldump提供的一个参数,直接由mysqldump 处理,不依赖于 shell 的重定向功能。


A、指定输出文件也可以使用 > /dump.sql:标准的重定向操作符,用于将命令的输出重定向到文件中。它是由 shell(如 Bash)提供的功能,而不是 mysqldump 的内置参数。

B、--set-gtid-purged=OFF;如果MySQL是主从并且开启了GTID,那么在主库执行mysqldump导出sql时务必要添加 --set-gtid-purged=OFF,为什么? 因为不加的话导出的SQL文件中会有 SET @@SESSION.SQL_LOG_BIN=0 这行,就会导致往主库执行导入的时候不写binlog,没有binlog从库就无法同步了。如果加上这个参数生成的SQL文件里就只有 create、insert 这种命令,是一个干净的脚本,不涉及GTID这种信息,往哪里导都不会报错。


导入

mysql -u root -p -S /home/mysql-4307/mysqld.sock db2 < /var/lib/mysql/guard1.sql

mysql -u root -p -S /home/mysql-4307/mysqld.sock db2 -e "source /var/lib/mysql/guard1.sql"


注:-S
/home/mysql-4307/mysqld.sock 指定sock文件位置


两种方式, 各有什么优劣势???

总结:

简单直接:mysql -u root -p < /var/lib/mysql/guard1.sql

mysqldump备份数据库(mysqldump 备份 100G 数据库只花 6 分钟:一文说透导出与导入)

明确指定数据库:mysql -u root -p db2 -e "source /var/lib/mysql/guard1.sql"

自动化任务:mysql -u root -p -e "source /var/lib/mysql/guard1.sql"


需要说明的是,source 并不是一条 SQL 语句,而是一个客户端命令。mysql 客户端执行这个命令的流程是这样的:

1、打开文件,默认以分号为结尾读取一条条的 SQL 语句;

2、将 SQL 语句发送到服务端执行。

也就是说,服务端执行的并不是这个“source t.sql"语句,而是 INSERT 语句。所以,不论是在慢查询日志(slow log),还是在 binlog,记录的都是这些要被真正执行的 INSERT 语句。

文章版权声明:除非注明,否则均为边学边练网络文章,版权归原作者所有