概念
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

明确指定数据库: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 语句。