MySQL高效备份实战指南
高级使用案例
案例1:增量备份
首先进行完整备份:
xtrabackup --backup --target-dir=/backups/full --user=root --password=yourpassword
进行第一次增量备份:
xtrabackup --backup --target-dir=/backups/inc1 --incremental-basedir=/backups/full --user=root --password=yourpassword
进行第二次增量备份:
xtrabackup --backup --target-dir=/backups/inc2 --incremental-basedir=/backups/inc1 --user=root --password=yourpassword
准备完整备份:
xtrabackup --prepare --apply-log-only --target-dir=/backups/full
应用第一个增量备份:
xtrabackup --prepare --apply-log-only --target-dir=/backups/full --incremental-dir=/backups/inc1
应用第二个增量备份:
xtrabackup --prepare --target-dir=/backups/full --incremental-dir=/backups/inc2
案例2:压缩备份
xtrabackup --backup --compress --target-dir=/backups/compressed --user=root --password=yourpassword
解压并准备备份:
xtrabackup --decompress --target-dir=/backups/compressed xtrabackup --prepare --target-dir=/backups/compressed
案例3:并行备份和恢复
xtrabackup --backup --parallel=4 --target-dir=/backups/parallel --user=root --password=yourpassword
并行压缩:
xtrabackup --backup --compress --compress-threads=4 --parallel=4 --target-dir=/backups/parallel_compressed --user=root --password=yourpassword
案例4:加密备份
生成加密密钥:
openssl rand -base64 24 > /backups/encryption_key
创建加密备份:
xtrabackup --backup --target-dir=/backups/encrypted --encrypt=AES256 --encrypt-key-file=/backups/encryption_key --user=root --password=yourpassword
解密备份:
xtrabackup --decrypt=AES256 --encrypt-key-file=/backups/encryption_key --target-dir=/backups/encrypted
案例5:流式备份
备份到单个压缩文件:
xtrabackup --backup --stream=xbstream --user=root --password=yourpassword | gzip > /backups/backup.xbstream.gz
从流式备份恢复:
gunzip -c /backups/backup.xbstream.gz | xbstream -x -C /var/lib/mysql
xtrabackup --prepare --target-dir=/var/lib/mysql
常用选项说明
选项 | 描述 |
---|---|
--backup | 执行备份操作 |
--prepare | 准备备份以进行恢复 |
--copy-back | 将备份复制回原始位置 |
--target-dir | 指定备份目标目录 |
--user | MySQL 用户名 |
--password | MySQL 密码 |
--host | MySQL 主机地址 |
--port | MySQL 端口 |
--parallel | 并行线程数 |
--compress | 启用压缩 |
--compress-threads | 压缩线程数 |
--encrypt | 加密算法 |
--encrypt-key-file | 加密密钥文件 |
--incremental-basedir | 增量备份的基础目录 |
--incremental-dir | 增量备份目录 |
--stream | 流式备份格式 (xbstream) |
注意事项
确保有足够的磁盘空间存放备份文件
备份期间数据库负载可能会增加
恢复前确保 MySQL 服务已停止
恢复后可能需要调整文件权限
定期测试备份的可用性
最佳实践
定期进行完整备份和增量备份
备份文件存储在不同于数据库服务器的位置
实施备份验证流程
记录备份和恢复过程
监控备份作业的状态和持续时间
通过以上指南,您可以充分利用 XtraBackup 8.0.35-33 的强大功能来保护您的 MySQL 数据。
MyDumper 详细使用指南
MyDumper 是一个高性能的 MySQL 逻辑备份工具,相比传统的 mysqldump 具有并行备份、快照一致性等优势。以下是 MyDumper 的详细使用方式和案例。
安装 MyDumper
Ubuntu/Debian 系统
sudo apt-get install mydumper
CentOS/RHEL 系统
sudo yum install mydumper
从源码编译
git clone https://github.com/mydumper/mydumper.git cd mydumper mkdir build cd build cmake .. make make install
基本使用
1. 完整备份数据库
mydumper -u [username] -p [password] -h [host] -P [port] -o /backup/directory
2. 恢复数据库
myloader -u [username] -p [password] -h [host] -P [port] -d /backup/directory
常用参数说明
参数 | 描述 | 示例 |
---|---|---|
-u | 用户名 | -u root |
-p | 密码 | -p secret |
-h | 主机地址 | -h 127.0.0.1 |
-P | 端口号 | -P 3306 |
-o | 输出目录 | -o /backups |
-d | 恢复时指定备份目录 | -d /backups |
-B | 指定备份的数据库 | -B db1,db2 |
-T | 指定备份的表 | -T db1.table1 |
-t | 线程数 | -t 8 |
-c | 压缩输出 | -c |
-v | 详细输出 | -v 3 |
-C | 压缩备份文件 | -C |
-e | 备份表结构 | -e |
-r | 分割表的行数 | -r 100000 |
-F | 按大小分割备份文件(MB) | -F 256 |
-s | 一致性快照 | -s |
使用案例
案例1:备份单个数据库
mydumper -u root -p password -h localhost -B mydatabase -o /backups/mydatabase
案例2:备份多个特定表
mydumper -u root -p password -h localhost -T db1.table1,db1.table2 -o /backups/tables
案例3:多线程备份(8个线程)
mydumper -u root -p password -h localhost -t 8 -o /backups/full
案例4:压缩备份
mydumper -u root -p password -h localhost -c -o /backups/compressed
案例5:按100万行分割表数据
mydumper -u root -p password -h localhost -r 1000000 -o /backups/split
案例6:备份数据库结构(不备份数据)
mydumper -u root -p password -h localhost -e -o /backups/schema
案例7:恢复数据库到不同名称
myloader -u root -p password -h localhost -d /backups/full -B new_db_name
案例8:只恢复特定表
myloader -u root -p password -h localhost -d /backups/full -T db1.table1
高级功能
1. 一致性快照备份
mydumper -u root -p password -h localhost -s -o /backups/snapshot
2. 正则表达式过滤表
mydumper -u root -p password -h localhost -x '^sakila\.(actor|film)' -o /backups/regex
3. 备份时排除某些表
mydumper -u root -p password -h localhost -B sakila -X '^sakila\.film_text' -o /backups/exclude
4. 长查询超时设置
mydumper -u root -p password -h localhost --long-query-retries=10 --long-query-retry-interval=30 -o /backups/timeout
5. 只备份数据不备份结构
mydumper -u root -p password -h localhost --no-schemas -o /backups/data_only
实际应用场景
场景1:生产环境每日备份
# 备份脚本
#!/bin/bash
DATE=$(date +%Y%m%d)
BACKUP_DIR="/backups/mysql/$DATE"
LOG_FILE="/var/log/mydumper_${DATE}.log"mydumper -u backup_user -p backup_pass -h 10.0.0.1 -P 3306 -t 4 -c -v 3 -o $BACKUP_DIR > $LOG_FILE 2>&1# 保留7天备份
find /backups/mysql/ -type d -mtime +7 -exec rm -rf {} \;
场景2:大数据表部分恢复
# 只恢复用户表的前100万条数据
myloader -u root -p password -h localhost -d /backups/full -T db.users --rows=1000000
场景3:跨服务器迁移数据库
# 源服务器
mydumper -u root -p password -h source_host -B db_to_migrate -c -o /tmp/db_backup# 目标服务器
myloader -u root -p password -h target_host -d /tmp/db_backup
注意事项
确保备份用户有足够的权限(至少需要 SELECT, RELOAD, LOCK TABLES, REPLICATION CLIENT 权限)
大数据库备份时考虑磁盘空间
备份期间可能会对生产数据库性能产生影响
恢复前最好在测试环境验证备份文件
考虑使用--no-locks选项减少锁表时间(但可能影响一致性)
性能优化建议
根据服务器CPU核心数设置适当的线程数(-t)
对大表使用-r参数分割备份文件
使用-c或-C参数压缩备份减少存储空间
考虑使用--no-locks选项减少锁表时间(如果允许不一致)
对于InnoDB表,使用-s参数获取一致性快照
通过合理配置MyDumper,您可以高效地完成MySQL数据库的备份和恢复工作,满足各种业务场景的需求。
mysqlhotcopy 使用指南
mysqlhotcopy 是 MySQL 提供的一个 Perl 脚本工具,用于快速备份 MyISAM 和 ARCHIVE 表。它通过直接复制数据库文件来实现快速备份,比逻辑备份工具如 mysqldump 更快,但只适用于特定存储引擎。
安装与准备
mysqlhotcopy 通常随 MySQL 客户端一起安装,位于 MySQL 的 bin 目录下。
检查是否安装
which mysqlhotcopy
确保依赖安装(Perl 模块)
sudo apt-get install perl-dbi perl-dbd-mysql # Debian/Ubuntu sudo yum install perl-DBI perl-DBD-Mysql # CentOS/RHEL
基本语法
mysqlhotcopy [options] db_name [/path/to/backup/directory]
常用选项
选项 | 描述 |
---|---|
--user= | MySQL 用户名 |
--password= | MySQL 密码 |
--host= | MySQL 主机 |
--port= | MySQL 端口 |
--socket= | MySQL socket 文件 |
--regexp= | 使用正则表达式匹配数据库 |
--allowold | 不覆盖现有备份,添加 _old 后缀 |
--keepold | 不删除被覆盖的备份 |
--noindices | 不备份索引文件 |
--method= | 复制方法 (cp 或 scp) |
--flushlog | 备份后刷新日志 |
--resetmaster | 备份后重置二进制日志 |
--resetslave | 备份后重置从库信息 |
--addtodest | 添加而不是替换目标目录 |
--dryrun | 模拟执行,不实际复制 |
使用案例
案例1:备份单个数据库
mysqlhotcopy --user=root --password=yourpassword mydatabase /backup/mysql
案例2:备份多个数据库
mysqlhotcopy --user=root --password=yourpassword db1 db2 db3 /backup/mysql
案例3:使用正则表达式备份匹配的数据库
mysqlhotcopy --user=root --password=yourpassword --regexp='^test_' /backup/mysql
案例4:保留旧备份
mysqlhotcopy --user=root --password=yourpassword --allowold --keepold mydatabase /backup/mysql
案例5:远程备份到其他服务器
mysqlhotcopy --user=root --password=yourpassword --method=scp mydatabase user@remotehost:/remote/backup/dir
案例6:不备份索引文件
mysqlhotcopy --user=root --password=yourpassword --noindices mydatabase /backup/mysql
案例7:备份后刷新日志
mysqlhotcopy --user=root --password=yourpassword --flushlog mydatabase /backup/mysql
案例8:模拟运行(不实际备份)
mysqlhotcopy --user=root --password=yourpassword --dryrun mydatabase /backup/mysql
实际应用场景
场景1:生产环境每日备份脚本
#!/bin/bash
DATE=$(date +%Y%m%d)
BACKUP_DIR="/backup/mysql/$DATE"
LOG_FILE="/var/log/mysqlhotcopy_${DATE}.log"# 确保备份目录存在
mkdir -p $BACKUP_DIR# 备份所有数据库
mysqlhotcopy --user=backup_user --password=backup_pass \--allowold --keepold \--flushlog \--regexp='.*' \$BACKUP_DIR > $LOG_FILE 2>&1# 删除7天前的备份
find /backup/mysql/ -type d -mtime +7 -exec rm -rf {} \;
场景2:备份特定表
# 备份 mydatabase 中的 table1 和 table2
mysqlhotcopy --user=root --password=yourpassword \
mydatabase.table1 mydatabase.table2 \
/backup/mysql
场景3:增量备份策略
#!/bin/bash
DATE=$(date +%Y%m%d)
FULL_BACKUP_DIR="/backup/mysql/full"
INC_BACKUP_DIR="/backup/mysql/inc_$DATE"# 每周日做完整备份
if [ $(date +%u) -eq 7 ]; thenmysqlhotcopy --user=backup_user --password=backup_pass \--allowold --keepold \--flushlog \--regexp='.*' \$FULL_BACKUP_DIR
else# 其他日子做增量备份mysqlhotcopy --user=backup_user --password=backup_pass \--addtodest \--regexp='.*' \$INC_BACKUP_DIR
fi
恢复数据库
mysqlhotcopy 的恢复是通过直接复制文件回原始位置实现的:
停止 MySQL 服务
systemctl stop mysql
复制备份文件到 MySQL 数据目录
cp -R /backup/mysql/mydatabase /var/lib/mysql/
确保文件权限正确
chown -R mysql:mysql /var/lib/mysql/mydatabase
启动 MySQL 服务
systemctl start mysql
注意事项
存储引擎限制:mysqlhotcopy 只适用于 MyISAM 和 ARCHIVE 表,不适用于 InnoDB
锁表:mysqlhotcopy 在备份期间会锁定表,可能导致应用程序短暂阻塞
备份一致性:对于正在写入的表,备份可能不一致
权限要求:
执行用户需要有读取数据库文件的权限
MySQL 用户需要 SELECT、RELOAD、LOCK TABLES 权限
备份完整性:备份后建议验证备份文件的完整性
版本兼容性:确保备份和恢复使用相同版本的 MySQL
性能优化建议
在低峰期执行备份操作
对于大型数据库,考虑分批备份
使用
--noindices
选项可以加快备份速度(但恢复时需要重建索引)考虑使用
--method=scp
直接备份到远程服务器,减少本地磁盘IO对于频繁更新的表,考虑结合 FLUSH TABLES 命令确保数据一致性
替代方案
由于 mysqlhotcopy 的局限性,现代 MySQL 环境通常使用以下替代方案:
对于 InnoDB 表:使用 Percona XtraBackup
逻辑备份:使用 mysqldump 或 mydumper
文件系统快照:LVM 快照或存储设备快照功能
mysqlhotcopy 最适合用于 MyISAM 表的快速备份场景,特别是当数据库大小适中且可以接受短暂锁表的情况下。