数据备份/恢复
- 参考MySQL的数据备份与恢复
mysqldump
是一款 mysql 逻辑备份的工具(备份文件为SQL文件,CLOB字段需要设置参数转为二进制),它将数据库里面的对象(表)导出作为 SQL 脚本文件- 对于导出几个 G 的数据库,还是不错的;一旦数据量达到几十上百 G,无论是对原库的压力还是导出的性能都存在问题 ^1
- 支持基于innodb的热备份(加参数
--single-transaction
);对myisam存储引擎的表,需加--lock-all-tables
锁,防止数据写入 - Mysqldump完全备份+二进制日志可以实现基于时间点的恢复。恢复的时候可关闭二进制日志,缩短恢复时间
XtraBackup
是由 percona 开源的免费数据库热备份软件,它能对 InnoDB 数据库和 XtraDB 存储引擎的数据库非阻塞地备份。对于较大数据的数据库可以选择Percona-XtraBackup
备份工具,可进行全量、增量、单表备份和还原,percona早起提供的工具是 innobackupex- xtrabackup:支持innodb存储引擎表,xtradb存储引擎表。支持innodb的物理热备份,支持完全备份,增量备份,而且速度非常快
- innobackupex:支持innodb存储引擎表、xtradb存储引擎表、myisam存储引擎表
- xtrabackup:支持innodb存储引擎表,xtradb存储引擎表。支持innodb的物理热备份,支持完全备份,增量备份,而且速度非常快
mariadb10.3.x
及以上的版本用 Percona XtraBackup 工具会有问题,此时可以使用mariabackup
,它是 MariaDB 提供的一个开源工具
Mysql相关语法
as和like复制表结构和数据
1 | -- like创建出来的新表包含源表的完整表结构和索引信息 |
复制数据
1 | -- 复制旧表的数据到新表(假设两个表结构一样) |
delete/truncate/drop
- delete
- 执行数据较慢,较多删除可进行批量删除(单也不能太大)
- 会记录事务日志,可进行回滚
- 不会减少表或索引所占用的空间
- truncate
- 执行速度快,会删除表所有数据,但表结构不会影响
- 不会记录日志,删除行是不能恢复的,并且在删除的过程中不会激活与表有关的删除触发器
- 这个表和索引所占用的空间会恢复到初始大小
- drop
- 会直接删除表结构。且会删除constrain/trigger/index,依赖于该表的存储过程/函数将被保留,但其状态会变为invalid
- 将表所占用的空间全释放掉
- 其他异同
- truncate 只能对table;delete可以是table和view
- delete语句为DML;truncate、drop是DLL
- delete 删除数据时,其实对应的数据行并不是真正的删除,仅仅是将其标记成可复用的状态,所以表空间不会变小。可以重建表的方式,快速将delete数据后的表变小(optimize table 或alter table)
rename
1 | -- mysql中对大表进行rename的操作很快,rename命令会直接修改底层的.frm文件,常用于数据备份和恢复 |
XtraBackup
- XtraBackup(PXB) 工具是 Percona 公司用 perl 语言开发的一个用于 MySQL 数据库物理热备的备份工具,支持 MySQl(Oracle)、Percona Server 和 MariaDB,并且全部开源
- 阿里的 RDS MySQL 物理备份就是基于这个工具做的
- 由于是采取物理拷贝的方式来做的备份,所以速度非常快,几十G数据几分钟就搞定了
- 而它巧妙的利用了mysql 特性做到了在线热备份,不用像以前做物理备份那样必须关闭数据库才行,直接在线就能完成整库或者是部分库的全量备份和增量备份
- 其中最主要的命令是 innobackupex 和 xtrabackup
- 前者是一个 perl 脚本,后者是 C/C++ 编译的二进制。Percona 在2.3 版本用C重写了 innobackupex,innobackupex 功能全部集成到 xtrabackup 里面,只有一个 binary,另外为了使用上的兼容考虑,innobackupex 作为 xtrabackup 的一个软链接
- 更多参考:https://www.cnblogs.com/piperck/p/9757068.html
- 数据迁移案例
1 | ## 安装(新老服务器均需安装) |
导出导入
- 参数说明:https://www.cnblogs.com/qq78292959/p/3637135.html
- 使用
mysqldump/source
方法进行导出导入- 15 分钟导出 1.6 亿条记录,导出的文件中平均 7070 条记录拼成一个 insert 语句
- 通过 source 进行批量插入,导入 1.6 亿条数据耗时将近 5 小时,平均速度 3200W 条/h(网测)
- 导出数据
1 | # 默认导出表结构和数据。回车后输入密码,text 格式数据也能被导出;测试样例:36M 数据导出耗时 15s |
- 导入数据
1 | # 直接 CMD 命令行导入 |
linux脚本备份(mysqldump)
- 备份 mysql 和删除备份文件脚本
backup-mysql.sh
(加可执行权限先进行测试)
1 | db_user="root" |
- 说明
- 删除一分钟之前的备份
find $backup_dir -name $db_name"*.sql.gz" -type f -mmin +1 -exec rm -rf {} \; > /dev/null 2>&1
-type f
表示查找普通类型的文件,f 表示普通文件,可不写-mtime +7
按照文件的更改时间来查找文件,+7表示文件更改时间距现在7天以前;如果是-mmin +7表示文件更改时间距现在7分钟以前-exec rm {} ;
表示执行一段shell命令,exec选项后面跟随着所要执行的命令或脚本,然后是一对{ },一个空格和一个\,最后是一个分号;
- 删除一分钟之前的备份
- 将上述脚本加入到
crond
定时任务中sudo crontab -e
编辑定时任务,加入00 02 * * * /home/smalle/script/backup-mysql.sh
systemctl restart crond
重启 crond 服务
主从同步
- 从库
change master to master_host=’127.0.0.1’, master_port=3306, master_user=’rep’, master_password=’Hello1234!’, master_log_file=’shipbill-log-bin.000001’, master_log_pos=154;
show slave status \G;
stop slave;
start slave;
flashback闪回
- binlog2sq:https://github.com/danfengcao/binlog2sql
- 参考 https://www.cnblogs.com/waynechou/p/mysql_flashback_intro.html
案例
历史数据归档
1 | -- 说明 |
参考文章