mysqldump是一款MySQL自带的逻辑备份工具。

数据量级100G,大约 30 - 45 min可以进行备份完成。

注意:使用逻辑备份进行数据恢复时,会先删除原先的库表,重建新表后再逻辑插入

1、备份核心参数

mkdir -p /backup/mysql
mysqldump -uathos -p123qwe -h 192.168.0.11 -R -E --triggers --master-data=2 --single-transaction -A > /backup/mysql/mysqldump.sql

【连接参数】
-u          			# 指定连接MySQL服务端的用户名
-p          			# 指定连接MySQL服务端的用户名所对应的密码
-h          			# 指定连接MySQL服务端的主机地址
-P          			# 指定连接MySQL服务端的端口
-S          			# 指定连接MySQL服务端的本地套接字文件

【备份参数】
-A                      # 备份所有库
-B 库1 [库2 库3 ...]		# 备份1个或多个库(加-B 会在备份文件中写入建库语句)
库1                     # 备份单库(不加-B,备份文件中不会写入建库语句,等同表级别备份)
库1 表1 [表2 表3 ...]    # 备份某个库下的1张表或多张表
-R                      # 备份存储过程和函数
-E                      # 备份事件
--triggers              # 备份触发器
-F                      # 每备份一个库,刷新一个binlog【缺点:生成大量的binlog,生产环境很少用】
--no-data               # 只备份表结构

【高级参数】
--master-data:
功能1:在备份时自动记录备份开始时刻binlog的file和position。该参数有三个值可选:
- 0     # 默认值,什么都不记录
- 1     # 会将"CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000002',MASTER_LOG_POS=753"写入到备份文件中
- 2     # 会将"-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000002',MASTER_LOG_POS=753;" 以注释格式写入到备份文件中。
功能2:自动加全局锁表(FTWRL),在数据备份完成之后,自动释放锁
功能3:但是搭配参数--single-transaction,对于InnoDB,则不会锁表而进行热备

--single-transaction:
功能:此参数只针对InnoDB的表有效,会创建一致性快照(MVCC)进行备份。

--set-gtid-purged:
该参数决定是否要在备份文件中加入GTID信息:SET @@GLOBAL.GTID_PURGED=...; 表示该备份中已有数据
- auto      # 默认值,等同开启      
- on        # 在备份文件中加入此GTID信息
- off       # 不在备份文件中加入此GTID信息  

情况1:仅用于本机备份数据,可加可不加
情况2:使用备份数据构建主从、恢复到其他机器,必须开启。会在备份中加入信息 Set gtid_next....,确保在主从复制环境中的数据一致性,
这样从库恢复数据后,就知道本地的binlog中有GTID信息。利用GTID的幂等性,从库知道从下一个号开始请求复制。

--max_allowed_packet:
- 128M      # 从服务器导出数据时,数据包的大小超过了这个预设阈值,就会报错,建议设置为128M。

2、恢复数据

# 1、恢复数据时的SQL语句,不再记录到binlog
set sql_log_bin=0;  

# 2、恢复数据
mysql -uroot -p密码 库名 < /backup/bak.sql
或者
mysql> source /backup/bak.sql;  

# 3、开启binlog
set sql_log_bin=1;

3、扩展

可以从mysqldump的数据全备中,截取我们所需的数据:

从mysqldump全备中截取单库的备份

sed -n '/^-- Current Database: `库名`/,/^-- Current Database: `/p' 全备文件.sql > xxx.sql

从mysqldump全备中截取所有insert语句

grep -i 'INSERT INTO `表名`' 全备文件.sql > xxx.sql &

从mysqldump全备中获取某表结构

sed -e'/./{H;$!d;}' -e 'x;/CREATE TABLE `表名`/!d;q' 全备文件.sql > xxx.sql

拼接语句:备份每个库下的每张表的数据

# mysqldump逻辑备份单库单表的命令
mysqldump -uathos -p123qwe -h 192.168.0.11 -R -E --triggers --master-data=2 --single-transaction -A > /backup/mysql/mysqldump.sql

# 准备备份目录
mkdir -p /backup/mysql
chown -R mysql.mysql /backup/mysql/

# 修改配置文件
[mysqld]
secure-file-priv=/backup/mysql

# 使用拼接语句,为每个库下的每张表生成对应的单独备份命令
SELECT CONCAT(
    "mysqldump -uathos -p123qwe -h 192.168.0.11 --master-data=2 --single-transaction -R -E --triggers ",
    table_schema, " ", table_name,
    " > /backup/mysql/", table_schema, "_", table_name, ".sql"
) AS backup_command
FROM information_schema.tables
WHERE table_schema NOT IN ('sys', 'information_schema', 'performance_schema')
into outfile '/backup/mysql/back_db_table.sh';