MySql教程

mysql数据库备份与恢复

本文主要是介绍mysql数据库备份与恢复,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

目录
  • mysql数据库备份与恢复
    • 数据库常用备份方案
    • mysql备份工具mysqldump
    • mysql数据恢复
    • 差异备份与恢复
      • mysql差异备份
      • mysql差异备份恢复
      • 二进制日志转换文本文件:
      • 根据时间恢复:
      • 根据操作id号恢复:

mysql数据库备份与恢复

数据库常用备份方案

数据库备份方案:

  • 全量备份
  • 增量备份
  • 差异备份
备份方案 特点
全量备份 全量备份就是指对某一个时间点上的所有数据或应用进行的一个完全拷贝。数据恢复快。备份时间长
增量备份 增量备份是指在一次全备份或上一次增量备份后,以后每次的备份只需备份。与前一次相比增加和者被修改的文件。这就意味着,第一次增量备份的对象。是进行全备后所产生的增加和修改的文件;第二次增量备份的对象是进行第一次增量。备份后所产生的增加和修改的文件,如此类推。没有重复的备份数据。备份时间短。恢复数据时必须按一定的顺序进行
差异备份 备份上一次的完全备份后发生变化的所有文件。差异备份是指在一次全备份后到进行差异备份的这段时间内。对那些增加或者修改文件的备份。在进行恢复时,我们只需对第一次全量备份和最后一次差异备份进行恢复。

mysql备份工具mysqldump

常用的OPTIONS:
-uUSERNAME //指定数据库用户名
-hHOST //指定服务器主机,请使用ip地址
-pPASSWORD //指定数据库用户的密码
-P# //指定数据库监听的端口,这里的#需用实际的端口号代替,如-P3307

备份course表

[root@localhost ~]# mysqldump -uroot -p123456 ljl0 course > course$(date '+%Y%m%d%H%M%S').sql
[root@localhost ~]# ls
anaconda-ks.cfg  course20220728215908.sql

备份ljl0数据库

[root@localhost ~]# mysqldump -uroot -p123456 --databases ljl0 > ljl$(date '+%Y%m%d%H%M%S').sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
[root@localhost ~]# ls
anaconda-ks.cfg  course20220728215908.sql  ljl20220728220059.sql

备份所有

[root@localhost ~]# mysqldump -uroot -p123456 --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@localhost ~]# ls
all20220728220324.sql  course20220728215908.sql
anaconda-ks.cfg        ljl20220728220059.sql

mysql数据恢复

删除ljl0数据库

mysql> drop database ljl0;
Query OK, 2 rows affected (0.01 sec)

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

恢复ljl0数据库

[root@localhost ~]# mysql -uroot -p123456 <ljl20220728220059.sql 
[root@localhost ~]# mysql -uroot -p123456
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| crouce             |
| ljl0               |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
6 rows in set (0.00 sec)

删除ljl0数据库下的course表

mysql> use ljl0
mysql> drop  table course;
Query OK, 0 rows affected (0.10 sec)
mysql> show tables;
+----------------+
| Tables_in_ljl0 |
+----------------+
| students       |
+----------------+
1 row in set (0.00 sec)

恢复course表

mysql> use ljl0
mysql> source course20220728215908.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)

mysql> show tables;
+----------------+
| Tables_in_ljl0 |
+----------------+
| course         |
| students       |
+----------------+
2 rows in set (0.00 sec)


删除整个数据库

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| crouce             |
| ljl0               |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
6 rows in set (0.00 sec)
mysql> drop database ljl0;
Query OK, 2 rows affected (0.01 sec)

恢复整个数据库

[root@localhost ~]# mysql -uroot -p123456 < all20220728220324.sql 
[root@localhost ~]# mysql -uroot -p123456
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| crouce             |
| ljl0               |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
6 rows in set (0.01 sec)

差异备份与恢复

mysql差异备份

开启MySQL服务器的二进制日志功能

[root@localhost ~]# vim /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=1
log-bin=mysql_bin

[root@localhost ~]# service mysqld restart
Shutting down MySQL.. SUCCESS! 
Starting MySQL. SUCCESS!

完全备份

[root@localhost ~]# mysqldump  -uroot -p123456  --single-transaction --flush-logs --master-data=2 --all-databases --delete-master-logs > all1-$(date '+%Y%m%d%H%M%S').sql

增加新内容

[root@localhost ~]# mysql -uroot -p123456
mysql> use ljl0;
mysql> insert course(course_name) values('english'),('math');
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

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

mysql差异备份恢复

模拟误删数据

mysql> drop database ljl0;
Query OK, 2 rows affected (0.01 sec)
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| crouce             |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

刷新创建新的二进制日志

[root@localhost ~]# cd /opt/data/
[root@localhost data]# ll
-rw-r-----. 1 mysql mysql      589 Jul 28 22:32 mysql_bin.000002
-rw-r-----. 1 mysql mysql       19 Jul 28 22:24 mysql_bin.index
[root@localhost data]# cat mysql_bin.index 
./mysql_bin.000002

[root@localhost data]# mysqladmin -uroot -p123456 flush-logs
-rw-r-----. 1 mysql mysql      636 Jul 28 22:36 mysql_bin.000002
-rw-r-----. 1 mysql mysql      154 Jul 28 22:36 mysql_bin.000003
-rw-r-----. 1 mysql mysql       38 Jul 28 22:36 mysql_bin.index
[root@localhost data]# cat mysql_bin.index 
./mysql_bin.000002
./mysql_bin.000003

恢复完全备份

[root@localhost ~]# mysql -uroot -p123456 < all1-20220728222421.sql 
[root@localhost ~]# mysql -uroot -p123456 
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| crouce             |
| ljl0               |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
6 rows in set (0.00 sec)

mysql> use ljl0;

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

恢复差异备份

[root@localhost data]# ll
-rw-r-----. 1 mysql mysql      636 Jul 28 22:36 mysql_bin.000002
-rw-r-----. 1 mysql mysql   858142 Jul 28 22:39 mysql_bin.000003
-rw-r-----. 1 mysql mysql       38 Jul 28 22:36 mysql_bin.index
[root@localhost data]# mysql -uroot -p123456 

mysql> 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    |         1 |         123 | Server ver: 5.7.37-log, Binlog ver: 4 |
| mysql_bin.000002 | 123 | Previous_gtids |         1 |         154 |                                       |
| mysql_bin.000002 | 154 | Anonymous_Gtid |         1 |         219 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'  |
| mysql_bin.000002 | 219 | Query          |         1 |         291 | BEGIN                                 |
| mysql_bin.000002 | 291 | Table_map      |         1 |         343 | table_id: 140 (ljl0.course)           |
| mysql_bin.000002 | 343 | Write_rows     |         1 |         401 | table_id: 140 flags: STMT_END_F       |
| mysql_bin.000002 | 401 | Xid            |         1 |         432 | COMMIT /* xid=489 */                  |
| mysql_bin.000002 | 432 | Anonymous_Gtid |         1 |         497 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'  |
| mysql_bin.000002 | 497 | Query          |         1 |         589 | drop database ljl0                    |
| mysql_bin.000002 | 589 | Rotate         |         1 |         636 | mysql_bin.000003;pos=4                |
+------------------+-----+----------------+-----------+-------------+---------------------------------------+
10 rows in set (0.00 sec)

[root@localhost data]# mysqlbinlog --stop-position=497 /opt/data/mysql_bin.000002 |mysql -uroot -p123456
[root@localhost data]# mysql -uroot -p123456 
mysql> use ljl0;

mysql> select * from course;
+----+-------------+
| id | course_name |
+----+-------------+
|  1 | java        |
|  2 | mysql       |
|  3 | python      |
|  4 | go          |
|  5 | c++         |
|  6 | english     |
|  7 | math        |
+----+-------------+
7 rows in set (0.01 sec)

模拟删除多条

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


mysql> delete from course where id =1 or id =2 or id = 3 or id = 4;
Query OK, 4 rows affected (0.01 sec)

mysql> select * from course;
+----+-------------+
| id | course_name |
+----+-------------+
|  5 | c++         |
+----+-------------+
1 row in set (0.00 sec)

mysql> insert course(course_name) values('das'),('hehe'),('haha');
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0
mysql> select * from course;
+----+-------------+
| id | course_name |
+----+-------------+
|  5 | c++         |
|  6 | das         |
|  7 | hehe        |
|  8 | haha        |
+----+-------------+
4 rows in set (0.00 sec)

刷新新的二进制日志

[root@localhost ~]# cd /opt/data/
[root@localhost data]# ll
-rw-r-----. 1 mysql mysql      734 Jul 28 23:20 mysql_bin.000002
-rw-r-----. 1 mysql mysql       19 Jul 28 23:17 mysql_bin.index

[root@localhost data]# mysqladmin -uroot -p123456 flush-logs
-rw-r-----. 1 mysql mysql      781 Jul 28 23:22 mysql_bin.000002
-rw-r-----. 1 mysql mysql      154 Jul 28 23:22 mysql_bin.000003
-rw-r-----. 1 mysql mysql       38 Jul 28 23:22 mysql_bin.index


导出为文本文件

[root@localhost data]# mysqlbinlog --no-defaults --base64-output=decode-rows -v mysql_bin.000004 > /opt/mysql_bin004.txt
[root@localhost data]# cat /opt/mysql_bin004.txt 

恢复完全备份

[root@localhost data]# mysql -uroot -p123456 < /root/all1-20220728222421.sql 
mysql> select * from course;
+----+-------------+
| id | course_name |
+----+-------------+
|  1 | java        |
|  2 | mysql       |
|  3 | python      |
|  4 | go          |
|  5 | c++         |
+----+-------------+
5 rows in set (0.00 sec)

恢复差异备份

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 |         291 | BEGIN                                 |
| mysql_bin.000002 | 291 | Table_map      |        10 |         343 | table_id: 140 (ljl0.course)           |
| mysql_bin.000002 | 343 | Delete_rows    |        10 |         419 | table_id: 140 flags: STMT_END_F       |
| mysql_bin.000002 | 419 | Xid            |        10 |         450 | COMMIT /* xid=487 */                  |
| mysql_bin.000002 | 450 | Anonymous_Gtid |        10 |         515 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'  |
| mysql_bin.000002 | 515 | Query          |        10 |         587 | BEGIN                                 |
| mysql_bin.000002 | 587 | Table_map      |        10 |         639 | table_id: 140 (ljl0.course)           |
| mysql_bin.000002 | 639 | Write_rows     |        10 |         703 | table_id: 140 flags: STMT_END_F       |
| mysql_bin.000002 | 703 | Xid            |        10 |         734 | COMMIT /* xid=488 */                  |
| mysql_bin.000002 | 734 | Rotate         |        10 |         781 | mysql_bin.000003;pos=4                |
+------------------+-----+----------------+-----------+-------------+---------------------------------------+
13 rows in set (0.00 sec)

[root@localhost data]# mysqlbinlog --stop-position=734 /opt/data/mysql_bin.000002 |mysql -uroot -p123456
mysql> select * from course;
+----+-------------+
| id | course_name |
+----+-------------+
|  5 | c++         |
|  6 | das         |
|  7 | hehe        |
|  8 | haha        |
+----+-------------+
4 rows in set (0.00 sec)

二进制日志转换文本文件:

mysqlbinlog --no-defaults --base64-output=decode-rows -v mysql_bin.000004 > /opt/mysql_bin004.txt

根据时间恢复:

mysqlbinlog --stop-datetime='22-07-28 15:42:44' /opt/data/mysql_bin.000004 | mysql -uroot -p123456

根据操作id号恢复:

mysqlbinlog --stop-position=769 /opt/data/mysql_bin.000004 | mysql -uroot -p123456

这篇关于mysql数据库备份与恢复的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!