备份恢复
mysqldump(逻辑)
-
说明
覆盖形式恢复的方法 单线程工作
-
参数
mysqldump -uroot -p -h 10.0.0.51 -P3306 链接数据库 -A 全备参数 -B db1 db2 db3 备份多个单库 -R 备份存储过程及函数 -E 备份事件 -F 在备份开始时,刷新一个新binlog日志 --master-data=2 以注释的形式,保存备份开始时间点的binlog的状态信息 不开启二进制日志无法用 --triggers 备份触发器 --single-transaction 对InnoDB表进行 热备, --set-gtid-purged=auto 加了--set-gtid-purged=OFF时,生成的sql文件会开启二进制日志 --max-allowed-packet=256M 太小会导致备份失败
-
备份命令
mysqldump -uroot -proot -A -R -E -F --master-data=2 --triggers --single-transaction --max-allowed-packet=500M > full.sql
恢复命令
mysqlbinlog --skip-gtids=true --include-gtids='5c351518-78ec-11e7-8e7a-005056a610c3:1297-3000' --exclude-gtids='排除那个GDIT号码' /data/binlog/mysql-bin.000004 mysqlbinlog --start-position=813 --stop-position=1384 -d oldboy /data/mysql/mysql-bin.000006 >/tmp/bin1.sql # 恢复数据时候-d 指定库
--skip-gtids=true 数据库有相同 GTID 信息跳过
mydumper(逻辑)
-
说明
因为是多线程逻辑备份,备份后会生成多个备份文件 支持多线程恢复 不要备份全库 ,还原有问题 不是官方备份工具
-
参数
-B, --database 要备份的数据库,不指定则备份所有库 -T, --tables-list 需要备份的表,名字用逗号隔开 -o, --outputdir 备份文件输出的目录 -c, --compress 压缩输出文件 -e, --build-empty-files 如果表数据是空,还是产生一个空文件 -x, --regex 是同正则表达式匹配 'db.table' -m, --no-schemas 不备份表结构 -t, --threads 开启的备份线程数,默认是4
-
准备工作
下载地址: https://github.com/maxbube/mydumper/releases/ wget https://github.com/mydumper/mydumper/releases/download/v0.11.3-5/mydumper-0.11.3-5.el7.x86_64.rpm 安装 yum install -y mydumper-0.11.3-5.el7.x86_64.rpm 安装客户端工具 vi /etc/my.cnf [client] socket=/tmp/mysql.sock 创建备份目录 mkdir -p /data/backup/
-
备份命令
备份text数据库 mydumper -u text -p 'text' -h 10.0.0.11 -P 3306 -B text -o /data/backup/ 还原text库 myloader -u text -p 'text' -h 10.0.0.11 -P 3306 -B text -d /data/backup/ 备份多张表(t1,t2): mydumper -u text -p 'text' -h 10.0.0.11 -P 3306 -B text -T t1,t2 -o /data/backup/ 还原多表 myloader -u text -p 'text' -h 10.0.0.11 -P 3306 -B text -o t1 -o t2 -d /data/backup/
-
备份文件说明
metadata 记录 二进制日志文件名 ,pos号 ,gtid号 ,备份完成时间 text-schema-create.sql 建库语句 text.t1.00000.sql t1表的数据 text.t1-metadata text.t1-schema.sql t1表 建表语句 text.t2-metadata text.t2-schema.sql t2表 建表语句
mysql shell(逻辑)
-
说明
官方文档 https://dev.mysql.com/doc/mysql-shell/8.0/en/mysql-shell-utilities-load-dump.html 多线程逻辑备份 官方备份工具
-
安装软件
下载 https://dev.mysql.com/downloads/shell/ tar xf mysql-shell-8.0.24-linux-glibc2.12-x86-64bit.tar.gz mv mysql-shell-8.0.24-linux-glibc2.12-x86-64bit myshell mv myshell /usr/bin/ vi /etc/profile export PATH=/usr/bin/myshell/bin:$PATH source /etc/profile
-
连接
方法一 mysqlsh -utext -ptext -h127.0.0.1 方法二 mysqlsh \connect root@localhost:3306 # 输入密码 \connect --mysqlx root@localhost:33060 \connect root@(/tmp/mysql.sock) 方法三 var s1 = mysql.getClassicSession('root@localhost:3306', 'root'); # 指定用户名root 密码root shell.setSession(s1);
-
模式切换
\sql 切换到 SQL \js 切换到 json \py 切换到 python 查看状态\s 查看所有线程 \show threads --foreground -o tid,ptid,cid,user,host,progname,command,memory 查看tid为218的线程做了啥 \show thread --tid 218 --general --client --locks
-
备份(登录后JS模式下执行)
准备 创建全备目录: mkdir -p /data/backup/ 登录: mysqlsh -utext -ptext -h127.0.0.1 全备: util.dumpInstance("/data/backup/full",{threads : 8,ocimds:true,compatibility:["strip_restricted_grants"],bytesPerChunk:"1M"}) 备份指定库 (text库和kxm库) util.dumpSchemas(["text","kxm"],'/data/backup/text',{threads:8,bytesPerChunk:"10M"}) 指定表备份dumpTables() util.dumpTables("text",["t2","t1"],"/data/backup/biao/",{threads:8,bytesPerChunk:"10M"})
-
还原
数据库设置 SET GLOBAL local_infile=1; 注意:还原库前要先把库删掉,否则会导致数据不一致 全备还原 util.loadDump("/data/backup/full",{threads:8,ignoreExistingObjects:true,analyzeTables:"on"}) 还原两个库 util.loadDump("/data/backup/text",{threads:8,ignoreExistingObjects:true,analyzeTables:"on"}) 还原单表 (表不能存在) util.loadDump("/data/backup/biao",{resetProgress:true,loadDdl:true})
-
说明
/data/backup/full 备份目录,需要为空 excludeSchemas:["test"] 排除那个库 analyzeTables:"on" 数据导入完成之后执行analyze table loadData:false 不导入数据 ddlOnly:true 只备份表结构 dryRun:true 测试运行 threads : 8 使用8个线程进行备份
Percona Xtrabackup(物理)
-
原理
xbk 执行瞬间 内存-刷入-磁盘 记录lsn 备份时 cp数据叶 + redo+undo(备份时产生的新数据)记录lsn恢复之前 手动 redo+undo回滚恢复 cp到数据目录下 0、xbk备份执行的瞬间,立即触发ckpt,已提交的数据脏页,从内存刷写到磁盘,并记录此时的LSN号 1、备份时,拷贝磁盘数据页,并且记录备份过程中产生的redo和undo一起拷贝走,也就是checkpoint LSN之后的日志 2、在恢复之前,模拟Innodb“自动故障恢复”的过程,将redo(前滚)与undo(回滚)进行应用 3、恢复过程是cp 备份到元数据目录下
-
安装
rpm包 7.0用 wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo yum -y install perl perl-devel libaio libaio-devel perl-Time-HiRes perl-DBD-MySQL libev wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.12/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.12-1.el7.x86_64.rpm yum -y install percona-xtrabackup-24-2.4.4-1.el7.x86_64.rpm 网址下载二进制包(打开即用) https://www.percona.com/downloads/Percona-XtraBackup-2.4/LATEST/ 7.0使用 https://www.percona.com/downloads/Percona-XtraBackup-LATEST/ 8.0以上使用 tar xf percona-xtrabackup***.tar.gz mv percona-xtrabackup*** xbk mv xbk /usr/bin/ vi /etc/profile export PATH=/usr/bin/xbk/bin/:$PATH source /etc/profile
-
全备
mkdir -p /data/backup/ xtrabackup --defaults-file=/etc/my.cnf --parallel=4 --user=root --password=root --host=localhost --port=3306 --backup --target-dir=/data/backup/full
-
全备还原
准备 xtrabackup --prepare --parallel=4 --target-dir=/data/backup/full 停数据库 pkill mysqld 清掉数据目录文件 rm -rf /data/3306/data/* 开始还原 xtrabackup --copy-back --target-dir=/data/backup/full # 加上 --datadir=/root/kxm 可以指定恢复到那个目录,不加恢复到数据库数据目录根据配置文件里写的路径走 修改权限 chown -R mysql.mysql /data/3306/data/ 启动数据库 systemctl start mysqld 清一下日志记录 reset master
-
增量备份
全量备份的目录为: mkdir -p /data/backup/full 增量备份的目录为: mkdir -p /data/backup/inc xtrabackup --defaults-file=/etc/my.cnf --user=root --password=root --port=3306 --host=localhost --backup --parallel=4 --target-dir=/data/backup/inc --incremental-basedir=/data/backup/full
-
增量还原
准备全备份的日志: xtrabackup --prepare --apply-log-only --parallel=4 --target-dir=/data/backup/full 准备增量备份的日志 xtrabackup --prepare --apply-log-only --parallel=4 --target-dir=/data/backup/full --incremental-dir=/data/backup/inc 再次整合全备 (如果有多个增量 用全备跟最后一个增量恢复就好了 ) xtrabackup --prepare --apply-log-only --target-dir=/data/backup/full 停数据库 pkill mysqld 清掉数据目录文件 rm -rf /data/3306/data/* 开始还原 xtrabackup --copy-back --parallel=4 --target-dir=/data/backup/full 修改权限 chown -R mysql.mysql /data/3306/data/ 启动数据库 systemctl start mysqld 清一下日志记录 reset master
Clone plugin(物理)
-
介绍
本地克隆: 本地重新生成一个新的数据目录 ,启动数据库用新的数据目录启动 远程克隆: 客户端数据库 去 服务端数据库 拉数据 ,覆盖客户端数据库
-
原理
开启redo archiving功能,从当前点开始存储新增的redo log,这样从当前 点开始所有的增量修改都不会丢失。 同时上一步在page track的page被发送 到目标端确保当前点之前所做的变更一定发送到目标端。 停止Redo Archiving", 所有归档的日志被发送到目标端,这些日志包含了从 page copy阶段开始到现在的所有日志,另外可能还需要记下当前的复制点, 例如最后一个事务提交时的binlog位点或者gtid信息,在系统页中可以找到。
-
限制
备份时候不能执行DDL语句 不能夸版本使用8.017-拷贝到8.18也不行 MySQL 8.0(8.0.17+)版本以上才能使用这个工具 只支持innodb引擎
-
准备阶段
加载插件 INSTALL PLUGIN clone SONAME 'mysql_clone.so'; 或者 vi /etc/my.cnf [mysqld] plugin-load-add=mysql_clone.so clone=FORCE_PLUS_PERMANENT 查看插件开没开 SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE 'clone'; 创建克隆专用用户(用root也可以) CREATE USER clone_user@'%' IDENTIFIED with mysql_native_password by 'password'; GRANT BACKUP_ADMIN ON *.* TO 'clone_user';
-
本地克隆 (本地保留一份数据目录)
mkdir -p /data/test/ chown -R mysql.mysql /data/test/ mysql -uclone_user -ppassword CLONE LOCAL DATA DIRECTORY = '/data/test/clonedir'; 观测状态(root用户) SELECT STAGE, STATE, END_TIME FROM performance_schema.clone_progress; 启动新实例 mysqld_safe --datadir=/data/test/clonedir --port=3306 --socket=/tmp/mysql.sock --user=mysql --mysqlx=OFF &
-
远程克隆 (直接把主库数据覆盖过来)
创建远程clone用户 服务端(12) create user test_s@'%' identified by '123'; grant backup_admin on *.* to test_s@'%'; 客户端 create user test_t@'%' identified by '123'; grant clone_admin on *.* to test_t@'%'; 客户端开始克隆(11) 允许克隆主库的数据 SET GLOBAL clone_valid_donor_list='10.0.0.51:3306'; 登录客户端 mysql -utest_t -p123 -h10.0.0.11 -P3306 开始克隆 CLONE INSTANCE FROM test_s@'10.0.0.12':3306 IDENTIFIED BY '123';
my2sql日志截取
-
基于pos号截取
mysqlbinlog --start-position=219 --stop-position=1347 /data/binlog/mysql-bin.000003 >/tmp/bin.sql
-
基于GTID号的截取
mysqlbinlog --skip-gtids --include-gtids='dff98809-55c3-11e9-a58b-000c2928f5dd:1-6'--exclude-gtids='dff98809-55c3-11e9-a58b-000c2928f5dd:4' /data/binlog/mysql-bin.000004
--include-gtids 截取日志 --exclude-gtids 排除那个日志 --skip-gtids 跳过GTID检查 实际上是把导出的sql文件中gtid信息删除了,避免相同的gtid不执行 如果用position号截取也要加--skip-gtids只要开了gtid就要加
-
过滤日志取得pos号
mysql> pager grep "DROP" # 定义过滤DROP字样 Delete show binlog events in 'mysql-bin.000009'; # 查询除了DROP的行其他的行都不显示 nopager # 取消
-
my2sql 解析二进制文件
下载
https://github.com/liuhr/my2sql
安装
chmod +x my2sql cp my2sql /usr/bin/
限制
使用回滚/闪回功能时,binlog格式必须为row,且binlog_row_image=full, DML统计以及大事务分析不受影响 只能回滚DML, 不能回滚DDL 支持指定-tl时区来解释binlog中time/datetime字段的内容。开始时间-start-datetime与结束时间-stop-datetime也会使用此指定的时区, 但注意此开始与结束时间针对的是binlog event header中保存的unix timestamp。结果中的额外的datetime时间信息都是binlog event header中的unix timestamp 此工具是伪装成从库拉取binlog,需要连接数据库的用户有SELECT, REPLICATION SLAVE, REPLICATION CLIENT权限 MySQL8.0版本需要在配置文件中加入default_authentication_plugin =mysql_native_password,用户密码认证必须是mysql_native_password才能解析
准备工作
创建使用用户
用户要有SELECT, REPLICATION SLAVE, REPLICATION CLIENT权限
create user text@"%" identified with mysql_native_password by 'text';
grant all on *.* to text1@"%";
创建指定目录
mkdir /tmp/kxm -p
查询数据库日志
show master status; 要查看哪个日志的记录就写哪个文件名
参数
-mode repl: 伪装成从库解析binlog文件,file: 离线解析binlog文件, 默认repl
-work-type 2sql:生成原始sql,rollback:生成回滚sql,stats:只统计DML、事务信息
-output-dir 将生成的结果存放到制定目录
-output-toScreen 将生成的结果打印到屏幕,默认写到文件
-threads 线程数,默认8个
-add-extraInfo 把position等信息以注释的方式加入生成的每条sql前,默认false
-big-trx-row-limit n 找出满足n条sql的事务,默认500条
-databases , -tables 库及表条件过滤, 以逗号分隔
-sql 要解析的sql类型,可选参数insert、update、delete,默认全部解析
-doNotAddPrifixDb 默认生成insert into db1.tb1 (x1, x1) values (y1, y1)类sql,也可以生成不带库名的sql
-file-per-table 为每个表生成一个sql文件
解析例子
解析出二进制文件[3,5)的全部sql
my2sql -user text -password text -host 10.0.0.11 -port 3306 -databases text -tables t1 -work-type 2sql --start-file mysql-bin.000003 --stop-file mysql-bin.000005 -output-dir /tmp/kxm -add-extraInfo
根据pos点解析出标准SQL -start-pos 2089 -stop-pos 2789
my2sql -user text -password text -host 10.0.0.11 -port 3306 -databases text -tables t1 -work-type 2sql --start-file mysql-bin.000003 --stop-file mysql-bin.000005 -start-pos 2089 -stop-pos 2789 -output-dir /tmp/kxm -add-extraInfo
根据时间点解析出标准SQL --start-datetime --stop-datetime
my2sql -user text -password text -host 10.0.0.11 -port 3306 -databases text -tables t1 -work-type 2sql --start-file mysql-bin.000003 --stop-file mysql-bin.000005 --start-datetime "2021-12-19 13:29:33" --stop-datetime "2021-12-19 13:29:44" -output-dir /tmp/kxm -add-extraInfo
解析出回滚SQL -work-type rollback
my2sql -user text -password text -host 10.0.0.11 -port 3306 -databases text -tables t1 -work-type rollback --start-file mysql-bin.000003 --stop-file mysql-bin.000005 -output-dir /tmp/kxm -add-extraInfo
统计DML以及大事务 -work-type stats -big-trx-row-limit 500 -long-trx-seconds 300
# 统计一个事务操作大于500行、时间大于300秒的事务
my2sql -user text -password text -host 10.0.0.11 -port 3306 -databases text -tables t1 -work-type stats -big-trx-row-limit 500 -long-trx-seconds 300 --start-file mysql-bin.000003 --stop-file mysql-bin.000005 -output-dir /tmp/kxm -add-extraInfo
从一个pos点开始持续输出到屏幕 -output-toScreen
my2sql -user text -password text -host 10.0.0.11 -port 3306 -databases text -tables t1 -work-type 2sql --start-file mysql-bin.000003 -output-toScreen
END
**