天天看點

MySQL資料庫備份與恢複1. mysql備份方案2. 備份工具mysqldump3. 差異備份與恢複

文章目錄

  • 1. mysql備份方案
  • 2. 備份工具mysqldump
  • 3. 差異備份與恢複

1. mysql備份方案

資料庫備份方案:

  • 全量備份:
    • 全量備份是指将某一時間點的所有資料進行一次完全拷貝
    • 特點:資料恢複快,備份時間長,占用空間大
  • 增量備份:
    • 增量備份是指在上一次全量備份或增量備份的基礎上,以後每次的備份隻需要備份與前一次相比增加或修改的檔案
    • 特點:沒有重複的資料,備份時間短,恢複資料時必須按一定的順序進行
  • 差異備份
    • 差異備份是指在一次全量備份後,以後每一次備份都會與這一次全量備份對比,對增加或修改的檔案的備份。
    • 在恢複資料時,我們隻需要恢複全量備份和最後一次差異備份,就能夠恢複全部資料
    • 特點:恢複資料友善,相比全量備份占用空間較小

資料較少時建議使用全量備份

資料較多時建議将全量備份和差異備份組合使用

2. 備份工具mysqldump

文法:

mysqldump [OPTIONS] database [tables ...]
  mysqldump [OPTIONS] --all-databases [OPTIONS]
  mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...]
           

常用的OPTIONS:

-uUSERNAME      //指定資料庫使用者名
  -hHOST          //指定伺服器主機,請使用ip位址
  -pPASSWORD      //指定資料庫使用者的密碼
  -P#             //指定資料庫監聽的端口,這裡的#需用實際的端口号代替,如-P3307
           

備份與恢複示例:

因為root目錄中有.my.cnf配置檔案,所有後面的操作可以直接使用mysql進入資料庫,不用跟使用者和密碼

[[email protected] ~]# cat .my.cnf 
[client]
user=root
password=123
[mysqldump]
user=root
password=123
           
  • 備份整個資料庫
檢視資料:
[[email protected] ~]# mysql
mysql> use school;
mysql> select * from student;
+----+-----------+------+
| id | name      | age  |
+----+-----------+------+
|  1 | tom       |   15 |
|  2 | jerry     |   20 |
|  3 | zhangshan |   30 |
+----+-----------+------+
3 rows in set (0.00 sec)
mysql> exit
Bye

進行全量備份:
[[email protected] ~]# mysqldump --all-databases > all-202006121010.sql
[[email protected] ~]# ls
all-202006121010.sql

删除資料庫:
[[email protected] ~]# mysql
mysql> drop database school;
Query OK, 1 row affected (0.01 sec)

恢複全量備份:
[[email protected] ~]# mysql < all-202006121010.sql

檢視資料:
mysql> use school;
mysql> select * from student;
+----+-----------+------+
| id | name      | age  |
+----+-----------+------+
|  1 | tom       |   15 |
|  2 | jerry     |   20 |
|  3 | zhangshan |   30 |
+----+-----------+------+
3 rows in set (0.00 sec)
           
  • 備份school資料庫中的student表
[[email protected] ~]# mysqldump school student > table-202006121010.sql
[[email protected] ~]# ls
table-202006121010.sql

恢複school資料庫中的student表
mysql> use school;  //如果school庫不存在,則需要建立school庫才能恢複備份的表
mysql> source table-202006121010.sql
           
  • 備份school庫
[[email protected] ~]# mysqldump --databases school > yu-202006121010.sql
[[email protected] ~]# ls
yu-202006121010.sql

恢複school庫
[[email protected] ~]# mysql < yu-202006121010.sql
           

3. 差異備份與恢複

  • 開啟二進制日志功能
[[email protected] ~]# vim /etc/my.cnf
添加以下兩行内容
server-id = 1
log-bin = mysql.bin

重新開機服務:
[[email protected] ~]# service mysqld restart
Shutting down MySQL.... SUCCESS! 
Starting MySQL. SUCCESS! 
           
  • 對資料庫進行全量備份
mysql> select * from student;
+----+-----------+------+
| id | name      | age  |
+----+-----------+------+
|  1 | tom       |   15 |
|  2 | jerry     |   20 |
|  3 | zhangshan |   30 |
+----+-----------+------+
3 rows in set (0.00 sec)

全量備份:
[[email protected] ~]# mysqldump --single-transaction --flush-logs --master-data=2 --all-databases --delete-master-logs > all-202006121010.sql
[[email protected] ~]# ls
all-202006121010.sql
           
  • 在資料庫中新增和修改資料
mysql> insert into student(name,age) value('lisi',25);
Query OK, 1 row affected (0.00 sec)
mysql> update student set age = 30 where name = 'lisi';
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0
mysql> select * from student;
+----+-----------+------+
| id | name      | age  |
+----+-----------+------+
|  1 | tom       |   15 |
|  2 | jerry     |   20 |
|  3 | zhangshan |   30 |
|  4 | lisi      |   30 |
+----+-----------+------+
4 rows in set (0.00 sec)
           
  • 模拟誤删庫
mysql> drop database school;
Query OK, 1 row affected (0.01 sec)
           
  • 重新整理建立新的二進制日志
[[email protected] ~]# ls /opt/data |grep mysql.00*
mysql.000002
[[email protected] ~]# mysqladmin flush-logs
[[email protected] ~]# ls /opt/data |grep mysql.00*
mysql.000002
mysql.000003
           
  • 恢複全量備份
[[email protected] ~]# mysql < all-202006121010.sql
mysql> use school;
mysql> select * from student;
+----+-----------+------+
| id | name      | age  |
+----+-----------+------+
|  1 | tom       |   15 |
|  2 | jerry     |   20 |
|  3 | zhangshan |   30 |
+----+-----------+------+
3 rows in set (0.00 sec)
           
  • 檢查誤删部分id
mysql> show binlog events in 'mysql.000002';
+--------------+-----+----------------+-----------+-------------+---------------------------------------+
| Log_name     | Pos | Event_type     | Server_id | End_log_pos | Info                                  |
+--------------+-----+----------------+-----------+-------------+---------------------------------------+
| mysql.000002 |   4 | Format_desc    |         1 |         123 | Server ver: 5.7.30-log, Binlog ver: 4 |
| mysql.000002 | 123 | Previous_gtids |         1 |         154 |                                       |
| mysql.000002 | 154 | Anonymous_Gtid |         1 |         219 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'  |
| mysql.000002 | 219 | Query          |         1 |         293 | BEGIN                                 |
| mysql.000002 | 293 | Table_map      |         1 |         349 | table_id: 140 (school.student)        |
| mysql.000002 | 349 | Write_rows     |         1 |         395 | table_id: 140 flags: STMT_END_F       |
| mysql.000002 | 395 | Xid            |         1 |         426 | COMMIT /* xid=463 */                  |
| mysql.000002 | 426 | Anonymous_Gtid |         1 |         491 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'  |
| mysql.000002 | 491 | Query          |         1 |         565 | BEGIN                                 |
| mysql.000002 | 565 | Table_map      |         1 |         621 | table_id: 140 (school.student)        |
| mysql.000002 | 621 | Update_rows    |         1 |         679 | table_id: 140 flags: STMT_END_F       |
| mysql.000002 | 679 | Xid            |         1 |         710 | COMMIT /* xid=464 */                  |
| mysql.000002 | 710 | Anonymous_Gtid |         1 |         775 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'  |
| mysql.000002 | 775 | Query          |         1 |         873 | drop database school                  |
| mysql.000002 | 873 | Rotate         |         1 |         916 | mysql.000003;pos=4                    |
+--------------+-----+----------------+-----------+-------------+---------------------------------------+
15 rows in set (0.00 sec)
//從上面的表中可以看到 drop database school 這條指令開始id為775
           
  • 恢複差異備份
  • 驗證資料是否恢複
mysql> select * from student;
+----+-----------+------+
| id | name      | age  |
+----+-----------+------+
|  1 | tom       |   15 |
|  2 | jerry     |   20 |
|  3 | zhangshan |   30 |
|  4 | lisi      |   30 |
+----+-----------+------+
4 rows in set (0.00 sec)