重要性:
误区:
binlog
的备份)mysqldump mydumper xtrabackup
mysqldump
是一个逻辑备份工具, 复制原始的数据库对象定义和表数据产生一组可执行的SQL
语句。 默认情况下, 生成 insert
语句,也能生成其它分隔符的输出或XML
格式的文件。
mysqldump
命令创建 SQL
格式的转储文件来备份数据库。mysqldump -uroot -p -S /tmp/mysql3308.sock --master-data=2 --single-transaction -A > dbname_$port_`date +%Y%m%d`.sql`
mysqldump --master-data=2,--single-transaction db_name > dbname_$port_`date +%Y%m%d`.sql
mysqldump db_name tb_name >db_name_$port_tb_name`date +%Y%m%d`.sql
mysql db_name < db_name_$port_`date +%Y%m%d`.sql
注意事项
需要一致性的话加上两个参数
--master-data=2 --single-transaction
select id, col1 from zst01.tb1 where id < 1000 into outfile /tmp/zst01_tb1.sql’;
update zst01.tb1 set col1='abc' where id < 1000;
cat zst01_tb1.sql |awk '{print "update zst01.tb1 set col1 ="$2", where id="$1";"}' >roll_zst01_tb1.sql
mysql zst01 <roll_zst01_tb1.sql
MySQL
备份恢复的形式mysqldump & mydumper
mydumper 在 MySQL 5.7 中对 JSON 格式的数据备份不太友好
xtrabackup
mysql binary log
优点是数据可还原到任一时间点
mysqldump 5.7版本,--master-data=2 single-transaction
对非事务表的备份是不安全的。要获得非事务表的一致性快照需加上选项--lock-tables
,该选项会对业务产生一定的影响(备份期间锁住所有表,无法写入数据),而--master-data=2 single-transaction
选项对业务的影响很小(1s左右)
--single-transaction
在一个单独的事务中通过创建所有表的一致性快照来备份所有表,只对存储引擎支持多版本读(当前仅
InnoDB
支持)的表有效;此备份不能够保证其他存储引擎表中数据的一致性,当一个--single-transaction
备份正在运行时,需确保备份是有效的(正确的表数据和日志位置),没有其他连接使用以下语句:ALTER TABLE, DROP TABLE, RENAME TABLE,TRUNCATE TABLE
,因为一致性快照与此相互关联。选项--lock-tables
自动关闭
--master-data=2
该选项会将二进制日志文件名和位置追加到转储文件中。若
--master-data=1
,将以CHANGE MASTER
命令的形式输出,若--master-data=2
,该命令将会被注释掉。除非同时指定选项--single-transaction
,否则--master-data
选项将导致选项--lock-all-tables
默认打开,无论在哪种情况下,备份时肯定会更新日志。选项--lock-tables
自动关闭。
mysqldump
备份过程mysqldump
备份通过SQL
与数据库交互,最终产生一个备份,因此可在开启 general log
后,执行备份命令,查看 general log
可观察整个备份过程
general log
set global general_log = 1;
#time mysqldump --single-transaction --master-data=2 -A -uroot -p -S /tmp/mysql3306.sock > /data/backup_mysql/db_$port_`date +%Y%m%d_%H%M%S`.sql
mysqldump
备份原理示意图
time | command(session 1) |
---|---|
t0 | flush tables |
t1 | FTWRL |
t2 | set session ios_lation rr |
t3 | start trx |
t4 | show master status |
t5 | get gtid |
t6 | unlock tables |
t7 | savepoint sp |
t8 | rollback to savepoint sp |
t9 | unlock tables |
general log
日志记录
# flush tables 操作关闭所有已打开的表,强制关闭所有正在使用的表,并刷新 prepare 语句缓存
# 该操作可以防止 mysqldump 时实例上没有发生以下几种情况: a. 表结构修改操作 b. 大事务 c. 较长时间的 select 查询。即有这些操作时,flsuh tables 会被阻塞,从而阻止备份数据
1.flush tables;
# FTWRL 关闭所有已经打开的表,并使用全局读锁来锁住所有数据库中的所有表,从而使实例处于只读状态,无法写入
2.flush tables with read lock;
#设置会话隔离级别为 RR,防止幻读、不可重复读
3.set session transaction isolation level repeatable read
#开启一致性快照事务
4.start transaction /*!40100 with consistent snapshot*/
#若是 GTID 环境,
5.SHOW VARIABLES LIKE 'gtid\_mode'
#获取当前已执行的 GTID
5.select @@global.gtid_executed
#获取 binlog 文件名及相关位置
6.show master status;
#释放 FTWRL LOCK, 释放后事务仍旧继续
7.unlock tables;
8.show databases;
9.show create database if not exists 'dbname';
#事务保存点,备份每张表的起始时间都是从同一个事务点开始的
10.savepoint sp;
11.show create table 'tb_xx';
12.select /!40100 $QL_NO_CACHE*/ * from tb_xx;
13.rollback to savepoint sp;
14....
15.rollback to savepoint sp;
16.RELEASE SAVEPOINT sp;
#断开连接,原事务自动停止
17.quit
mysqldump
的缺点:
第一种方式
mysqldump --single-transaction --master-data=2 -A -uroot -p -S /tmp/mysql3306.sock > /data/backup_mysql/$dbname_$port_`date +%Y%m%d_%H%M%S`.sql
第二种方式
mysqldump --single-transaction --master-data=2 -A -uroot -p -S /tmp/mysql3306.sock |gzip > /data/backup_mysql/$dbname_$port_`date +%Y%m%d_%H%M%S`.sql
推荐
pigz
或者 zstd
替换 gzip
mydumper
替换 mysqldump
答:4点时数据。准确时间应为实例加上 FTWRL LOCK
的时间 ,而该过程大约只花费 1s 左右的时间。
若表中有触发器,存储过程,那么在备份时需要注意什么?
mysqldump 的Tips
一般有触发器和存储过程时,建议将每个部分单独备份一份,备份时也要加上这两个参数--single-transaction --master-data=2
,减小对数据库的影响
- 表结构
- 数据
- 存储过程
- 触发器
- event
--triggers
Dump triggers for each dumped table. (Defaults to on; use --skip-triggers to disable.)
-d --no-data
No row information
mysqldump -d --triggers=false
-t --no-create-info
Don’t write table creation info.
-n, --no-create-db
Suppress the CREATE DATABASE … IF EXISTS statement that normally is output for each dumped database if --all-databases or --databases is given.
-R, --routines
Dump stored routines (functions and procedures).
-E, --events
Dump events.
-B, --databases
Dump several databases. Note the difference in usage; in this case no tables are given. All name arguments are regarded as database names. ‘USE db_name;’ will be included in the output.
--tables
Overrides option --databases (-B).
-w --where=name
Dump only selected records. Quotes are mandatory.
应用案例:快速测试对一个上百G
的库作字符集转码可能造成的影响
mysqldump --where="1=1 limit 1000" db1 >db1_1000.sql
相当于
Select * from tb where 1=1 limit 1OOO;
mysqldump 是单线程进行数据库备份的工具,在数据量比较大时,备份速度下降十分严重,mydumper 支持并行备份,从而提高备份速度,缩小备份耗费时间。
参考文章
MySQL 多线程备份工具 Mydumper详解
项目地址
特性:
mydumper
备份原理示意图
time | master_thread | worker_thread |
---|---|---|
t1 | flush tables | |
t2 | FTWRL | |
t3 | set session ios_lation rr | |
t4 | get gtid | |
t5 | show master status | |
t6 | set session ios_lation rr | |
t7 | start trx | |
t8 | unlock tables |
FLUSH TABLES WITH READ LOCK
,施加全局只读锁,以阻止DML
语句写入,保证数据的一致性metadata
文件中,以供即使点恢复使用START TRANSACTION WITH CONSISTENT SNAPSHOT
;幵启读一致的事务dump non-InnoDB tables
,首先导出非事务引擎表UNLOCK TABLES
,非事务引擎表备份完后,释放全局只读锁 ;dump InnoDB tables
,基于事务导出 InnoDB
表mysqldump
文件中提取其中一个单表sed
(该方法速度十分缓慢)sed -n -e '/CREATE TABLE.*'tb_name'/,/UNLOCK TABLES/p' db_bak.sql> tb_nane.sql
t1.sql, t2.sql...
如何实现使用 mydumper
备份数据
思路:
使用权限,给某用户只授权该表的权限,使用参数-f
忽略报错导入数据
假设要恢复的表为 db1.t2
tb_recovery
数据库, 用来存放要恢复的单表create database tb_recovery;
'user_tb_recovery'@'%'
,并只对其赋予 tb_recovery.t2
表的所有权限create user 'user_tb_recovery'@'%' identified by 'user_tb_recovery';
grant all privileges on tb_recovery.t2 to 'user_tb_recovery'@'%';
flush privileges;
-f
选项导入备份文件mysql -f -uuser_tb_recovery -puser_tb_recovery -h db_host -P db_port tb_recovery </backup_path/db_backup.sql
db1.t2
还存在,则将其改名为db1.t2_bak
,待恢复确认无误后删除。rename table db1.t2 to db1.t2_bak;
tb_recovery.t2
移到 db1
库下rename table tb_recovery.t2 to db1.t2;
mysqldump
怎么拿到一致性备份mysqldump
只备份需要的数据--where="add_time >= xxx and add_time <= xxx"
mysqldump
原理获取及解读,讲解出来mydumper
下载编译一下,并行导出导入,动手做一下,知道 mydumper
原理获取及解读,讲解出来