内容简介:本文主要介绍MariaDB单库与单表恢复的方法与实践,包括单库恢复的基本概念、单表恢复的基本概念、恢复方法的选择等内容。通过实际案例讲解单库与单表恢复的实施过程,帮助读者掌握单库与单表恢复的技能。风哥教程参考MariaDB官方文档Backup and Recovery、Single Database Recovery等相关内容。
Part01-基础概念与理论知识
1.1 单库恢复的基本概念
单库恢复是指只恢复数据库中的特定数据库,而不是整个实例。它适用于以下场景:
- 单个数据库损坏或数据丢失
- 需要恢复特定数据库的历史版本
- 测试环境需要复制生产环境的特定数据库
1.2 单表恢复的基本概念
单表恢复是指只恢复数据库中的特定表,而不是整个数据库。它适用于以下场景:
- 单个表损坏或数据丢失
- 误操作删除了表中的数据
- 需要恢复特定表的历史版本
1.3 恢复方法的选择
根据不同的场景和需求,选择合适的恢复方法:
- 使用mysqldump备份恢复:适合小型数据库和表
- 使用Mariabackup恢复:适合大型数据库和表
- 使用二进制日志恢复:适合恢复到特定时间点
- 使用表空间传输:适合大型表的快速恢复
更多视频教程www.fgedu.net.cn
Part02-生产环境规划与建议
2.1 单库与单表恢复规划
单库与单表恢复规划建议:
- 定期备份:每周进行一次全量备份,每天进行一次增量备份
- 备份策略:针对重要的数据库和表,单独进行备份
- 恢复测试:每月进行一次单库和单表恢复测试
- 文档化:将恢复流程文档化,便于后续参考
2.2 恢复工具选择
恢复工具选择建议:
- mysqldump:适合小型数据库和表的恢复
- Mariabackup:适合大型数据库和表的恢复
- mysqlbinlog:适合基于二进制日志的时间点恢复
- MyRocks/InnoDB表空间传输:适合大型表的快速恢复
2.3 恢复策略建议
恢复策略建议:
- 制定详细的恢复计划:包括恢复步骤、工具和责任人
- 测试恢复流程:定期测试单库和单表恢复流程,确保有效
- 监控恢复过程:实时监控恢复进度,及时发现和解决问题
- 准备应急方案:针对不同的故障场景准备应急方案
学习交流加群风哥微信: itpux-com
Part03-生产环境项目实施方案
3.1 单库恢复实施
更多学习教程公众号风哥教程itpux_com
# 使用mysqldump备份恢复单库
MariaDB [(none)]> # 备份单个数据库
mysqldump -u root -p fgedudb > /backup/fgedudb_backup_$(date +%Y%m%d).sql
# 恢复单个数据库
# 先删除损坏的数据库
DROP DATABASE IF EXISTS fgedudb;
CREATE DATABASE fgedudb;
# 恢复备份
mysql -u root -p fgedudb < /backup/fgedudb_backup_20230101.sql
# 使用Mariabackup恢复单库
# 全量备份
mariabackup –backup –target-dir=/backup/mariabackup/full –user=backup –password=backup_password
# 恢复单库
# 停止服务
systemctl stop mariadb
# 准备备份
mariabackup –prepare –target-dir=/backup/mariabackup/full
# 复制特定数据库的文件
cp -r /backup/mariabackup/full/fgedudb /mariadb/fgdata/
# 修复权限
chown -R mysql:mysql /mariadb/fgdata/fgedudb
# 启动服务
systemctl start mariadb
MariaDB [(none)]> # 备份单个数据库
mysqldump -u root -p fgedudb > /backup/fgedudb_backup_$(date +%Y%m%d).sql
# 恢复单个数据库
# 先删除损坏的数据库
DROP DATABASE IF EXISTS fgedudb;
CREATE DATABASE fgedudb;
# 恢复备份
mysql -u root -p fgedudb < /backup/fgedudb_backup_20230101.sql
# 使用Mariabackup恢复单库
# 全量备份
mariabackup –backup –target-dir=/backup/mariabackup/full –user=backup –password=backup_password
# 恢复单库
# 停止服务
systemctl stop mariadb
# 准备备份
mariabackup –prepare –target-dir=/backup/mariabackup/full
# 复制特定数据库的文件
cp -r /backup/mariabackup/full/fgedudb /mariadb/fgdata/
# 修复权限
chown -R mysql:mysql /mariadb/fgdata/fgedudb
# 启动服务
systemctl start mariadb
3.2 单表恢复实施
# 使用mysqldump备份恢复单表
MariaDB [(none)]> # 备份单个表
mysqldump -u root -p fgedudb fgedu_users > /backup/fgedu_users_backup_$(date +%Y%m%d).sql
# 恢复单个表
# 先删除损坏的表
DROP TABLE IF EXISTS fgedudb.fgedu_users;
# 恢复备份
mysql -u root -p fgedudb < /backup/fgedu_users_backup_20230101.sql
# 使用二进制日志恢复单表
# 查看二进制日志内容,找到误操作的位置
mysqlbinlog –verbose /mariadb/app/data/binlog.000001 | grep -A 10 -B 10 “DELETE FROM fgedu_users”
# 应用二进制日志到误操作之前的位置
mysqlbinlog –start-position=12345 –stop-position=67890 /mariadb/app/data/binlog.000001 | mysql -u root -p fgedudb
# 使用表空间传输恢复单表
# 导出表空间
ALTER TABLE fgedudb.fgedu_users DISCARD TABLESPACE;
# 复制表空间文件
cp /backup/tablespaces/fgedu_users.ibd /mariadb/fgdata/fgedudb/
# 导入表空间
ALTER TABLE fgedudb.fgedu_users IMPORT TABLESPACE;
MariaDB [(none)]> # 备份单个表
mysqldump -u root -p fgedudb fgedu_users > /backup/fgedu_users_backup_$(date +%Y%m%d).sql
# 恢复单个表
# 先删除损坏的表
DROP TABLE IF EXISTS fgedudb.fgedu_users;
# 恢复备份
mysql -u root -p fgedudb < /backup/fgedu_users_backup_20230101.sql
# 使用二进制日志恢复单表
# 查看二进制日志内容,找到误操作的位置
mysqlbinlog –verbose /mariadb/app/data/binlog.000001 | grep -A 10 -B 10 “DELETE FROM fgedu_users”
# 应用二进制日志到误操作之前的位置
mysqlbinlog –start-position=12345 –stop-position=67890 /mariadb/app/data/binlog.000001 | mysql -u root -p fgedudb
# 使用表空间传输恢复单表
# 导出表空间
ALTER TABLE fgedudb.fgedu_users DISCARD TABLESPACE;
# 复制表空间文件
cp /backup/tablespaces/fgedu_users.ibd /mariadb/fgdata/fgedudb/
# 导入表空间
ALTER TABLE fgedudb.fgedu_users IMPORT TABLESPACE;
3.3 恢复验证
# 验证单库恢复
MariaDB [(none)]> SHOW DATABASES;
+——————–+
| Database |
+——————–+
| information_schema |
| fgedudb |
| mysql |
+——————–+
# 验证单表恢复
SHOW TABLES IN fgedudb;
+——————-+
| Tables_in_fgedudb |
+——————-+
| fgedu_users |
| fgedu_articles |
+——————-+
# 验证数据完整性
SELECT COUNT(*) FROM fgedudb.fgedu_users;
+———-+
| COUNT(*) |
+———-+
| 1000 |
+———-+
MariaDB [(none)]> SHOW DATABASES;
+——————–+
| Database |
+——————–+
| information_schema |
| fgedudb |
| mysql |
+——————–+
# 验证单表恢复
SHOW TABLES IN fgedudb;
+——————-+
| Tables_in_fgedudb |
+——————-+
| fgedu_users |
| fgedu_articles |
+——————-+
# 验证数据完整性
SELECT COUNT(*) FROM fgedudb.fgedu_users;
+———-+
| COUNT(*) |
+———-+
| 1000 |
+———-+
学习交流加群风哥QQ113257174
Part04-生产案例与实战讲解
4.1 单库恢复案例
场景描述:fgedudb数据库损坏,需要从备份中恢复。
# 备份单个数据库
MariaDB [(none)]> mysqldump -u root -p fgedudb > /backup/fgedudb_backup_20230101.sql
# 模拟数据库损坏
DROP DATABASE fgedudb;
# 恢复数据库
CREATE DATABASE fgedudb;
mysql -u root -p fgedudb < /backup/fgedudb_backup_20230101.sql
# 验证恢复结果
SHOW DATABASES;
+——————–+
| Database |
+——————–+
| information_schema |
| fgedudb |
| mysql |
+——————–+
SELECT COUNT(*) FROM fgedudb.fgedu_users;
+———-+
| COUNT(*) |
+———-+
| 1000 |
+———-+
MariaDB [(none)]> mysqldump -u root -p fgedudb > /backup/fgedudb_backup_20230101.sql
# 模拟数据库损坏
DROP DATABASE fgedudb;
# 恢复数据库
CREATE DATABASE fgedudb;
mysql -u root -p fgedudb < /backup/fgedudb_backup_20230101.sql
# 验证恢复结果
SHOW DATABASES;
+——————–+
| Database |
+——————–+
| information_schema |
| fgedudb |
| mysql |
+——————–+
SELECT COUNT(*) FROM fgedudb.fgedu_users;
+———-+
| COUNT(*) |
+———-+
| 1000 |
+———-+
执行结果:
# 备份单个数据库
mysqldump: [Warning] Using a password on the command line interface can be insecure.
# 模拟数据库损坏
Query OK, 2 rows affected (0.00 sec)
# 恢复数据库
Query OK, 1 row affected (0.00 sec)
# 验证恢复结果
+——————–+
| Database |
+——————–+
| information_schema |
| fgedudb |
| mysql |
+——————–+
+———-+
| COUNT(*) |
+———-+
| 1000 |
+———-+
mysqldump: [Warning] Using a password on the command line interface can be insecure.
# 模拟数据库损坏
Query OK, 2 rows affected (0.00 sec)
# 恢复数据库
Query OK, 1 row affected (0.00 sec)
# 验证恢复结果
+——————–+
| Database |
+——————–+
| information_schema |
| fgedudb |
| mysql |
+——————–+
+———-+
| COUNT(*) |
+———-+
| 1000 |
+———-+
4.2 单表恢复案例
场景描述:fgedu_users表被误删除,需要从备份中恢复。
# 备份单个表
MariaDB [(none)]> mysqldump -u root -p fgedudb fgedu_users > /backup/fgedu_users_backup_20230101.sql
# 模拟表被删除
DROP TABLE fgedudb.fgedu_users;
# 恢复表
mysql -u root -p fgedudb < /backup/fgedu_users_backup_20230101.sql
# 验证恢复结果
SHOW TABLES IN fgedudb;
+——————-+
| Tables_in_fgedudb |
+——————-+
| fgedu_users |
| fgedu_articles |
+——————-+
SELECT COUNT(*) FROM fgedudb.fgedu_users;
+———-+
| COUNT(*) |
+———-+
| 1000 |
+———-+
MariaDB [(none)]> mysqldump -u root -p fgedudb fgedu_users > /backup/fgedu_users_backup_20230101.sql
# 模拟表被删除
DROP TABLE fgedudb.fgedu_users;
# 恢复表
mysql -u root -p fgedudb < /backup/fgedu_users_backup_20230101.sql
# 验证恢复结果
SHOW TABLES IN fgedudb;
+——————-+
| Tables_in_fgedudb |
+——————-+
| fgedu_users |
| fgedu_articles |
+——————-+
SELECT COUNT(*) FROM fgedudb.fgedu_users;
+———-+
| COUNT(*) |
+———-+
| 1000 |
+———-+
执行结果:
# 备份单个表
mysqldump: [Warning] Using a password on the command line interface can be insecure.
# 模拟表被删除
Query OK, 0 rows affected (0.00 sec)
# 恢复表
# 验证恢复结果
+——————-+
| Tables_in_fgedudb |
+——————-+
| fgedu_users |
| fgedu_articles |
+——————-+
+———-+
| COUNT(*) |
+———-+
| 1000 |
+———-+
mysqldump: [Warning] Using a password on the command line interface can be insecure.
# 模拟表被删除
Query OK, 0 rows affected (0.00 sec)
# 恢复表
# 验证恢复结果
+——————-+
| Tables_in_fgedudb |
+——————-+
| fgedu_users |
| fgedu_articles |
+——————-+
+———-+
| COUNT(*) |
+———-+
| 1000 |
+———-+
4.3 误操作恢复案例
场景描述:误删除了fgedu_users表中的数据,需要恢复。
# 查看二进制日志文件
MariaDB [(none)]> SHOW BINARY LOGS;
+—————+———–+
| Log_name | File_size |
+—————+———–+
| binlog.000001 | 1073741824 |
+—————+———–+
# 查看二进制日志内容,找到误操作的位置
mysqlbinlog –verbose /mariadb/app/data/binlog.000001 | grep -A 10 -B 10 “DELETE FROM fgedu_users”
# 找到误操作的位置:12345-67890
# 创建临时表保存恢复的数据
CREATE TABLE fgedudb.fgedu_users_temp LIKE fgedudb.fgedu_users;
# 应用二进制日志到临时表
mysqlbinlog –start-position=12345 –stop-position=67890 /mariadb/app/data/binlog.000001 | mysql -u root -p fgedudb
# 将临时表的数据导入原表
INSERT INTO fgedudb.fgedu_users SELECT * FROM fgedudb.fgedu_users_temp;
# 删除临时表
DROP TABLE fgedudb.fgedu_users_temp;
# 验证恢复结果
SELECT COUNT(*) FROM fgedudb.fgedu_users;
+———-+
| COUNT(*) |
+———-+
| 1000 |
+———-+
MariaDB [(none)]> SHOW BINARY LOGS;
+—————+———–+
| Log_name | File_size |
+—————+———–+
| binlog.000001 | 1073741824 |
+—————+———–+
# 查看二进制日志内容,找到误操作的位置
mysqlbinlog –verbose /mariadb/app/data/binlog.000001 | grep -A 10 -B 10 “DELETE FROM fgedu_users”
# 找到误操作的位置:12345-67890
# 创建临时表保存恢复的数据
CREATE TABLE fgedudb.fgedu_users_temp LIKE fgedudb.fgedu_users;
# 应用二进制日志到临时表
mysqlbinlog –start-position=12345 –stop-position=67890 /mariadb/app/data/binlog.000001 | mysql -u root -p fgedudb
# 将临时表的数据导入原表
INSERT INTO fgedudb.fgedu_users SELECT * FROM fgedudb.fgedu_users_temp;
# 删除临时表
DROP TABLE fgedudb.fgedu_users_temp;
# 验证恢复结果
SELECT COUNT(*) FROM fgedudb.fgedu_users;
+———-+
| COUNT(*) |
+———-+
| 1000 |
+———-+
执行结果:
+—————+———–+
| Log_name | File_size |
+—————+———–+
| binlog.000001 | 1073741824 |
+—————+———–+
# 找到误操作的位置
#130101 10:00:00 server id 1 end_log_pos 67890 Query thread_id=123 exec_time=0 error_code=0
SET TIMESTAMP=1357017600/*!*/;
DELETE FROM fgedu_users WHERE id = 1;
/*!*/;
Query OK, 1 row affected (0.00 sec)
Query OK, 1 row affected (0.00 sec)
Query OK, 1 row affected (0.00 sec)
+———-+
| COUNT(*) |
+———-+
| 1000 |
+———-+
| Log_name | File_size |
+—————+———–+
| binlog.000001 | 1073741824 |
+—————+———–+
# 找到误操作的位置
#130101 10:00:00 server id 1 end_log_pos 67890 Query thread_id=123 exec_time=0 error_code=0
SET TIMESTAMP=1357017600/*!*/;
DELETE FROM fgedu_users WHERE id = 1;
/*!*/;
Query OK, 1 row affected (0.00 sec)
Query OK, 1 row affected (0.00 sec)
Query OK, 1 row affected (0.00 sec)
+———-+
| COUNT(*) |
+———-+
| 1000 |
+———-+
风哥提示:安全开发是防止SQL注入的第一道防线
Part05-风哥经验总结与分享
5.1 单库与单表恢复最佳实践
风哥提示:在进行单库和单表恢复时,应根据数据库大小和表大小选择合适的恢复方法,确保恢复过程快速有效。
- 定期备份:针对重要的数据库和表,单独进行备份
- 选择合适的恢复方法:根据数据库和表的大小选择合适的恢复方法
- 测试恢复流程:定期测试单库和单表恢复流程,确保有效
- 监控恢复过程:实时监控恢复进度,及时发现和解决问题
- 文档化:将恢复流程文档化,便于后续参考
5.2 恢复工具使用技巧
- mysqldump:适合小型数据库和表,使用–single-transaction参数确保一致性
- Mariabackup:适合大型数据库,支持热备份和增量备份
- mysqlbinlog:适合基于二进制日志的时间点恢复,使用–start-position和–stop-position参数
- 表空间传输:适合大型表的快速恢复,使用ALTER TABLE … IMPORT TABLESPACE命令
5.3 常见问题与解决方案
- 恢复时间过长:使用表空间传输或并行恢复,减少恢复时间
- 恢复失败:检查备份文件是否完整,确保数据库版本兼容
- 数据不一致:使用–single-transaction参数确保备份一致性
- 存储空间不足:清理临时文件,释放存储空间
- 权限问题:确保恢复用户有足够的权限
# 单表恢复脚本示例
#!/bin/bash
# single_table_recovery.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: `http://www.fgedu.net.cn`
# 配置
BACKUP_DIR=”/backup”
DATABASE=”fgedudb”
TABLE=”fgedu_users”
DATE=$(date +%Y%m%d)
USER=”root”
PASSWORD=”password”
LOG_FILE=”$BACKUP_DIR/recovery.log”
# 记录开始时间
echo “Single table recovery started at $(date)” >> $LOG_FILE
# 备份当前表结构(如果需要)
mysqldump -u $USER -p$PASSWORD $DATABASE $TABLE –no-data > $BACKUP_DIR/${TABLE}_structure.sql
echo “Table structure backed up” >> $LOG_FILE
# 删除损坏的表
mysql -u $USER -p$PASSWORD -e “DROP TABLE IF EXISTS $DATABASE.$TABLE;
”
echo “Damaged table dropped” >> $LOG_FILE
# 恢复表
mysql -u $USER -p$PASSWORD $DATABASE < $BACKUP_DIR/${TABLE}_backup_$DATE.sql
echo “Table restored” >> $LOG_FILE
# 验证恢复结果
COUNT=$(mysql -u $USER -p$PASSWORD -e “SELECT COUNT(*) FROM $DATABASE.$TABLE;
” | tail -1)
echo “Table count: $COUNT” >> $LOG_FILE
# 记录结束时间
echo “Single table recovery finished at $(date)” >> $LOG_FILE
echo “———————————-” >> $LOG_FILE
#!/bin/bash
# single_table_recovery.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: `http://www.fgedu.net.cn`
# 配置
BACKUP_DIR=”/backup”
DATABASE=”fgedudb”
TABLE=”fgedu_users”
DATE=$(date +%Y%m%d)
USER=”root”
PASSWORD=”password”
LOG_FILE=”$BACKUP_DIR/recovery.log”
# 记录开始时间
echo “Single table recovery started at $(date)” >> $LOG_FILE
# 备份当前表结构(如果需要)
mysqldump -u $USER -p$PASSWORD $DATABASE $TABLE –no-data > $BACKUP_DIR/${TABLE}_structure.sql
echo “Table structure backed up” >> $LOG_FILE
# 删除损坏的表
mysql -u $USER -p$PASSWORD -e “DROP TABLE IF EXISTS $DATABASE.$TABLE;
”
echo “Damaged table dropped” >> $LOG_FILE
# 恢复表
mysql -u $USER -p$PASSWORD $DATABASE < $BACKUP_DIR/${TABLE}_backup_$DATE.sql
echo “Table restored” >> $LOG_FILE
# 验证恢复结果
COUNT=$(mysql -u $USER -p$PASSWORD -e “SELECT COUNT(*) FROM $DATABASE.$TABLE;
” | tail -1)
echo “Table count: $COUNT” >> $LOG_FILE
# 记录结束时间
echo “Single table recovery finished at $(date)” >> $LOG_FILE
echo “———————————-” >> $LOG_FILE
通过以上措施,可以有效实现MariaDB的单库与单表恢复,确保数据安全和系统稳定。
from MariaDB视频:www.itpux.com
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
