MySQL数据备份与恢复全攻略
一、数据备份与恢复
按照备份方式分类:物理备份,直接复制数据库的物理文件,可以直接拷贝和恢复;逻辑备份,通过SQL语句导出数据库结构和数据,可用于不同版本和不同类型的MySQL数据库之间的数据迁移。
按照数据库服务状态分类:冷备份,在备份时停止数据库服务,将整个数据库复制到备份设备中;热备份,在备份的时候数据库依旧运行。
二、备份策略
完全备份策略:每次备份都完整复制整个数据库的所有数据。
增量备份策略:只备份自上次备份后发生变化的数据。
差异备份策略:备份自上次完全备份后所有变化的数据。
1.完全备份与恢复
(1)物理备份与恢复
备份操作示例:
cp -r /var/lib/mysql /bakdir/mysql.bak #拷贝数据库目录
tar -zcf /bakdir/mysql.tar.gz ./* #打包压缩数据源文件
恢复操作示例:
tar -xf /root/mysql.tar.gz -C /var/lib/mysql/ #释放压缩包
chown -R mysql:mysql /var/lib/mysql #修改所有者和组用户
(2)逻辑备份与恢复
完全备份语法:
mysqldump -uroot -p密码 库名 > /目录/xxx.sql
完全恢复语法:
mysql -uroot -p密码 库名 < /目录/xxx.sql
(3)备份缺点
物理备份跨平台型差,备份时间长、浪费存储空间。
mysqldump备份效率较低、备份和还原速度慢、会锁表,在备份过程中,数据插入和更新操作被阻塞。
2.增量备份与恢复
PERCONA Xtrabackup是一款强大的在线热备份工具,备份过程中不锁库表,适合生产环境。支持完全备份与恢复、增量备份与恢复、差异备份与恢复。
(1)增量备份
首次全备份
xtrabackup --host=ip --user=root --password=密码 --backup --target-dir=备份目录 --datadir=数据库目录
增量备份
xtrabackup --host=ip --user=root --password=密码 --backup --target-dir=备份目录 --incremental-basedir=参考目录 --datadir=数据库目录
(2)增量恢复
准备恢复数据
xtrabackup --prepare --apply-log-only --target-dir=/opt/fullbak
合并数据
xtrabackup --prepare --apply-log-only --target-dir=/opt/fullbak --incremental-dir=新数据目录名
清空数据库目录
rm -rf /var/lib/mysql/*
拷贝数据
xtrabackup --copy-back --target-dir=/fullbak
修改数据库目录所有者/组用户为mysql
chown -R mysql:mysql /var/lib/mysql
重启数据库服务
systemctl restart mysqld
3.差异备份与恢复
(1)差异备份
首次全备份
xtrabackup --host=ip --user=root --password=密码 --backup --target-dir=备份目录 --datadir=数据库目录
增量备份
xtrabackup --host=ip --user=root --password=密码 --backup --target-dir=备份目录 --incremental-basedir=参考目录 --datadir=数据库目录
(2)差异恢复
准备恢复数据
xtrabackup --prepare --apply-log-only --target-dir=/opt/fullbak
合并数据
xtrabackup --prepare --apply-log-only --target-dir=/opt/fullbak --incremental-dir=最后一次差异备份
拷贝数据
xtrabackup --copy-back --target-dir=/fullbak
三、Binlog日志管理
Binlog日志记录了所有对数据库的修改操作,但不包含select和show这类只读查询。其主要功能包括:实现主从复制,从库通过读取主库的binlog完成数据同步;支持数据恢复,可根据binlog将数据库恢复到指定时间点的状态。
查看正在使用的binlog日志文件
show master status; #查看日志文件
自定义日志目录和日志名
#vim /etc/my.cnf.d/mysql-server.cnf
[mysqld]
log-bin=/mylog/mysqllog #定义日志目录和日志文件名
查看已有的日志文件
show binary logs;
查看日志文件内容
show binlog events in 日志文件;
日志字段说明:
- Log_name: 日志文件名
- Pos: 命令在日志文件中的起始位置
- Event_type: 事件类型(如 Query、Table_map、Write_rows 等)
- Server_id: 服务器 ID
- End_log_pos: 命令在文件中的结束位置(单位:字节)
- Info: 执行的命令详细信息
删除日志文件名之前的所有日志文件
purge master logs to 日志文件;
删除所有日志文件,并重新创建日志文件
reset master;
执行日志恢复数据
mysqlbinlog 日志文件 | mysql -u 用户名 -p 密码