MySQL的備份主要分為邏輯備份和物理備份 邏輯備份 在MySQL中邏輯備份的最大優點是對各種存儲引擎都可以用同樣的方法來備份。而物理備份則不同,不同的存儲引擎有著不同的備份方法。Mysql中的邏輯備份是將資料庫中的數據備份為一個文本文件,備份的文件可以被查看和編輯,在mysql中常用mysqldu ...
MySQL的備份主要分為邏輯備份和物理備份
邏輯備份
在MySQL中邏輯備份的最大優點是對各種存儲引擎都可以用同樣的方法來備份。而物理備份則不同,不同的存儲引擎有著不同的備份方法。Mysql中的邏輯備份是將資料庫中的數據備份為一個文本文件,備份的文件可以被查看和編輯,在mysql中常用mysqldump工具來完成邏輯備份。
mysqldump的使用方法:
查看測試資料庫信息 mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | suzhou | | sysdb | | test | +--------------------+ 6 rows in set (0.01 sec)
1.備份指定的資料庫: suzhou
[root@anan tmp]# mysqldump -u root -p suzhou > ./dbbak/suzhou.sql --備份suzhou 資料庫
Enter password:
[root@anan tmp]#
[root@anan tmp]# cd dbbak/ && ls
suzhou.sql --備份生成的文件
[root@anan dbbak]#
2.備份指定的某個庫中的某個表:tb1
[root@anan dbbak]# mysqldump -u root -p suzhou tb1 > ./tb1.sql
Enter password:
[root@anan dbbak]# ls
suzhou.sql tb1.sql
3.備份所有資料庫
mysqldump -uroot -p --all-database > ./alldb.sql
Enter password:
[root@anan dbbak]# ls
alldb.sql suzhou.sql tb1.sql
需要強調的是,為了保證數據備份的一致性,MyISAM存儲引擎在備份時需要加上 -l (lock table)參數,表示將所有表加上讀鎖。在備份期間,所有表將引擎只能讀不能進行更新數據。但是對於事物存儲引擎(InnoDB和BDB)來說,可以使用--single-transaction,該選項將使InnoDB引擎得到一個快照,使得備份的數據能夠保證一致性。
完全恢復
mysqldump的恢復也比較簡單,將備份的數據文件作為輸入導入。但是註意,備份恢復後數據並不完整,因為備份後資料庫中又會產生新的數據記錄,需要將備份後的日誌進行重寫。使用方法:mysqlbinlog binlog-file | mysql -u -p
下麵進行一次完整的備份與恢復
新建一個資料庫 data1,庫中有tb1,信息如下:
mysql> select * from tb1; +------+------+ | id | name | +------+------+ | 1 | A | | 2 | B | | 3 | C | +------+------+ 3 rows in set (0.00 sec)
備份data1資料庫
mysql> show master status;
+-------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+------------------+
| master-bin.000010 | 2935 | | |
+-------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
備份前先查看一下當前使用的bin-log日誌文件編號
[root@anan dbbak]# mysqldump -uroot -p -l -F data1 > ./data1.sql Enter password: [root@anan dbbak]# ls data1.sql --備份指令中使用的-l :鎖定所有表為只讀狀態; -F : 刷新日誌文件
再看bin-log文件信息:
mysql> show master status;
+-------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+------------------+
| master-bin.000011 | 107 | | |
+-------------------+----------+--------------+------------------+
下麵再對data1庫中寫入數據,寫入後bin-log文件中的position的數值會產生變化。
mysql> insert into tb1 values (4,'D'),(5,'E'),(6,'F');
Query OK, 3 rows affected (0.03 sec)
再看bin-log文件的position值
mysql> show master status;
+-------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+------------------+
| master-bin.000011 | 313 | | |
+-------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
刪除資料庫data1,模擬故障
mysql> drop database data1; Query OK, 1 row affected (0.03 sec) mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | suzhou | | sysdb | | test | +--------------------+ 6 rows in set (0.00 sec)
data1 庫已經被刪除了
恢複數據庫 data1
[root@anan dbbak]# mysql -uroot -p data1 < ./data1.sql Enter password: ......
......
mysqldump: Got error: 1049: Unknown database 'data1' when selecting the database 【恢復的資料庫必須要在資料庫中存在,恢復前先新建一個同名的資料庫 data1】
【註意:mysqldump只用來備份數據,恢複數據使用 mysql指令,第一次恢復大意地使用mysqldump指令來恢復,怎麼也沒有成功,也沒有報錯,還是得細心才是】
[root@anan dbbak]# mysql -u root -p data1 < ./data1.sql --恢復備份
Enter password:
[root@anan dbbak]#
查看恢復後的數據如下,後寫入的數據還沒有
mysql> select * from tb1;
+------+------+
| id | name |
+------+------+
| 1 | A |
| 2 | B |
| 3 | C |
+------+------+
3 rows in set (0.00 sec)
恢復備份後的數據,由於失誤操作,日誌文件中存在誤操作的語句,所以可以可以使用基於時間點和基於位置的恢復。下麵以位置恢復。
恢復前需要先看新寫入的數據在bin-log日誌文件中的position值: mysqlbinlog master-bin.000011
[root@anan mysqldata]# mysqlbinlog master-bin.000011 | cat -n | grep -C 5 'insert' 1 /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/; 2 /*!40019 SET @@session.max_insert_delayed_threads=0*/; 3 /*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/; 4 DELIMITER /*!*/; 5 # at 4 6 #180308 2:28:18 server id 2 end_log_pos 107 Start: binlog v 4, server v 5.5.32-log created 180308 2:28:18 7 # Warning: this binlog is either in use or was not closed properly. -- 24 /*!*/; 25 # at 176 26 #180308 2:33:31 server id 2 end_log_pos 286 Query thread_id=13 exec_time=0 error_code=0 27 use `data1`/*!*/; 28 SET TIMESTAMP=1520447611/*!*/; 29 insert into tb1 values (4,'D'),(5,'E'),(6,'F') 30 /*!*/; 31 # at 286 32 #180308 2:33:31 server id 2 end_log_pos 313 Xid = 611 33 COMMIT/*!*/; 34 # at 313 -- 213 BEGIN 214 /*!*/; 215 # at 3393 216 #180308 2:33:31 server id 2 end_log_pos 3503 Query thread_id=13 exec_time=4490 error_code=0 217 SET TIMESTAMP=1520447611/*!*/; 218 insert into tb1 values (4,'D'),(5,'E'),(6,'F') 219 /*!*/; 220 # at 3503 221 #180308 2:33:31 server id 2 end_log_pos 3530 Xid = 916 222 COMMIT/*!*/; 223 DELIMITER ;
使用日誌文件恢復後寫入的數據 ;使用mysqlbinlog 指令
[root@anan mysqldata]# mysqlbinlog --start-position='176' --stop-position='286' ./master-bin.000011 | mysql -u root -p
Enter password:
[root@anan mysqldata]#
再看資料庫信息
mysql> select * from tb1;
+------+------+
| id | name |
+------+------+
| 1 | A |
| 2 | B |
| 3 | C |
| 4 | D |
| 5 | E |
| 6 | F |
+------+------+
6 rows in set (0.01 sec)
物理備份和恢復
物理備份又分為冷備和熱備兩種,和邏輯備份相比,它最大的優點是備份和恢復的速度更快,因為物理備份的原來是基於文件的cp。
冷備份
冷備份其實就是停掉資料庫服務,cp數據文件的方法,這種方法對MyISAM和InnoDB引擎都適合,但是一般很少用,因為很多應用是不允許停機的。
熱備份
在MySQL中,對於不同的存儲引擎熱備的方法也有所不同,下麵主要介紹MyISAM和InnoDB兩種常用的存儲引擎的熱備方法。
MyISAM存儲引擎
MyISAM存儲引擎的熱備方法本質其實就是將要備份的表加讀鎖,然後在cp數據文件到備份目錄,常用的方法有以下兩種:
方法1:使用mysqlhotcopy工具
方法2:使用手動鎖表copy
首先將資料庫中的所有表加讀鎖: flush tables for read ; 然後再cp數據文件到備份目錄即可。
InnoDB存儲引擎
InnoDB存儲引擎資料庫可以使用Xtrabackup工具來備份
下麵仔細介紹xtarbackup熱備工具的使用:
xtarbackup熱備工具的使用
xtrabackup是percona公司參與開發的一款基於InnoDB的線上熱備工具,具有開源,免費,支持線上熱備,備份恢復速度快,占用磁碟空間小等特點。
xtrabackup包含兩個主要的工具。即xtrabackup和innobackupex,兩者區別如下:
xtrabackup:只能備份InnoDB存儲引擎和XtraDB兩種數據表,而不能備份MyISAM數據表。
Innobackupex:是一個封裝了xtrabackup的perl腳本,支持同時備份InnoDB和MyISAM,但在對MyISAM備份時需要加一個全局的讀鎖
備份前查看資料庫的存儲引擎是什麼:
mysql> show variables like '%engine'; +------------------------+--------+ | Variable_name | Value | +------------------------+--------+ | default_storage_engine | InnoDB | | storage_engine | InnoDB | +------------------------+--------+ 2 rows in set (0.00 sec)
innobackupex的參數比較多,詳細的參數可以參考學習下麵一位博友的文章,寫的很詳細
https://www.cnblogs.com/zhoujinyi/p/5893333.html
進行全備
[root@anan dbbak]# innobackupex --defaults-file=/etc/my.cnf --user=root --password=fsz... ./ InnoDB Backup Utility v1.5.1-xtrabackup; Copyright 2003, 2009 Innobase Oy and Percona Ireland Ltd 2009-2012. All Rights Reserved. This software is published under the GNU GENERAL PUBLIC LICENSE Version 2, June 1991. 180308 06:11:41 innobackupex: Connecting to MySQL server with DSN 'dbi:mysql:;mysql_read_default_file=/etc/my.cnf;mysql_read_default_group=xtrabackup' as 'root' (using password: YES). 180308 06:11:41 innobackupex: Connected to MySQL server IMPORTANT: Please check that the backup run completes successfully. At the end of a successful backup run innobackupex prints "completed OK!". innobackupex: Using mysql server version 5.5.32-log innobackupex: Created backup directory /tmp/dbbak/2018-03-08_06-11-41 180308 06:11:41 innobackupex: Starting ibbackup with command: xtrabackup_55 --defaults-file="/etc/my.cnf" --defaults-group="mysqld" --backup --suspend-at-end --target-dir=/tmp/dbbak/2018-03-08_06-11-41 --tmpdir=/tmp innobackupex: Waiting for ibbackup (pid=3736) to suspend innobackupex: Suspend file '/tmp/dbbak/2018-03-08_06-11-41/xtrabackup_suspended_2' xtrabackup_55 version 2.1.2 for Percona Server 5.5.16 Linux (x86_64) (revision id: 611) xtrabackup: uses posix_fadvise(). xtrabackup: cd to /usr/local/mysqldata xtrabackup: Target instance is assumed as followings. xtrabackup: innodb_data_home_dir = ./ xtrabackup: innodb_data_file_path = ibdata1:10M:autoextend xtrabackup: innodb_log_group_home_dir = ./ xtrabackup: innodb_log_files_in_group = 2 xtrabackup: innodb_log_file_size = 5242880 >> log scanned up to (1645580) [01] Copying ./ibdata1 to /tmp/dbbak/2018-03-08_06-11-41/ibdata1 [01] ...done >> log scanned up to (1645580) 180308 06:11:43 innobackupex: Continuing after ibbackup has suspended 180308 06:11:43 innobackupex: Starting to lock all tables... 180308 06:11:43 innobackupex: All tables locked and flushed to disk 180308 06:11:43 innobackupex: Starting to backup non-InnoDB tables and files innobackupex: in subdirectories of '/usr/local/mysqldata' innobackupex: Backing up files '/usr/local/mysqldata/performance_schema/*.{frm,isl,MYD,MYI,MAD,MAI,MRG,TRG,TRN,ARM,ARZ,CSM,CSV,opt,par}' (18 files) innobackupex: Backing up file '/usr/local/mysqldata/data1/db.opt' innobackupex: Backing up file '/usr/local/mysqldata/data1/tb1.frm' innobackupex: Backing up file '/usr/local/mysqldata/sysdb/db.opt' innobackupex: Backing up file '/usr/local/mysqldata/sysdb/tb1.frm' innobackupex: Backing up files '/usr/local/mysqldata/mysql/*.{frm,isl,MYD,MYI,MAD,MAI,MRG,TRG,TRN,ARM,ARZ,CSM,CSV,opt,par}' (72 files) >> log scanned up to (1645580) innobackupex: Backing up file '/usr/local/mysqldata/suzhou/db.opt' innobackupex: Backing up file '/usr/local/mysqldata/suzhou/tb1.frm' innobackupex: Backing up file '/usr/local/mysqldata/suzhou/fengsuzhou.frm' 180308 06:11:44 innobackupex: Finished backing up non-InnoDB tables and files 180308 06:11:44 innobackupex: Waiting for log copying to finish xtrabackup: The latest check point (for incremental): '1645580' xtrabackup: Stopping log copying thread. .>> log scanned up to (1645580) xtrabackup: Transaction log of lsn (1645580) to (1645580) was copied. 180308 06:11:45 innobackupex: All tables unlocked innobackupex: Backup created in directory '/tmp/dbbak/2018-03-08_06-11-41' innobackupex: MySQL binlog position: filename 'master-bin.000011', position 3736 180308 06:11:45 innobackupex: Connection to database server closed 180308 06:11:45 innobackupex: completed OK!
完整的備份過程信息可以細細查看
備份後在備份目錄會生成一個時間戳目錄,備份的數據文件就放在該目錄中
熱備恢復
恢復前可以測試一下把原來的數據目錄清空然後恢復看看效果
1.先關閉服務 service mysqld stop 2.重命名數據目錄並創建原同名目錄 mv mysqldata mysqldatabak mkdir mysqldata
3.還原後再重新修改新的數據目錄的許可權
chown -R mysql:mysql mysqldata/*
4.啟動服務
service mysqld start
還原數據
#提交或者回滾事務 [root@anan dbbak]# innobackupex --apply-log ./2018-03-08_06-11-41/ #上面這指令是利用--apply-log的作用是通過回滾未提交的事務及同步已經提交的事務至數據文件使數據文件處於一致性狀態 #恢複數據 [root@anan dbbak]# innobackupex --defaults-file=/etc/my.cnf --copy-back ./2018-03-08_06-11-41/ 還可以使用 【--database=“db1 db2 db3”】選項備份指定的資料庫,多個資料庫用空格隔開
還可以使用 【--databases="db1.tb1 db2.tb2 db3.tb3"】方式備份不同庫的不同表,同樣多庫用空格隔開
最後檢查數據和查看數據目錄
mysql> select * from tb1; +------+------+ | id | name | +------+------+ | 1 | A | | 2 | B | | 3 | C | | 4 | D | | 5 | E | | 6 | F | | 4 | D | | 5 | E | | 6 | F | +------+------+ 9 rows in set (0.01 sec)
創建增量備
在第一次全備的基礎上進行增量備份,接著再繼續往資料庫里寫入一些數據
mysql> insert into tb1 values (7,'G'),(8,'H'),(9,'K'); Query OK, 3 rows affected (0.03 sec)
執行增量備份
[root@anan dbbak]# innobackupex --apply-log --redo-only ./2018-03-08_06-11-41/
---恢復內容結束---
MySQL的備份主要分為邏輯備份和物理備份
邏輯備份
在MySQL中邏輯備份的最大優點是對各種存儲引擎都可以用同樣的方法來備份。而物理備份則不同,不同的存儲引擎有著不同的備份方法。Mysql中的邏輯備份是將資料庫中的數據備份為一個文本文件,備份的文件可以被查看和編輯,在mysql中常用mysqldump工具來完成邏輯備份。
mysqldump的使用方法:
查看測試資料庫信息 mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | suzhou | | sysdb | | test | +--------------------+ 6 rows in set (0.01 sec)
1.備份指定的資料庫: suzhou
[root@anan tmp]# mysqldump -u root -p suzhou > ./dbbak/suzhou.sql --備份suzhou 資料庫
Enter password:
[root@anan tmp]#
[root@anan tmp]# cd dbbak/ && ls
suzhou.sql --備份生成的文件
[root@anan dbbak]#
2.備份指定的某個庫中的某個表:tb1
[root@anan dbbak]# mysqldump -u root -p suzhou tb1 > ./tb1.sql
Enter password:
[root@anan dbbak]# ls
suzhou.sql tb1.sql
3.備份所有資料庫
mysqldump -uroot -p --all-database > ./alldb.sql
Enter password:
[root@anan dbbak]# ls
alldb.sql suzhou.sql tb1.sql
需要強調的是,為了保證數據備份的一致性,MyISAM存儲引擎在備份時需要加上 -l (lock table)參數,表示將所有表加上讀鎖。在備份期間,所有表將引擎只能讀不能進行更新數據。但是對於事物存儲引擎(InnoDB和BDB)來說,可以使用--single-transaction,該選項將使InnoDB引擎得到一個快照,使得備份的數據能夠保證一致性。
完全恢復
mysqldump的恢復也比較簡單,將備份的數據文件作為輸入導入。但是註意,備份恢復後數據並不完整,因為備份後資料庫中又會產生新的數據記錄,需要將備份後的日誌進行重寫。使用方法:mysqlbinlog binlog-file | mysql -u -p
下麵進行一次完整的備份與恢復
新建一個資料庫 data1,庫中有tb1,信息如下:
mysql> select * from tb1; +------+------+ | id | name | +------+------+ | 1 | A | | 2 | B | | 3 | C | +------+------+ 3 rows in set (0.00 sec)
備份data1資料庫
mysql> show master status;
+-------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+------------------+
| master-bin.000010 | 2935 | | |
+-------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
備份前先查看一下當前使用的bin-log日誌文件編號
[root@anan dbbak]# mysqldump -uroot -p -l -F data1 > ./data1.sql Enter password: [root@anan dbbak]# ls data1.sql --備份指令中使用的-l :鎖定所有表為只讀狀態; -F : 刷新日誌文件
再看bin-log文件信息:
mysql> show master status;
+-------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+------------------+
| master-bin.000011 | 107 | | |
+-------------------+----------+--------------+------------------+
下麵再對data1庫中寫入數據,寫入後bin-log文件中的position的數值會產生變化。
mysql> insert into tb1 values (4,'D'),(5,'E'),(6,'F');
Query OK, 3 rows affected (0.03 sec)
再看bin-log文件的position值
mysql> show master status;
+-------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+------------------+
| master-bin.000011 | 313 | | |
+-------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
刪除資料庫data1,模擬故障
mysql> drop database data1; Query OK, 1 row affected (0.03 sec) mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | suzhou | | sysdb | | test | +--------------------+ 6 rows in set (0.00 sec)
data1 庫已經被刪除了
恢複數據庫 data1
[root@anan dbbak]# mysql -uroot -p data1 < ./data1.sql Enter password: ......
......
mysqldump: Got error: 1049: Unknown database 'data1' when selecting the database 【恢復的資料庫必須要在資料庫中存在,恢復前先新建一個同名的資料庫 data1】
【註意:mysqldump只用來備份數據,恢複數據使用 mysql指令,第一次恢復大意地使用mysqldump指令來恢復,怎麼也沒有成功,也沒有報錯,還是得細心才是】
[root@anan dbbak]# mysql -u root -p data1 < ./data1.sql --恢復備份
Enter password:
[root@anan dbbak]#
查看恢復後的數據如下,後寫入的數據還沒有
mysql> select * from tb1;
+------+------+
| id | name |
+------+------+
| 1 | A |
| 2 | B |
| 3 | C |
+------+------+
3 rows in set (0.00 sec)
恢復備份後的數據,由於失誤操作,日誌文件中存在誤操作的語句,所以可以可以使用基於時間點和基於位置的恢復。下麵以位置恢復。
恢復前需要先看新寫入的數據在bin-log日誌文件中的position值: mysqlbinlog master-bin.000011
[root@anan mysqldata]# mysqlbinlog master-bin.000011 | cat -n | grep -C 5 'insert' 1 /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/; 2 /*!40019 SET @@session.max_insert_delayed_threads=0*/; 3 /*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/; 4 DELIMITER /*!*/; 5 # at 4 6 #180308 2:28:18 server id 2 end_log_pos 107 Start: binlog v 4, server v 5.5.32-log created 180308 2:28:18 7 # Warning: this binlog is either in use or was not closed properly. -- 24 /*!*/; 25 # at 176 26 #180308 2:33:31 server id 2 end_log_pos 286 Query thread_id=13 exec_time=0 error_code=0 27 use `data1`/*!*/; 28 SET TIMESTAMP=1520447611/*!*/; 29 insert into tb1 values (4,'D'),(5,'E'),(6,'F') 30 /*!*/; 31 # at 286 32 #180308 2:33:31 server id 2 end_log_pos 313 Xid = 611 33 COMMIT/*!*/; 34 # at 313 -- 213 BEGIN 214 /*!*/; 215 # at 3393 216 #180308 2:33:31 server id 2 end_log_pos 3503 Query thread_id=13 exec_time=4490 error_code=0 217 SET TIMESTAMP=1520447611/*!*/; 218 insert into tb1 values (4,'D'),(5,'E'),(6,'F') 219 /*!*/; 220 # at 3503 221 #180308 2:33:31 server id 2 end_log_pos 3530 Xid = 916 222 COMMIT/*!*/; 223 DELIMITER ;
使用日誌文件恢復後寫入的數據 ;使用mysqlbinlog 指令
[root@anan mysqldata]# mysqlbinlog --start-position='176' --stop-position='286' ./master-bin.000011 | mysql -u root -p
Enter password:
[root@anan mysqldata]#
再看資料庫信息
mysql> select * from tb1;
+------+------+
| id | name |
+------+------+
| 1 | A |
| 2 | B |
| 3 | C |
| 4 | D |
| 5 | E |
| 6 | F |
+------+------+
6 rows in set (0.01 sec)
物理備份和恢復
物理備份又分為冷備和熱備兩種,和邏輯備份相比,它最大的優點是備份和恢復的速度更快,因為物理備份的原來是基於文件的cp。
冷備份
冷備份其實就是停掉資料庫服務,cp數據文件的方法,這種方法對MyISAM和InnoDB引擎都適合,但是一般很少用,因為很多應用是不允許停機的。
熱備份
在MySQL中,對於不同的存儲引擎熱備的方法也有所不同,下麵主要介紹MyISAM和InnoDB兩種常用的存儲引擎的熱備方法。
MyISAM存儲引擎
MyISAM存儲引擎的熱備方法本質其實就是將要備份的表加讀鎖,然後在cp數據文件到備份目錄,常用的方法有以下兩種:
方法1:使用mysqlhotcopy工具
方法2:使用手動鎖表copy
首先將資料庫中的所有表加讀鎖: flush tables for read ; 然後再cp數據文件到備份目錄即可。
InnoDB存儲引擎
InnoDB存儲引擎資料庫可以使用Xtrabackup工具來備份
下麵仔細介紹xtarbackup熱備工具的使用:
xtarbackup熱備工具的使用
xtrabackup是percona公司參與開發的一款基於InnoDB的線上熱備工具,具有開源,免費,支持線上熱備,備份恢復速度快,占用磁碟空間小等特點。
xtrabackup包含兩個主要的工具。即xtrabackup和innobackupex,兩者區別如下:
xtrabackup:只能備份InnoDB存儲引擎和XtraDB兩種數據表,而不能備份MyISAM數據表。
Innobackupex:是一個封裝了xtrabackup的perl腳本,支持同時備份InnoDB和MyISAM,但在對MyISAM備份時需要加一個全局的讀鎖
備份前查看資料庫的存儲引擎是什麼:
mysql> show variables like '%engine'; +------------------------+--------+ | Variable_name | Value | +------------------------+--------+ | default_storage_engine | InnoDB | | storage_engine | InnoDB | +------------------------+--------+ 2 rows in set (0.00 sec)
innobackupex的參數比較多,詳細的參數可以參考學習下麵一位博友的文章,寫的很詳細
https://www.cnblogs.com/zhoujinyi/p/5893333.html
進行全備
[root@anan dbbak]# innobackupex --defaults-file=/etc/my.cnf --user=root --password=fsz... ./ InnoDB Backup Utility v1.5.1-xtrabackup; Copyright 2003, 2009 Innobase Oy and Percona Ireland Ltd 2009-2012. All Rights Reserved. This software is published under the GNU GENERAL PUBLIC LICENSE Version 2, June 1991. 180308 06:11:41 innobackupex: Connecting to MySQL server with DSN 'dbi:mysql:;mysql_read_default_file=/etc/my.cnf;mysql_read_default_group=xtrabackup' as 'root' (using password: YES). 180308 06:11:41 innobackupex: Connected to MySQL server IMPORTANT: Please check that the backup run completes successfully. At the end of a successful backup run innobackupex prints "completed OK!". innobackupex: Using mysql server version 5.5.32-log innobackupex: Created backup directory /tmp/dbbak/2018-03-08_06-11-41 180308 06:11:41 innobackupex: Starting ibbackup with command: xtrabackup_55 --defaults-file="/etc/my.cnf" --defaults-group="mysqld" --backup --suspend-at-end --target-dir=/tmp/dbbak/2018-03-08_06-11-41 --tmpdir=/tmp innobackupex: Waiting for ibbackup (pid=3736) to suspend innobackupex: Suspend file '/tmp/dbbak/2018-03-08_06-11-41/xtrabackup_suspended_2' xtrabackup_55 version 2.1.2 for Percona Server 5.5.16 Linux (x86_64) (revision id: 611) xtrabackup: uses posix_fadvise(). xtrabackup: cd to /usr/local/mysqldata xtrabackup: Target instance is assumed as followings. xtrabackup: innodb_data_home_dir = ./ xtrabackup: innodb_data_file_path = ibdata1:10M:autoextend xtrabackup: innodb_log_group_home_dir = ./ xtrabackup: innodb_log_files_in_group = 2 xtrabackup: innodb_log_file_size = 5242880 >> log scanned up to (1645580) [01] Copying ./ibdata1 to /tmp/dbbak/2018-03-08_06-11-41/ibdata1 [01] ...done >> log scanned up to (1645580) 180308 06:11:43 innobackupex: Continuing after ibbackup has suspended 180308 06:11:43 innobackupex: Starting to lock all tables... 180308 06:11:43 innobackupex: All tables locked and flushed to disk 180308 06:11:43 innobackupex: Starting to backup non-InnoDB tables and files innobackupex: in subdirectories of '/usr/local/mysqldata' innobackupex: Backing up files '/usr/local/mysqldata/performance_schema/*.{frm,isl,MYD,MYI,MAD,MAI,MRG,TRG,TRN,ARM,ARZ,CSM,CSV,opt,par}' (18 files) innobackupex: Backing up file '/usr/local/mysqldata/data1/db.opt' innobackupex: Backing up file '/usr/local/mysqldata/data1/tb1.frm' innobackupex: Backing up file '/usr/local/mysqldata/sysdb/db.opt' innobackupex: Backing up file '/usr/local/mysqldata/sysdb/tb1.frm' innobackupex: Backing up files '/usr/local/mysqldata/mysql/*.{frm,isl,MYD,MYI,MAD,MAI,MRG,TRG,TRN,ARM,ARZ,CSM,CSV,opt,par}' (72 files) >> log scanned up to (1645580) innobackupex: Backing up file '/usr/local/mysqldata/suzhou/db.opt' innobackupex: Backing up file '/usr/local/mysqldata/suzhou/tb1.frm' innobackupex: Backing up file '/usr/local/mysqldata/suzhou/fengsuzhou.frm' 180308 06:11:44 innobackupex: Finished backing up non-InnoDB tables and files 180308 06:11:44 innobackupex: Waiting for log copying to finish xtrabackup: The latest check point (for incremental): '1645580' xtrabackup: Stopping log copying thread. .>> log scanned up to (1645580) xtrabackup: Transaction log of lsn (1645580) to (1645580) was copied. 180308 06:11:45 innobackupex: All tables unlocked innobackupex: Backup created in directory '/tmp/dbbak/2018-03-08_06-11-41' innobackupex: MySQL binlog position: filename 'master-bin.000011', position 3736 180308 06:11:45 innobackupex: Connection to database server closed 180308 06:11:45 innobackupex: completed OK!
完整的備份過程信息可以細細查看
備份後在備份目錄會生成一個時間戳目錄,備份的數據文件就放在該目錄中
熱備恢復
恢復前可以測試一下把原來的數據目錄清空然後恢復看看效果
1.先關閉服務 service mysqld stop 2.重命名數據目錄並創建原同名目錄 mv mysqldata mysqldatabak mkdir mysqldata
3.還原後再重新修改新的數據目錄的許可權
chown -R mysql:mysql mysqldata/*
4.啟動服務
service mysqld start
還原數據
#提交或者回滾事務 [root@anan dbbak]# innobackupex --apply-log ./2018-03-08_06-11-41/ #上面這指令是利用--apply-log的作用是通過回滾未提交的事務及同步已經提交的事務至數據文件使數據文件處於一致性狀態 #恢複數據 [root@anan dbbak]# innobackupex --defaults-file=/etc/my.cnf --copy-back ./2018-03-08_06-11-41/ 還可以使用 【--database=“db1 db2 db3”】選項備份指定的資料庫,多個資料庫用空格隔開
還可以使用 【--databases="db1.tb1 db2.tb2 db3.tb3"】方式備份不同庫的不同表,同樣多庫用空格隔開
最後檢查數據和查看數據目錄
mysql> select * from tb1; +------+------+ | id | name | +------+------+ | 1 | A | | 2 | B | | 3 | C | | 4 | D | | 5 | E | | 6 | F | | 4 | D | | 5 | E | | 6 | F | +------+------+ 9 rows in set (0.01 sec)
創建增量備
在進行增量部分前先進行一次基礎備份 innobackupex --user=root --password=fsz... --defaults-file=/etc/my.cnf /tmp/dbbak/
基礎備份完成後,再對資料庫進行一些數據操作,這裡添加一個新表
mysql> create table tb2 ( -> id int(10), -> name varchar(10) -> ); Query OK, 0 rows affected (0.07 sec) mysql> insert into tb2 values (1,'A'); Query OK, 1 row affected (0.04 sec)
接著進行第一次增量備份
#第一次增量備份
innobackupex --user=root --password=fsz... --defaults-file=/etc/my.cnf --incremental /tmp/dbbak/increment_one/
--incremental-basedir=/tmp/dbbak/2018-03-08_10-07-07/
第一次增量備份後,再接著寫兩條數據進去,然後進行第二次增量備份
mysql> insert into tb2 values (2,'B'),(3,'C'); Query OK, 2 rows affected (0.05 sec) Records: 2 Duplicates: 0 Warnings: 0 mysql> SELECT * FROM tb2; +------+------+ | id | name | +------+------+ | 1 | A | | 2 | B | | 3 | C | +------+------+ 3 rows in set (0.00 sec) 最終有三條數據
#第二次增量備份 innobackupex --user=root --password=fsz... --defaults-file=/etc/my.cnf --incremental /tmp/dbbak/increment_two/ --incremental-basedir=/tmp/dbbak/increment_one/2018-03-08_10-12-39/ 兩次增量備份後備份目錄生成備份文件如下 [root@anan dbbak]# tree -d ./ . ├── 2018-03-08_10-07-07 --基礎備份 │ ├── data1 │ ├── mysql │ ├── performance_schema │ ├── suzhou │ ├── sysdb │ └── test ├── increment_one │ └── 2018-03-08_10-12-39 --第一次增量備份 │ ├── data1 │ ├── mysql │ ├── performance_schema │ ├── suzhou │ ├── sysdb │ └── test └── increment_two └── 2018-03-08_10-13-43 --第二次增量備份 ├── data1 ├── mysql ├── performance_schema ├── suzhou ├── sysdb └── test
增量備份恢復過程大致如下:
1.恢復基礎備份(全備)
2.恢復增量備份到基礎備份(開始恢復的增量備份需要增加 --redo-only 參數,到恢復最後一次增量備份要去掉 --redo-only 參數)
3.對整體的基礎備份進行恢復,回滾那些未提交的數據。
恢復基礎備份數據(註意:這裡一定要加 --redo-only 參數該參數的意思是只應用xtrabackup日誌中已經提交的事務數據,不回滾還未提交的數據)
innobackupex --apply-log --redo-only /tmp/dbbak/2018-03-08_10-07-07/
將第一次增量備份increment_one應用到基礎備份 2018-03-08_10-07-07 中 innobackupex --apply-log --redo-only /tmp/dbbak/2018-03-08_10-07-07/ --incremental-dir=/tmp/dbbak/increment_one/2018-03-08_10-12-39/
將第二次增量備份 increment_two 應用到 基礎備份 2018-03-08_10-07-07,(註意:恢復最後一次增量備份需要去掉 --redo-only 參數,回滾xtrabackup日誌中那些未提交的數據)
innobackupex --apply-log /tmp/dbbak/2018-03-08_10-07-07/ --incremental-dir=/tmp/dbbak/increment_two/2018-03-08_10-13-43/
把所有合在一起的基礎備份進行一次 apply 操作,回滾未提交的數據;
#利用--apply-log的作用是通過回滾未提交的事務及同步已經提交的事務至數據文件使數據文件處於一致性狀態 innobackupex --apply-log /tmp/dbbak/2018-03-08_10-07-07
把恢復完的備份文件複製到數據文件目錄中,賦權,然後重啟服務大致步驟如下:
1,關閉服務 service mysqld stop 2,備份原數據目錄 mv mysqldata mysqldata.old 3,創建新的同名數據目錄 mkdir mysqldata 4,複製備份數據文件 innobackupex --defaults-file=/etc/my.cnf --copy-back /tmp/dbbak/2018-03-08_10-07-07/ 5,對新的數據目錄賦權 chown -R mysql:mysql ./mysqldata 6,重啟服務 service mysqld start
最後查看恢復後的數據
Database changed mysql> show tables; +-----------------+ | Tables_in_data1 | +-----------------+ | tb1 | | tb2 | +-----------------+ 2 rows in set (0.00 sec) mysql> select * from tb2; +------+------+ | id | name | +------+------+ | 1 | A | | 2 | B | | 3 | C | +------+------+ 3 rows in set (0.03 sec)