1. 程式人生 > MYSQL進階教學 ><p>MySQL 的物理備份</p>

<p>MySQL 的物理備份</p>

物理備份的原理通常是基於物理檔案的拷貝,和邏輯備份相比,它的最大優點是備份速度更快。本小節將主要介紹 MySQL 的物理備份方法。

1. 冷備

一般來說,冷備就是停止資料庫服務,拷貝資料檔案。這種方法對所有的儲存引擎都適合,但一般很少使用到冷備,因為需要停機視窗。

冷備的操作步驟如下:

停止 MySQL 服務,在作業系統層面複製資料檔案和日誌檔案到備份目錄。

[mysql@localhost ~]$ service mysqld stop
Shutting down MySQL.......... SUCCESS! 

[mysql@localhost ~]$ scp -r /mysql/data/ /mysql/dbbackup/

熱備則剛好相反,不影響資料庫的正常執行,通過線上備份資料檔案和 binlog 日誌實現。

2. InnoDB 的熱備

目前,比較流行的 InnoDB 儲存引擎的熱備工具是 Xtrabackup。 xtrabackup 是 Percona 公司開發的一個用於 MySQL 資料庫物理熱備的備份工具,支援 MySQL、Percona server 和 MariaDB,開源免費,是目前較為受歡迎的主流備份工具 ,它能對 InnoDB 資料庫和 XtraDB 儲存引擎的資料庫非阻塞地備份(對於 MyISAM 的備份同樣需要加表鎖)。

Xtrabackup 優點:

  1. 備份速度快,物理備份可靠;
  2. 備份過程不會打斷正在執行的事務(無需鎖表);
  3. 能夠基於壓縮等功能節約磁碟空間和流量;
  4. 自動備份校驗;
  5. 還原速度快;
  6. 可以流傳將備份傳輸到另外一臺機器上;
  7. 在不增加伺服器負載的情況備份資料。

實際案例:Xtrabackup 全量備份:

[root@localhost ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --password=MyNewPass4! --port=3306 --no-timestamp /mysql/dbbackup/
200823 21:11:33 innobackupex: Starting the backup operation

IMPORTANT: Please check that the backup run completes successfully.
           At the end of a successful backup run innobackupex
           prints "completed OK!"
. 200823 21:11:33 version_check Connecting to MySQL server with DSN 'dbi:mysql:;mysql_read_default_group=xtrabackup;port=3306;mysql_socket=/mysql/tmp/mysql.sock' as 'root' (using password: YES). 200823 21:11:33 version_check Connected to MySQL server 200823 21:11:33 version_check Executing a version check against the server... 200823 21:11:33 version_check Done. 200823 21:11:33 Connecting to MySQL server host: localhost, user: root, password: set, port: 3306, socket: /mysql/tmp/mysql.sock ...... 200823 21:11:48 Finished backing up non-InnoDB tables and files 200823 21:11:48 [00] Writing /mysql/dbbackup/xtrabackup_binlog_info 200823 21:11:48 [00] ...done 200823 21:11:48 Executing FLUSH NO_WRITE_TO_BINLOG ENGINE LOGS... xtrabackup: The latest check point (for incremental): '14533834254' xtrabackup: Stopping log copying thread. .200823 21:11:48 >> log scanned up to (14533834263) 200823 21:11:49 Executing UNLOCK TABLES 200823 21:11:49 All tables unlocked 200823 21:11:49 [00] Copying ib_buffer_pool to /mysql/dbbackup/ib_buffer_pool 200823 21:11:49 [00] ...done 200823 21:11:49 Backup created in directory '/mysql/dbbackup/' MySQL binlog position: filename 'mysql-bin.000022', position '190', GTID of the last change '294ae4cf-be0f-11e7-8269-fa163e665653:1-2769, a373c879-3a2c-11e8-bb78-fa163e665653:1-5, aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:1-40:1000012-1000013' 200823 21:11:49 [00] Writing /mysql/dbbackup/backup-my.cnf 200823 21:11:49 [00] ...done 200823 21:11:49 [00] Writing /mysql/dbbackup/xtrabackup_info 200823 21:11:49 [00] ...done xtrabackup: Transaction log of lsn (14533834254) to (14533834263) was copied. 200823 21:11:49 completed OK!

備份完成後,備份目錄將產生如下檔案:

[root@localhost ~]$ ls -lh /mysql/dbbackup/
total 101M
-rw-r-----  1 root root  433 Aug 23 21:11 backup-my.cnf
-rw-r-----  1 root root  42K Aug 23 21:11 ib_buffer_pool
-rw-r-----  1 root root 100M Aug 23 21:11 ibdata1
drwxr-x---  2 root root 4.0K Aug 23 21:11 mysql
drwxr-x---  2 root root 4.0K Aug 23 21:11 performance_schema
drwxr-x---  2 root root  12K Aug 23 21:11 sys
drwxr-x---  2 root root 4.0K Aug 23 21:11 tempdb
-rw-r-----  1 root root  166 Aug 23 21:11 xtrabackup_binlog_info
-rw-r-----  1 root root  121 Aug 23 21:11 xtrabackup_checkpoints
-rw-r-----  1 root root  703 Aug 23 21:11 xtrabackup_info
-rw-r-----  1 root root 2.5K Aug 23 21:11 xtrabackup_logfile

實際案例:Xtrabackup 增量備份:

在進行增量備份之前,首先要有一次全量備份,第一次增量是基於全備份,之後的增量是基於上一次的增量備份。

[root@localhost ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --password=MyNewPass4! --port=3306 --no-timestamp /mysql/hotbackup/base

-- 從xtrabackup_checkpoints檔案可以看出,備份型別為全備份,lsn號從0至14533834254
[root@localhost ~]# cat /mysql/hotbackup/base/xtrabackup_checkpoints 
backup_type = full-backuped
from_lsn = 0
to_lsn = 14533834254
last_lsn = 14533834263
compact = 0
recover_binlog_info = 0

表 customer 插入新的資料:

mysql> insert into customer(id,last_name,first_name,birth_date,gender,balance) values(3,333,333,'2020-08-10',1,30);
Query OK, 1 row affected (0.00 sec)

mysql> insert into customer(id,last_name,first_name,birth_date,gender,balance) values(4,444,444,'2020-09-10',1,40);
Query OK, 1 row affected (0.00 sec)

第一次增量備份:

[root@localhost ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --password=MyNewPass4! --port=3306 --incremental --no-timestamp /mysql/hotbackup/inc1 --incremental-basedir=/mysql/hotbackup/base

-- 從xtrabackup_checkpoints檔案可以看出,備份型別為增量備份,lsn號從lsn 14533834254至lsn 14533838790,14533834254為全備份的to_lsn,表示備份從lsn 14533834254以來的增量變化。
[root@localhost ~]# cat /mysql/hotbackup/inc1/xtrabackup_checkpoints 
backup_type = incremental
from_lsn = 14533834254
to_lsn = 14533838790
last_lsn = 14533838799
compact = 0
recover_binlog_info = 0

3.小結

本小節主要介紹 MySQL 的物理備份方法:冷備和熱備。

冷備主要是停止 MySQL 服務,在作業系統層面複製資料檔案和日誌檔案到備份目錄。

熱備主要是針對 InnoDB 儲存引擎,介紹了開源備份工具 -Xtrabackup 的使用方法:全量備份和增量備份。