MySQL——全量,增量備份與恢復(實戰篇!)

一,全量備份與恢復

1,進入數據庫,創建表,插入表數據

[root@master2 ~]# mysql -uroot -p   ##進入數據庫
Enter password: 

mysql> create database school;    ##創建數據庫
Query OK, 1 row affected (0.01 sec)

mysql> use school;   ##使用數據庫
Database changed
mysql> create table info(    ##創建表
        -> id int(3) not null primary key auto_increment,
        -> name varchar(10) not null,
        -> score decimal(4,1) not null);
Query OK, 0 rows affected (0.02 sec)

mysql> desc info;   ##查看錶結構
+-------+--------------+------+-----+---------+----------------+
| Field | Type         | Null | Key | Default | Extra          |
+-------+--------------+------+-----+---------+----------------+
| id    | int(3)       | NO   | PRI | NULL    | auto_increment |
| name  | varchar(10)  | NO   |     | NULL    |                |
| score | decimal(4,1) | NO   |     | NULL    |                |
+-------+--------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

mysql> insert into info (name,score) values ('stu01',88),('stu02',77);   ##插入表數據
Query OK, 2 rows affected (0.02 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> select * from info;   ##查看錶內容
+----+-------+-------+
| id | name  | score |
+----+-------+-------+
|  1 | stu01 |  88.0 |
|  2 | stu02 |  77.0 |
+----+-------+-------+
2 rows in set (0.01 sec)

mysql> select * from info limit 1;   ##只顯示錶中的前1行
+----+-------+-------+
| id | name  | score |
+----+-------+-------+
|  1 | stu01 |  88.0 |
+----+-------+-------+
1 row in set (0.00 sec)

2,對數據庫進行物理的完全備份

[root@master2 ~]# cd /usr/local/mysql/data/   ##切換到數據庫的數據目錄下
[root@master2 data]# ls
auto.cnf        ibdata1      ib_logfile1  mysql               school  test
ib_buffer_pool  ib_logfile0  ibtmp1       performance_schema  sys
[root@master2 data]# cd school/
[root@master2 school]# ls   ##數據中的文件
db.opt  info.frm  info.ibd
[root@master2 school]# cd ..
[root@master2 data]# tar Jcvf /opt/mysql-$(date +%F).tar.xz /usr/local/mysql/data/ ##用xz格式壓縮
[root@master2 data]# cd /opt/
[root@master2 opt]# ls
mysql-2019-11-26.tar.xz  mysql-5.7.20  rh

3,對單個數據庫進行邏輯上的備份

[root@master2 opt]# mysqldump -uroot -p school > /opt/school.sql  ##邏輯備份單個數據庫
Enter password: 
[root@master2 opt]# ls
mysql-2019-11-26.tar.xz  mysql-5.7.20  rh  school.sql
[root@master2 opt]# vim school.sql  ##查看備份數據庫腳本

...
CREATE TABLE `info` (
    `id` int(3) NOT NULL AUTO_INCREMENT,
    `name` varchar(10) NOT NULL,
    `score` decimal(4,1) NOT NULL,
    PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
...
LOCK TABLES `info` WRITE;
/*!40000 ALTER TABLE `info` DISABLE KEYS */;
INSERT INTO `info` VALUES (1,'stu01',88.0),(2,'stu02',77.0);
...

4,對多個數據庫進行備份

[root@master2 opt]# mysqldump -uroot -p --databases school mysql > /opt/db_school_mysql.sql
##備份多個數據庫
Enter password: 
[root@master2 opt]# ls
db_school_mysql.sql  mysql-2019-11-26.tar.xz  mysql-5.7.20  rh  school.sql

5,對數據庫進行完全備份

[root@master2 opt]# mysqldump -uroot -p --opt --all-databases > /opt/all.sql ##完全備份
Enter password: 
[root@master2 opt]# ls
all.sql              mysql-2019-11-26.tar.xz  rh
db_school_mysql.sql  mysql-5.7.20             school.sql

6,對數據庫中的表進行備份

[root@master2 opt]# mysqldump -uroot -p school info > /opt/school_info.sql ##對數據庫中的表進行備份
Enter password: 
[root@master2 opt]# ls
all.sql              mysql-2019-11-26.tar.xz  rh               school.sql
db_school_mysql.sql  mysql-5.7.20             school_info.sql

7,對數據庫中的表結構進行備份

[root@master2 opt]# mysqldump -uroot -p -d school info > /opt/school_info_desc.sql  
##對錶結構進行備份
Enter password: 
[root@master2 opt]# ls
all.sql                  mysql-5.7.20          school_info.sql
db_school_mysql.sql      rh                    school.sql
mysql-2019-11-26.tar.xz  school_info_desc.sql

8,基於腳本恢復數據庫

[root@master2 opt]# mysql -uroot -p     ##進入數據庫
Enter password: 

mysql> show databases;   ##查看數據庫
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| school             |
| sys                |
| test               |
+--------------------+
6 rows in set (0.00 sec)

mysql> use school;    ##使用數據庫
Database changed

mysql> show tables;   ##查看錶
+------------------+
| Tables_in_school |
+------------------+
| info             |
+------------------+
1 row in set (0.00 sec)

mysql> drop table info;    ##刪除表
Query OK, 0 rows affected (0.01 sec)

mysql> show tables;        ###查看錶
Empty set (0.00 sec)

mysql> source /opt/school.sql  ##恢復數據庫腳本文件

mysql> show tables;    ##查看錶
+------------------+
| Tables_in_school |
+------------------+
| info             |
+------------------+
1 row in set (0.00 sec)

9,基於外部MySQL命令恢復數據庫

mysql> drop table info;   ##刪除表
Query OK, 0 rows affected (0.01 sec)

mysql> show tables;   ##查看錶
Empty set (0.00 sec)

mysql> quit   ##退出
Bye
[root@master2 opt]# mysql -uroot -p123123 school < /opt/school.sql   ##利用mysql命令進行恢復
mysql: [Warning] Using a password on the command line interface can be insecure.
[root@master2 opt]# mysql -uroot -p123123    ##進入數據庫
mysql: [Warning] Using a password on the command line interface can be insecure.

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 |
+------------------+
| info             |
+------------------+
1 row in set (0.00 sec)

二,MySQL增量備份及恢復

1,開啓二進制日誌文件

[root@master2 opt]# vim /etc/my.cnf  ##開啓二進制日誌文件
[mysqld]
user = mysql
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
port = 3306
character_set_server=utf8
pid-file = /usr/local/mysql/mysql.pid
socket = /usr/local/mysql/mysql.sock
log-bin=mysql-bin   ##開啓二進制日誌文件
server-id = 1
[root@master2 opt]# systemctl restart mysqld.service   ##重啓mysql服務
[root@master2 opt]# cd /usr/local/mysql/data/   ##切換到mysql站點
[root@master2 data]# ls     ##查看二進制日誌文件
auto.cnf        ib_logfile0  mysql             performance_schema  test
ib_buffer_pool  ib_logfile1  mysql-bin.000001  school
ibdata1         ibtmp1       mysql-bin.index   sys

2,進行完全備份

[root@master2 data]# mysqldump -uroot -p123123 school > /opt/school.sql ##一次完全備份
mysqldump: [Warning] Using a password on the command line interface can be insecure.
[root@master2 data]# ls
auto.cnf        ib_logfile0  mysql             performance_schema  test
ib_buffer_pool  ib_logfile1  mysql-bin.000001  school
ibdata1         ibtmp1       mysql-bin.index   sys
[root@master2 data]# mysqladmin -uroot -p123123 flush-logs  ##刷新二進制日誌文件
mysqladmin: [Warning] Using a password on the command line interface can be insecure.
[root@master2 data]# ls     ##生成新的二進制日誌文件,接下來的操作會保存在mysql-bin.000002中
auto.cnf        ib_logfile0  mysql             mysql-bin.index     sys
ib_buffer_pool  ib_logfile1  mysql-bin.000001  performance_schema  test
ibdata1         ibtmp1       mysql-bin.000002  school

3,進入數據庫,模擬誤操作

[root@master2 data]# mysql -uroot -p123123  ##進入數據庫
mysql: [Warning] Using a password on the command line interface can be insecure.

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> select * from info;  ##查看錶
+----+------+-------+
| id | name | score |
+----+------+-------+
|  1 | st01 |  88.0 |
|  2 | st02 |  77.0 |
+----+------+-------+
2 rows in set (0.00 sec)

mysql> insert into info (name,score) values ('by01',66);   ##正確操作
Query OK, 1 row affected (0.00 sec)

mysql> select * from info;
+----+------+-------+
| id | name | score |
+----+------+-------+
|  1 | st01 |  88.0 |
|  2 | st02 |  77.0 |
|  3 | by01 |  66.0 |
+----+------+-------+
3 rows in set (0.00 sec)

mysql> delete from info where name='st01';   ##錯誤操作
Query OK, 1 row affected (0.00 sec)

mysql> insert into info (name,score) values ('by02',99); ##正確操作
Query OK, 1 row affected (0.00 sec)

mysql> select * from info;
+----+------+-------+
| id | name | score |
+----+------+-------+
|  2 | st02 |  77.0 |
|  3 | by01 |  66.0 |
|  4 | by02 |  99.0 |
+----+------+-------+
3 rows in set (0.00 sec)

[root@master2 data]# mysqladmin -uroot -p123123 flush-logs    ##刷新二進制日誌文件        
mysqladmin: [Warning] Using a password on the command line interface can be insecure.
[root@master2 data]# mysqlbinlog --no-defaults --base64-output=decode-rows -v mysql-bin.000002 > /opt/bak.txt
##用64位解碼器查看二進制日誌文件,並生成一個文件
[root@master2 data]# cd /opt/
[root@master2 opt]# ls
bak.txt  mysql-5.7.20  rh  school.sql
[root@master2 opt]# vim bak.txt    ##查看二進制日誌文件

# at 1084
#191127 20:14:01 server id 1  end_log_pos 1132 CRC32 0xdcc90eb5         Write_rows: table id 221 flags: STMT_END_F
### INSERT INTO `school`.`info`   ##第一次正確操作的時間和位置
### SET
###   @1=3
###   @2='by01'
###   @3=66.0
...
# at 1302   ##停止位置點
#191127 20:14:46 server id 1  end_log_pos 1357 CRC32 0x6648509a         Table_map: `school`.`info` mapped to number 221
# at 1357
#191127 20:14:46 server id 1  end_log_pos 1405 CRC32 0x1eeb752b         Delete_rows: table id 221 flags: STMT_END_F
### DELETE FROM `school`.`info`   ##第二次執行錯誤操作的時間和位置191127 20:14:46
### WHERE
###   @1=1
###   @2='st01'
###   @3=88.0
# at 1405  ##開始位置點
#191127 20:14:46 server id 1  end_log_pos 1436 CRC32 0xf1c8d903         Xid = 54
...
# at 1630
#191127 20:15:16 server id 1  end_log_pos 1678 CRC32 0x08d9b0f4         Write_rows: table id 221 flags: STMT_END_F
### INSERT INTO `school`.`info`   ##第二次正確操作的時間和位置191127 20:15:16
### SET
###   @1=4
###   @2='by02'
###   @3=99.0

4,基於時間點進行斷點恢復

[root@master2 opt]# mysql -uroot -p123123   ##進入數據庫
mysql: [Warning] Using a password on the command line interface can be insecure.

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> drop table info;   ##刪除數據庫
Query OK, 0 rows affected (0.01 sec)

mysql> select * from info;   ##查看錶
ERROR 1146 (42S02): Table 'school.info' doesn't exist
mysql> source /opt/school.sql   ##恢復完全備份數據庫腳本
...
mysql> show tables;   ##查看錶
+------------------+
| Tables_in_school |
+------------------+
| info             |
+------------------+
1 row in set (0.00 sec)

mysql> select * from info;  ##查看錶數據
+----+------+-------+
| id | name | score |
+----+------+-------+
|  1 | st01 |  88.0 |
|  2 | st02 |  77.0 |
+----+------+-------+
2 rows in set (0.00 sec)

[root@master2 opt]# mysqlbinlog --no-defaults --stop-datetime='2019-11-27 20:14:46' /usr/local/mysql/data/mysql-bin.000002 | mysql -uroot -p123123
##恢復bin.000002中前一個正確的執行語句(從第二個錯誤語句時間點停止)
mysql: [Warning] Using a password on the command line interface can be insecure.
[root@master2 opt]# mysql -uroot -p123123   ##進入數據庫
mysql: [Warning] Using a password on the command line interface can be insecure.

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> select * from info;   ##查看錶數據,恢復了第一次正確操作
+----+------+-------+
| id | name | score |
+----+------+-------+
|  1 | st01 |  88.0 |
|  2 | st02 |  77.0 |
|  3 | by01 |  66.0 |
+----+------+-------+
3 rows in set (0.00 sec)

[root@master2 opt]# mysqlbinlog --no-defaults --start-datetime='2019-11-27 20:15:16' /usr/local/mysql/data/mysql-bin.000002 | mysql -uroot -p123123   
##跳過錯誤節點,恢復最後一個正確的操作(從最後一個正確的操作時間點開始)
mysql: [Warning] Using a password on the command line interface can be insecure.
[root@master2 opt]# mysql -uroot -p123123  ##進入數據庫
mysql: [Warning] Using a password on the command line interface can be insecure.

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> select * from info;    ##查看錶數據,恢復了第二次正確操作,跳過了錯誤的操作
+----+------+-------+
| id | name | score |
+----+------+-------+
|  1 | st01 |  88.0 |
|  2 | st02 |  77.0 |
|  3 | by01 |  66.0 |
|  4 | by02 |  99.0 |
+----+------+-------+
4 rows in set (0.00 sec)

5,基於位置點進行斷點恢復

mysql> delete from info where name='by01';    ##爲實驗方便直接刪除
Query OK, 1 row affected (0.01 sec)

mysql> delete from info where name='by02';    ##刪除
Query OK, 1 row affected (0.00 sec)

mysql> select * from info;  ##完全備份的初始狀態
+----+------+-------+
| id | name | score |
+----+------+-------+
|  1 | st01 |  88.0 |
|  2 | st02 |  77.0 |
+----+------+-------+
2 rows in set (0.00 sec)

mysql> quit
Bye

[root@master2 opt]# mysqlbinlog --no-defaults --stop-position='1302' /usr/local/mysql/data/mysql-bin.000002 | mysql -uroot -p123123                           
##跳過錯誤操作的位置點從上一個位置點開始
[root@master2 opt]# mysql -uroot -p123123   ##進入數據庫
mysql: [Warning] Using a password on the command line interface can be insecure.

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> select * from info;   ##查看錶數據,恢復了第一次正確的操作
+----+------+-------+
| id | name | score |
+----+------+-------+
|  1 | st01 |  88.0 |
|  2 | st02 |  77.0 |
|  3 | by01 |  66.0 |
+----+------+-------+
3 rows in set (0.00 sec)

mysql> quit
Bye

[root@master2 opt]# mysqlbinlog --no-defaults --start-position='1405' /usr/local/mysql/data/mysql-bin.000002 | mysql -uroot -p123123   
##從錯誤的位置後一個位置點開始,跳過錯誤操作的位置點
[root@master2 opt]# mysql -uroot -p123123   ##進入數據庫
mysql: [Warning] Using a password on the command line interface can be insecure.

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> select * from info;    ##查看錶數據,跳過錯誤操作,恢復第二次正確操作數據
+----+------+-------+
| id | name | score |
+----+------+-------+
|  1 | st01 |  88.0 |
|  2 | st02 |  77.0 |
|  3 | by01 |  66.0 |
|  4 | by02 |  99.0 |
+----+------+-------+
4 rows in set (0.00 sec)

6,對於增量備份全部恢復

[root@master2 opt]# mysqlbinlog --no-defaults  /usr/local/mysql/data/mysql-bin.000002 | mysql -uroot -p123123
##全部增量恢復

謝謝閱讀!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章