MySQL数据库的备份与恢复

MySQL数据库的备份与恢复

1. 常用的备份方案

  • 全量备份,数据库内容全部备份
  • 增量备份,在全量备份的基础上把新增的数据备份
  • 差异备份,
备份方案特点
全量备份对某一段时间的所有数据进行完全拷贝,数据恢复快,备份时间长。
增量备份在第一次全量备份或者增量备份后,每次备份只需备份前一次相比增加。没有重复的备份数据,备份时间短,恢复数据时必须按照一定的顺序进行
差异备份备份上次完全备份后发生改变的所有文件数据,在进行第一次全备份后进行差异备份的这段时间内增加,修改文件的备份。进行恢复时,只需要对第一次全备和最后一次差异备份进行恢复

2. MySQL备份工具,mysqldump

mysqldump 选项 --all-databases 全备
mysqldump 选项 database [tables]
mysqldump 选项 --databases db1 [2][3]

选项:
-uusername    指定数据库用户名
-hhost        指定主机,IP地址
-ppassword    数据库用户密码
-P            数据库端口号

3. 进行全备,与恢复

1.全备
[root@129a ~]# mysqldump -uroot -prun123456 --all-databases > all-$(date '+%Y%m%d%H%M%S').sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
[root@129a ~]# ls
all-20220630170137.sql  anaconda-ks.cfg  passwd  test  web
[root@129a ~]# file all-20220630170137.sql
all-20220630170137.sql: UTF-8 Unicode text, with very long lines
[root@129a ~]# 

2.误删
mysql> drop database school;
  
3.恢复
[root@129a ~]# mysql -uroot -prun123456 < all-20220630170137.sql 
mysql: [Warning] Using a password on the command line interface can be insecure.
[root@129a ~]# 
mysql> show tables from school;
+------------------+
| Tables_in_school |
+------------------+
| tb_coursse       |
| tb_students_info |
+------------------+
2 rows in set (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| school             |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

mysql>   

4. 备份一张表,数据库

备份表
[root@129a ~]# mysqldump -uroot -prun123456 school tb_coursse > course.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
[root@129a ~]# ls
all-20220630170137.sql  anaconda-ks.cfg  course.sql  test  web
[root@129a ~]# 

备份数据库
[root@129a ~]# mysqldump -uroot -prun123456 school > school.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
[root@129a ~]# ls
all-20220630170137.sql  course.sql  test
anaconda-ks.cfg         school.sql  web
[root@129a ~]# 

5. 删除某张表,并且恢复

mysql> drop table tb_coursse;
Query OK, 0 rows affected (0.01 sec)

mysql> show tables;
+------------------+
| Tables_in_school |
+------------------+
| tb_students_info |
+------------------+
1 row in set (0.00 sec)

mysql> 

在数据库里面恢复
[root@129a ~]# ls
all-20220630170137.sql  course.sql  test
anaconda-ks.cfg         school.sql  web
[root@129a ~]# mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 11
Server version: 5.7.37 MySQL Community Server (GPL)

Copyright (c) 2000, 2022, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> use school;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> source course.sql;
Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.01 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected, 1 warning (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.10 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 6 rows affected (0.00 sec)
Records: 6  Duplicates: 0  Warnings: 0

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected, 1 warning (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

mysql> show tables;
+------------------+
| Tables_in_school |
+------------------+
| tb_coursse       |
| tb_students_info |
+------------------+
2 rows in set (0.01 sec)

mysql> select * from tb_coursse;
+----+-------------+
| id | course_name |
+----+-------------+
|  1 | java        |
|  2 | mysql       |
|  3 | python      |
|  4 | go          |
|  5 | c++         |
|  6 | html        |
+----+-------------+
6 rows in set (0.00 sec)

      
mysql> drop table tb_coursse;
Query OK, 0 rows affected (0.00 sec)

mysql> show tables;
+------------------+
| Tables_in_school |
+------------------+
| tb_students_info |
+------------------+
1 row in set (0.00 sec)

mysql> 
      
在数据库外边恢复
[root@129a ~]# mysql -uroot -prun123456 school < course.sql
mysql: [Warning] Using a password on the command line interface can be insecure.
[root@129a ~]# 

mysql> show tables;
+------------------+
| Tables_in_school |
+------------------+
| tb_coursse       |
| tb_students_info |
+------------------+
2 rows in set (0.00 sec)

mysql> select * from tb_coursse;
+----+-------------+
| id | course_name |
+----+-------------+
|  1 | java        |
|  2 | mysql       |
|  3 | python      |
|  4 | go          |
|  5 | c++         |
|  6 | html        |
+----+-------------+
6 rows in set (0.00 sec)

mysql>         

6. MySQL的二进制备份与恢复

6.1 开启MySQL的二进制日志功能
1.修改文件内容 /etc/my.cnf
[root@129a ~]# vim /etc/my.cnf 
[root@129a ~]# cat /etc/my.cnf 
[mysqld]
basedir = /usr/local/mysql
datadir = /opt/data
socket = /tmp/mysql.sock
port = 3306
pid-file = /opt/data/mysql.pid
user = mysql
skip-name-resolve
sql-mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

server-id = 10
log-bin = mysql_bin
[root@129a ~]#

2.查看内容
[root@129a ~]# cd /opt/data/
[root@129a data]# ls
129a.example.com.err  ib_logfile0         private_key.pem
auto.cnf              ib_logfile1         public_key.pem
ca-key.pem            ibdata1             school
ca.pem                ibtmp1              server-cert.pem
client-cert.pem       mysql               server-key.pem
client-key.pem        mysql.pid           sys
ib_buffer_pool        performance_schema
[root@129a data]# 

3.重启mysql
[root@129a ~]# systemctl restart mysqld
[root@129a ~]# cd /opt/data/
[root@129a data]# ls
129a.example.com.err  ib_logfile1         private_key.pem
auto.cnf              ibdata1             public_key.pem
ca-key.pem            ibtmp1              school
ca.pem                mysql               server-cert.pem
client-cert.pem       mysql.pid           server-key.pem
client-key.pem        mysql_bin.000001    sys
ib_buffer_pool        mysql_bin.index
ib_logfile0           performance_schema
[root@129a data]#
[root@129a data]# cat mysql_bin.index 
./mysql_bin.000001
[root@129a data]# 

mysql_bin.index //当前正在记录日志文件是哪个?
mysql_bin.000001
6.2 对数据库进行完全备份
  • –single-transaction 单独的事务
  • –flush-logs 刷新日志
  • –master-data=2 版本号
  • –all-databases 所有的数据库
  • –delete-master-logs 删除master的日志
--single-transaction  单独的事务
--flush-logs  刷新日志
--master-data=2 版本号
--all-databases 所有的数据库
--delete-master-logs 删除master的日志

[root@129a ~]# mysqldump -uroot -prun123456 --single-transaction --flush-logs --master-data=2 --all-databases --delete-master-logs > all-$(date '+%Y%m%d%H%M%S').sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
[root@129a ~]# ls
all-20220630170137.sql  anaconda-ks.cfg  school.sql  web
all-20220630175624.sql  course.sql       test
[root@129a ~]# cd /opt/data/
[root@129a data]# ls
129a.example.com.err  ib_logfile1         private_key.pem
auto.cnf              ibdata1             public_key.pem
ca-key.pem            ibtmp1              school
ca.pem                mysql               server-cert.pem
client-cert.pem       mysql.pid           server-key.pem
client-key.pem        mysql_bin.000002    sys
ib_buffer_pool        mysql_bin.index
ib_logfile0           performance_schema
[root@129a data]# 
  • 用vimdiff查看不同内容,使用qa!退出
6.3 新增数据,创建新表,修改数据,删除数据
1.新增数据
mysql> insert tb_coursse(course_name) values('linux'),('lishi');
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> select * from tb_coursse;
+----+-------------+
| id | course_name |
+----+-------------+
|  1 | java        |
|  2 | mysql       |
|  3 | python      |
|  4 | go          |
|  5 | c++         |
|  6 | html        |
|  7 | linux       |
|  8 | lishi       |
+----+-------------+
8 rows in set (0.00 sec)

mysql> 


2.创建新表
mysql> create table info(id int not null primary key auto_increment,name varchar(10));
Query OK, 0 rows affected (0.15 sec)

mysql> insert info(name) values('zhang'),('wang'),('li'),('ying');
Query OK, 4 rows affected (0.23 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> select * from info;
+----+-------+
| id | name  |
+----+-------+
|  1 | zhang |
|  2 | wang  |
|  3 | li    |
|  4 | ying  |
+----+-------+
4 rows in set (0.00 sec)

mysql> 

3.修改数据
mysql> update tb_students_info set height = 177 where name = 'green'; 
Query OK, 1 row affected (0.10 sec)
Rows matched: 1  Changed: 1  Warnings: 0

            
4.删除数据
mysql> delete from tb_students_info where name = 'lily';
Query OK, 1 row affected (0.13 sec)

mysql> select * from tb_students_info;
+----+--------+------+------+--------+-----------+
| id | name   | age  | sex  | height | course_id |
+----+--------+------+------+--------+-----------+
|  1 | danny  |   25 | M    |    160 |         1 |
|  2 | green  |   23 | M    |    177 |         2 |
|  3 | henry  |   23 | F    |    185 |         1 |
|  4 | jane   |   23 | M    |    162 |         3 |
|  5 | jim    |   22 | F    |    175 |         2 |
|  6 | john   |   21 | F    |    172 |         4 |
|  8 | susan  |   23 | M    |    170 |         5 |
|  9 | thomas |   22 | F    |    178 |         5 |
| 10 | tom    |   23 | F    |    165 |         5 |
| 11 | liming |   22 | M    |    180 |         7 |
+----+--------+------+------+--------+-----------+
10 rows in set (0.00 sec)

mysql>               
6.4 误删数据库
mysql> drop database school;
Query OK, 3 rows affected (0.07 sec)
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)

mysql> 
6.5 刷新创建新的二进制日志, mysqladmin -uroot -prun123456 flush-logs
  • 刷新二进制日志是为了产生新的日志文件,他人的数据内容会在新的日志文件中记录
[root@129a ~]# cd /opt/data/
[root@129a data]# ls
129a.example.com.err  ib_logfile0       mysql_bin.index
auto.cnf              ib_logfile1       performance_schema
ca-key.pem            ibdata1           private_key.pem
ca.pem                ibtmp1            public_key.pem
client-cert.pem       mysql             server-cert.pem
client-key.pem        mysql.pid         server-key.pem
ib_buffer_pool        mysql_bin.000002  sys
[root@129a data]#

刷新
[root@129a ~]# mysqladmin -uroot -prun123456 flush-logs
mysqladmin: [Warning] Using a password on the command line interface can be insecure.
[root@129a ~]# cd /opt/data/
[root@129a data]# ls
129a.example.com.err  ib_logfile1       performance_schema
auto.cnf              ibdata1           private_key.pem
ca-key.pem            ibtmp1            public_key.pem
ca.pem                mysql             server-cert.pem
client-cert.pem       mysql.pid         server-key.pem
client-key.pem        mysql_bin.000002  sys
ib_buffer_pool        mysql_bin.000003
ib_logfile0           mysql_bin.index
[root@129a data]# 
[root@129a data]# cat mysql_bin.index
./mysql_bin.000002
./mysql_bin.000003
[root@129a data]# 
6.6 恢复完全备份
[root@129a ~]# mysql -uroot -prun123456 < all-20220630175624.sql
mysql: [Warning] Using a password on the command line interface can be insecure.
[root@129a ~]# 

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| school             |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

mysql> use school;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show tables;
+------------------+
| Tables_in_school |
+------------------+
| tb_coursse       |
| tb_students_info |
+------------------+
2 rows in set (0.00 sec)

mysql> select * from tb_coursse;
+----+-------------+
| id | course_name |
+----+-------------+
|  1 | java        |
|  2 | mysql       |
|  3 | python      |
|  4 | go          |
|  5 | c++         |
|  6 | html        |
+----+-------------+
6 rows in set (0.00 sec)

mysql> 
6.7 检查误删数据在什么位置 show binlog events in 'mysql_bin.000002';
events 事件 pos开始位置 Event_type事件类型 End_log_pos 结束位置 
进入数据库,show binlog events in 'mysql_bin.000002';找到第二相同数值的第二个数值


mysql> show binlog events in 'mysql_bin.000002';
+------------------+------+----------------+-----------+-------------+----------------------------------------------------------------------------------------------+
| Log_name         | Pos  | Event_type     | Server_id | End_log_pos | Info                                                                                         |
+------------------+------+----------------+-----------+-------------+----------------------------------------------------------------------------------------------+
| mysql_bin.000002 |    4 | Format_desc    |        10 |         123 | Server ver: 5.7.37-log, Binlog ver: 4                                                        |
| mysql_bin.000002 |  123 | Previous_gtids |        10 |         154 |                                                                                              |
| mysql_bin.000002 |  154 | Anonymous_Gtid |        10 |         219 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'                                                         |
| mysql_bin.000002 |  219 | Query          |        10 |         375 | use `school`; create table info(id int not null primary key auto_increment,name varchar(10)) |
| mysql_bin.000002 |  375 | Anonymous_Gtid |        10 |         440 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'                                                         |
| mysql_bin.000002 |  440 | Query          |        10 |         514 | BEGIN                                                                                        |
| mysql_bin.000002 |  514 | Table_map      |        10 |         566 | table_id: 142 (school.info)                                                                  |
| mysql_bin.000002 |  566 | Write_rows     |        10 |         640 | table_id: 142 flags: STMT_END_F                                                              |
| mysql_bin.000002 |  640 | Xid            |        10 |         671 | COMMIT /* xid=484 */                                                                         |
| mysql_bin.000002 |  671 | Anonymous_Gtid |        10 |         736 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'                                                         |
| mysql_bin.000002 |  736 | Query          |        10 |         810 | BEGIN                                                                                        |
| mysql_bin.000002 |  810 | Table_map      |        10 |         868 | table_id: 140 (school.tb_coursse)                                                            |
| mysql_bin.000002 |  868 | Write_rows     |        10 |         925 | table_id: 140 flags: STMT_END_F                                                              |
| mysql_bin.000002 |  925 | Xid            |        10 |         956 | COMMIT /* xid=488 */                                                                         |
| mysql_bin.000002 |  956 | Anonymous_Gtid |        10 |        1021 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'                                                         |
| mysql_bin.000002 | 1021 | Query          |        10 |        1095 | BEGIN                                                                                        |
| mysql_bin.000002 | 1095 | Table_map      |        10 |        1165 | table_id: 141 (school.tb_students_info)                                                      |
| mysql_bin.000002 | 1165 | Update_rows    |        10 |        1245 | table_id: 141 flags: STMT_END_F                                                              |
| mysql_bin.000002 | 1245 | Xid            |        10 |        1276 | COMMIT /* xid=493 */                                                                         |
| mysql_bin.000002 | 1276 | Anonymous_Gtid |        10 |        1341 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'                                                         |
| mysql_bin.000002 | 1341 | Query          |        10 |        1415 | BEGIN                                                                                        |
| mysql_bin.000002 | 1415 | Table_map      |        10 |        1485 | table_id: 141 (school.tb_students_info)                                                      |
| mysql_bin.000002 | 1485 | Delete_rows    |        10 |        1541 | table_id: 141 flags: STMT_END_F                                                              |
| mysql_bin.000002 | 1541 | Xid            |        10 |        1572 | COMMIT /* xid=494 */                                                                         |
| mysql_bin.000002 | 1572 | Anonymous_Gtid |        10 |        1637 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'                                                         |
| mysql_bin.000002 | 1637 | Query          |        10 |        1735 | drop database school                                                                         |
| mysql_bin.000002 | 1735 | Rotate         |        10 |        1782 | mysql_bin.000003;pos=4                                                                       |
+------------------+------+----------------+-----------+-------------+----------------------------------------------------------------------------------------------+
27 rows in set (0.00 sec)

mysql> 
6.8 恢复数据
1.不加|是查看
[root@129a ~]# mysqlbinlog --stop-position=1637 /opt/data/mysql_bin.000002

2.恢复
[root@129a ~]# mysqlbinlog --stop-position=1637 /opt/data/mysql_bin.000002 | mysql -uroot -prun123456
mysql: [Warning] Using a password on the command line interface can be insecure.
[root@129a ~]# 


3.查看数据库
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| school             |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

mysql> use school;
Database changed
mysql> show tables;
+------------------+
| Tables_in_school |
+------------------+
| info             |
| tb_coursse       |
| tb_students_info |
+------------------+
3 rows in set (0.00 sec)

mysql> 
mysql> select * from info;
+----+-------+
| id | name  |
+----+-------+
|  1 | zhang |
|  2 | wang  |
|  3 | li    |
|  4 | ying  |
+----+-------+
4 rows in set (0.00 sec)

mysql> select * from tb_coursse;
+----+-------------+
| id | course_name |
+----+-------------+
|  1 | java        |
|  2 | mysql       |
|  3 | python      |
|  4 | go          |
|  5 | c++         |
|  6 | html        |
|  7 | linux       |
|  8 | lishi       |
+----+-------------+
8 rows in set (0.00 sec)

mysql> select * from tb_students_info;
+----+--------+------+------+--------+-----------+
| id | name   | age  | sex  | height | course_id |
+----+--------+------+------+--------+-----------+
|  1 | danny  |   25 | M    |    160 |         1 |
|  2 | green  |   23 | M    |    177 |         2 |
|  3 | henry  |   23 | F    |    185 |         1 |
|  4 | jane   |   23 | M    |    162 |         3 |
|  5 | jim    |   22 | F    |    175 |         2 |
|  6 | john   |   21 | F    |    172 |         4 |
|  8 | susan  |   23 | M    |    170 |         5 |
|  9 | thomas |   22 | F    |    178 |         5 |
| 10 | tom    |   23 | F    |    165 |         5 |
| 11 | liming |   22 | M    |    180 |         7 |
+----+--------+------+------+--------+-----------+
10 rows in set (0.00 sec)

mysql> 

7. MySQL数据库的三大类

7.1 按备份系统的准备程度,可将其分为 冷备份、温备份和热备份三大类 :
  • 冷备份 : 离线备份 数据库服务停止

  • 优点 : 设备投资较少,节省通信费用,通信环境要求不高

  • 缺点 : 恢复时间较长,一般要数天至1周,数据完整性与一致性较差

  • 温备份 : 将备份系统已安装配置成与当前使用的系统相同或相似的系统和网络运行环境,安装应用系统业务定期备份数据。一旦发生灾难,直接使用定期备份数据,手工逐笔或自动批量追补孤立数据或将终端用户通过通讯线路切换到备份系统,恢复业务运行

  • 优点 : 设备投资较少,通信环境要求不高

  • 缺点 : 恢复时间长,一般要十几个小时至数天,数据完整性与一致性较差

  • 热备份 : 备份处于联机状态,在线备份,数据库没有停止服务

  • 优点 : 恢复时间短,一般几十分钟到数小时,数据完整性与一致性最好,数据丢失可能性最小

  • 缺点 : 设备投资大,通信费用高,通信环境要求高,平时运行管理较复杂

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值