MySQL的备份和恢复案例

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 当发生掉电或硬件故障,MySQL重新启动时会自动进行Crash Recovery,从日志文件中读取pending的信息,rollback uncommit同时把已经提交的交易flush到datafile,这些信息可以从MySQL的错误日志中看到,这里我用kill -9模拟宕机

Crash Recovery


当发生掉电或硬件故障,MySQL重新启动时会自动进行Crash Recovery,从日志文件中读取pending的信息,rollback uncommit同时把已经提交的交易flush到datafile,这些信息可以从MySQL的错误日志中看到,这里我用kill -9模拟宕机:

image.png


使用mysqldump进行 SQL-Format备份和恢复

全量备份:


shell> mysqldump --all-databases --master-data --single-transaction > backup_sunday_1_PM.sql

这里包含着备份时间点信息:


--
-- Position to start replication or point-in-time recovery from
--
CHANGE MASTER TO MASTER_LOG_FILE='master-binlog.000015', MASTER_LOG_POS=194;


我们可以在备份时进行日志切换


shell> mysqldump --single-transaction --flush-logs --master-data=2 \
         --all-databases > backup_sunday_1_PM.sql


这里包含这一个新的日志文件信息:


--
-- Position to start replication or point-in-time recovery from
--
-- CHANGE MASTER TO MASTER_LOG_FILE='master-binlog.000016', MASTER_LOG_POS=194;
--
-- Current Database: `data`
--


加上参数–delete-master-logs 可以在备份的同时把不需要的binlog删除。


恢复的时候使用


shell> mysql < backup_sunday_1_PM.sql


恢复完成后,数据的状态处于 Sunday 1 p.m,如果要将数据前滚使用类似下面的命令


shell> mysqlbinlog gbichot2-bin.000016 gbichot2-bin.000017 | mysql

用于升级测试可以只导出结构


shell> mysqldump --all-databases --no-data --routines --events > dump-defs.sql


使用mysqldump进行 Delimited-Text备份和恢复

备份至的目录受 参数–secure-file-priv的限制,可能会出现


mysqldump: Got error: 1290: The MySQL server is running with the --secure-file-priv option so it cannot execute this statement when executing 'SELECT INTO OUTFILE'


备份一个test数据库


root@scutech:~/test# mysqldump --tab=/var/lib/mysql-files/ test
root@scutech:~/test# ll /var/lib/mysql-files/
total 288
drwxrwx---  2 mysql mysql   4096 Jan 13 14:49 ./
drwxr-xr-x 65 root  root    4096 Dec 25 13:59 ../
-rw-r--r--  1 root  root    1336 Jan 13 14:49 a.sql
-rw-rw-rw-  1 mysql mysql     12 Jan 13 14:49 a.txt
-rw-r--r--  1 root  root    1395 Jan 13 14:49 person.sql
-rw-rw-rw-  1 mysql mysql 235718 Jan 13 14:49 person.txt
-rw-r--r--  1 root  root    1442 Jan 13 14:49 person_myisam.sql
-rw-rw-rw-  1 mysql mysql    153 Jan 13 14:49 person_myisam.txt
-rw-r--r--  1 root  root    1516 Jan 13 14:49 shirt.sql
-rw-rw-rw-  1 mysql mysql    110 Jan 13 14:49 shirt.txt
-rw-r--r--  1 root  root    1287 Jan 13 14:49 t1.sql
-rw-rw-rw-  1 mysql mysql      2 Jan 13 14:49 t1.txt
-rw-r--r--  1 root  root    1287 Jan 13 14:49 t2.sql
-rw-rw-rw-  1 mysql mysql      0 Jan 13 14:49 t2.txt
-rw-r--r--  1 root  root    1287 Jan 13 14:49 t3.sql
-rw-rw-rw-  1 mysql mysql      6 Jan 13 14:49 t3.txt



我们看到每个表备份了两个文件,一个建表的sql语句,一个数据文件。

恢复时使用:

root@scutech:~/test# mysql test < /var/lib/mysql-files/a.sql
oot@scutech:~/test# mysqlimport test /var/lib/mysql-files/a.txt
test.a: Records: 3  Deleted: 0  Skipped: 0  Warnings: 0


也可以在mysql客户端里面使用


mysql> use test
Database changed
mysql> load data infile 'a.txt' into table a;
ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
mysql> load data infile '/var/lib/mysql-files/a.txt' into table a;
Query OK, 3 rows affected (0.04 sec)
Records: 3  Deleted: 0  Skipped: 0  Warnings: 0


使用binlog进行时间点恢复

查看当期binlog的状态:



mysql> show binary logs;
+----------------------+-----------+
| Log_name             | File_size |
+----------------------+-----------+
| master-binlog.000001 |       573 |
| master-binlog.000002 |       217 |
| master-binlog.000003 |       217 |
| master-binlog.000004 |       217 |
| master-binlog.000005 |       654 |
| master-binlog.000006 |       217 |
| master-binlog.000007 |   9556015 |
| master-binlog.000008 |   3816423 |
| master-binlog.000009 | 136315184 |
| master-binlog.000010 |  48873328 |
| master-binlog.000011 |   3145957 |
| master-binlog.000012 |   1690153 |
| master-binlog.000013 |   1869349 |
| master-binlog.000014 |   1204862 |
| master-binlog.000015 |       245 |
| master-binlog.000016 |    461332 |
+----------------------+-----------+
16 rows in set (0.00 sec)
mysql> show master status
    -> ;
+----------------------+----------+--------------+------------------+-----------------------------------------------+
| File                 | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                             |
+----------------------+----------+--------------+------------------+-----------------------------------------------+
| master-binlog.000016 |   461332 |              |                  | 8e17f3ff-1b31-11ea-95c6-fa163e0ec694:1-489093 |
+----------------------+----------+--------------+------------------+-----------------------------------------------+
1 row in set (0.01 sec)



查询binlog中的内容


root@scutech:/var/lib/mysql# mysqlbinlog master-binlog.000016|head
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#200113 14:38:14 server id 135  end_log_pos 123 CRC32 0xc7ee4177  Start: binlog v 4, server v 5.7.28-log created 200113 14:38:14
# Warning: this binlog is either in use or was not closed properly.
BINLOG '
VhAcXg+HAAAAdwAAAHsAAAABAAQANS43LjI4LWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAEzgNAAgAEgAEBAQEEgAAXwAEGggAAAAICAgCAAAACgoKKioAEjQA
AXdB7sc=


导入使用


# mysqlbinlog --skip-gtids master-binlog.000016|mysql


恢复到指定时间点可以使用:


mysqlbinlog --stop-datetime="2020-01-13 18:16:52" master-binlog.000006|mysql


恢复到指定的 Event Positions

mysqlbinlog --stop-position=45883 master-binlog.000006 |tail -n 20
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
3月前
|
存储 关系型数据库 MySQL
mysql数据库备份与恢复
MySQL数据库的备份与恢复是确保数据安全性和业务连续性的关键操作。
109 4
|
2月前
|
分布式计算 关系型数据库 MySQL
大数据-88 Spark 集群 案例学习 Spark Scala 案例 SuperWordCount 计算结果数据写入MySQL
大数据-88 Spark 集群 案例学习 Spark Scala 案例 SuperWordCount 计算结果数据写入MySQL
54 3
|
2月前
|
SQL 关系型数据库 MySQL
案例剖析:MySQL唯一索引并发插入导致死锁!
案例剖析:MySQL唯一索引并发插入导致死锁!
171 0
案例剖析:MySQL唯一索引并发插入导致死锁!
|
2月前
|
SQL 关系型数据库 MySQL
案例剖析,MySQL共享锁引发的死锁问题!
案例剖析,MySQL共享锁引发的死锁问题!
|
2月前
|
消息中间件 关系型数据库 MySQL
大数据-117 - Flink DataStream Sink 案例:写出到MySQL、写出到Kafka
大数据-117 - Flink DataStream Sink 案例:写出到MySQL、写出到Kafka
181 0
|
9天前
|
关系型数据库 MySQL 数据库
数据库数据恢复—MYSQL数据库文件损坏的数据恢复案例
mysql数据库文件ibdata1、MYI、MYD损坏。 故障表现:1、数据库无法进行查询等操作;2、使用mysqlcheck和myisamchk无法修复数据库。
|
1月前
|
关系型数据库 MySQL Linux
Linux环境下MySQL数据库自动定时备份实践
数据库备份是确保数据安全的重要措施。在Linux环境下,实现MySQL数据库的自动定时备份可以通过多种方式完成。本文将介绍如何使用`cron`定时任务和`mysqldump`工具来实现MySQL数据库的每日自动备份。
82 3
|
1月前
|
监控 关系型数据库 MySQL
Linux环境下MySQL数据库自动定时备份策略
在Linux环境下,MySQL数据库的自动定时备份是确保数据安全和可靠性的重要措施。通过设置定时任务,我们可以每天自动执行数据库备份,从而减少人为错误和提高数据恢复的效率。本文将详细介绍如何在Linux下实现MySQL数据库的自动定时备份。
40 3
|
2月前
|
关系型数据库 MySQL 数据库
一个 MySQL 数据库死锁的案例和解决方案
本文介绍了一个 MySQL 数据库死锁的案例和解决方案。
136 3
|
2月前
|
存储 关系型数据库 MySQL
基于案例分析 MySQL 权限认证中的具体优先原则
【10月更文挑战第26天】本文通过具体案例分析了MySQL权限认证中的优先原则,包括全局权限、数据库级别权限和表级别权限的设置与优先级。全局权限优先于数据库级别权限,后者又优先于表级别权限。在权限冲突时,更严格的权限将被优先执行,确保数据库的安全性与资源合理分配。