mariadb備份與恢復工具

1.mysqldump:

shell> mysqldump [options] db_name [tbl_name ...]  #可以備份單個數據庫的單個表,不會自動創建數據庫,恢復時需要先創建數據庫
shell> mysqldump [options] --databases db_name ...  
shell> mysqldump [options] --all-databases
例如:
mysqldump -uroot --databases hellodb > /root/hellodbbak.sql #僅備份一個數據庫
mysqldump -uroot --databases hellodb mysql > /root/dbbak.sql #同時備份多個庫

對於MyIsam引擎的數據庫:

MyISAM:支持溫備;鎖定備份庫,而後啓動備份操作;
鎖定方法:
    --lock-all-tables:鎖定所有庫的所有表;
    --lock-tables:對於每個單獨的數據庫,在啓動備份之前鎖定其所有表

上面兩個參數對InnoDB表一樣生效,實現溫備;
InnoDB:支持熱備;
    --single-transaction 備份數據前啓動一個事務,達到數據一致效果

其它選項:
    -E, --events:備份指定數據庫相關的所有event scheduler;
    -R, --routines:備份指定數據庫相關的所有存儲過程和存儲函數;
    --triggers:備份表相關的觸發器;
    --master-data[=#]:
        1:記錄爲CHANGE MASTER TO語句,此語句不被註釋;
        2:記錄爲註釋的CHANGE MASTER TO語句;

        CHANGE MASTER TO記錄了啓動備份前時間處於哪個二進制文件的哪個位置

    --flush-logs:鎖定表完成後,執行flush logs命令可以實現二進制日誌滾動

注意:二進制日誌文件不應該與數據文件放在同一磁盤;二進制日誌文件記錄了全庫信息,不能執行單獨庫還原,除非編輯它只針對一個庫作用後再還原。

應該經常對二進制文件做增量備份,例如每過半填,讓二進制日誌自動滾動一次,把之前的備份起來。

示例:
[root@testserver ~]# mysqldump -uroot --databases hellodb --lock-tables --master-data=2 > /root/hellodbbak.sql
[root@testserver ~]# less hellodbbak.sql | grep CHANGE
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000011', MASTER_LOG_POS=7655;#這樣就得到了當前使用的二進制日誌文件名和當前記錄位置
修改當前庫裏的某些數據:
MariaDB [hellodb]> INSERT INTO students (Name,Age,Gender,ClassID,TeacherID) VALUES ('Chao Gai',47,'M',3,7);
Query OK, 1 row affected (0.00 sec)
DELETE FROM students WHERE StuID=3;
Query OK, 1 row affected (0.00 sec)
此時mysql服務器掛了,我們把數據還原到另一個服務器上,執行恢復操作:
還原前要注意先要關掉二進制日誌,否則產生大量IO  set sql_log_bin=0,等還原完成再開啓,還原時在mysql交互式模式下用source命令
[root@node1 ~]# mysql < hellodbbak.sql
查看恢復的狀況:發現沒有完全恢復:晁蓋沒進來,謝煙客還在
MariaDB [hellodb]> SELECT * FROM students;
+-------+---------------+-----+--------+---------+-----------+
| StuID | Name          | Age | Gender | ClassID | TeacherID |
+-------+---------------+-----+--------+---------+-----------+
|     1 | Shi Zhongyu   |  22 | M      |       2 |         3 |
|     2 | Shi Potian    |  22 | M      |       1 |         7 |
|     3 | Xie Yanke     |  53 | M      |       2 |        16 |
|     4 | Ding Dian     |  32 | M      |       4 |         4 |
|     5 | Yu Yutong     |  26 | M      |       3 |         1 |
|     6 | Shi Qing      |  46 | M      |       5 |      NULL |
|     7 | Xi Ren        |  19 | F      |       3 |      NULL |
|     8 | Lin Daiyu     |  17 | F      |       7 |      NULL |
|     9 | Ren Yingying  |  20 | F      |       6 |      NULL |
|    10 | Yue Lingshan  |  19 | F      |       3 |      NULL |
|    11 | Yuan Chengzhi |  23 | M      |       6 |      NULL |
|    12 | Wen Qingqing  |  19 | F      |       1 |      NULL |
|    13 | Tian Boguang  |  33 | M      |       2 |      NULL |
|    14 | Lu Wushuang   |  17 | F      |       3 |      NULL |
|    15 | Duan Yu       |  19 | M      |       4 |      NULL |
|    16 | Xu Zhu        |  21 | M      |       1 |      NULL |
|    17 | Lin Chong     |  25 | M      |       4 |      NULL |
|    18 | Hua Rong      |  23 | M      |       7 |      NULL |
|    19 | Xue Baochai   |  18 | F      |       6 |      NULL |
|    20 | Diao Chan     |  19 | F      |       7 |      NULL |
|    21 | Huang Yueying |  22 | F      |       6 |      NULL |
|    22 | Xiao Qiao     |  20 | F      |       1 |      NULL |
|    23 | Ma Chao       |  23 | M      |       4 |      NULL |
|    24 | Xu Xian       |  27 | M      |    NULL |      NULL |
|    25 | Sun Dasheng   | 100 | M      |    NULL |      NULL |
+-------+---------------+-----+--------+---------+-----------+
25 rows in set (0.00 sec)
繼續使用二進制文件恢復:根據上面列出來的二進制日誌文件和當前記錄位置
[root@testserver ~]# mysqlbinlog --start-position=7655 /mydata/data/mysql-bin.000011 > incre.sql
看一下這個二進制日誌文件:
[root@testserver ~]# mysqlbinlog  --start-position 7655 /mydata/data/mysql-bin.000011
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#151110 21:35:57 server id 1  end_log_pos 245     Start: binlog v 4, server v 5.5.44-MariaDB-log created 151110 21:35:57 at startup
# Warning: this binlog is either in use or was not closed properly.
ROLLBACK/*!*/;
BINLOG '
vfJBVg8BAAAA8QAAAPUAAAABAAQANS41LjQ0LU1hcmlhREItbG9nAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAC98kFWEzgNAAgAEgAEBAQEEgAA2QAEGggAAAAICAgCAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAA8nm5Lg==
'/*!*/;
# at 7655
#151110 23:14:20 server id 1  end_log_pos 7726     Query    thread_id=10    exec_time=0    error_code=0
SET TIMESTAMP=1447168460/*!*/;
SET @@session.pseudo_thread_id=10/*!*/;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
SET @@session.sql_mode=0/*!*/;
SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
/*!\C utf8 *//*!*/;
SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=33/*!*/;
SET @@session.lc_time_names=0/*!*/;
SET @@session.collation_database=DEFAULT/*!*/;
BEGIN
/*!*/;
# at 7726
#151110 23:14:20 server id 1  end_log_pos 7754     Intvar
SET INSERT_ID=26/*!*/;
# at 7754
#151110 23:14:20 server id 1  end_log_pos 7907     Query    thread_id=10    exec_time=0    error_code=0
use `hellodb`/*!*/;
SET TIMESTAMP=1447168460/*!*/;
INSERT INTO students (Name,Age,Gender,ClassID,TeacherID) VALUES ('Chao Gai',47,'M',3,7)
/*!*/;
# at 7907
#151110 23:14:20 server id 1  end_log_pos 7934     Xid = 780
COMMIT/*!*/;
# at 7934
#151110 23:16:55 server id 1  end_log_pos 8005     Query    thread_id=10    exec_time=0    error_code=0
SET TIMESTAMP=1447168615/*!*/;
BEGIN
/*!*/;
# at 8005
#151110 23:16:55 server id 1  end_log_pos 8105     Query    thread_id=10    exec_time=0    error_code=0
SET TIMESTAMP=1447168615/*!*/;
DELETE FROM students WHERE StuID=3
/*!*/;
# at 8105
#151110 23:16:55 server id 1  end_log_pos 8132     Xid = 781
COMMIT/*!*/;
DELIMITER ;
# End of log file
ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
拷貝到那臺好的服務器進行還原:
[root@testserver ~]# scp incre.sql [email protected]:/root/
[email protected]'s password: 
incre.sql                                                100% 2373     2.3KB/s   00:00
[root@node1 ~]# mysql < incre.sql
查看:發現謝煙客沒了,晁蓋來了,數據被完整恢復了!
+-------+---------------+-----+--------+---------+-----------+
| StuID | Name          | Age | Gender | ClassID | TeacherID |
+-------+---------------+-----+--------+---------+-----------+
|     1 | Shi Zhongyu   |  22 | M      |       2 |         3 |
|     2 | Shi Potian    |  22 | M      |       1 |         7 |
|     4 | Ding Dian     |  32 | M      |       4 |         4 |
|     5 | Yu Yutong     |  26 | M      |       3 |         1 |
|     6 | Shi Qing      |  46 | M      |       5 |      NULL |
|     7 | Xi Ren        |  19 | F      |       3 |      NULL |
|     8 | Lin Daiyu     |  17 | F      |       7 |      NULL |
|     9 | Ren Yingying  |  20 | F      |       6 |      NULL |
|    10 | Yue Lingshan  |  19 | F      |       3 |      NULL |
|    11 | Yuan Chengzhi |  23 | M      |       6 |      NULL |
|    12 | Wen Qingqing  |  19 | F      |       1 |      NULL |
|    13 | Tian Boguang  |  33 | M      |       2 |      NULL |
|    14 | Lu Wushuang   |  17 | F      |       3 |      NULL |
|    15 | Duan Yu       |  19 | M      |       4 |      NULL |
|    16 | Xu Zhu        |  21 | M      |       1 |      NULL |
|    17 | Lin Chong     |  25 | M      |       4 |      NULL |
|    18 | Hua Rong      |  23 | M      |       7 |      NULL |
|    19 | Xue Baochai   |  18 | F      |       6 |      NULL |
|    20 | Diao Chan     |  19 | F      |       7 |      NULL |
|    21 | Huang Yueying |  22 | F      |       6 |      NULL |
|    22 | Xiao Qiao     |  20 | F      |       1 |      NULL |
|    23 | Ma Chao       |  23 | M      |       4 |      NULL |
|    24 | Xu Xian       |  27 | M      |    NULL |      NULL |
|    25 | Sun Dasheng   | 100 | M      |    NULL |      NULL |
|    26 | Chao Gai      |  47 | M      |       3 |         7 |
+-------+---------------+-----+--------+---------+-----------+
25 rows in set (0.00 sec)

2.基於LVM2進行熱備:

創建一個mysql的數據目錄,使用lvm:
[root@testserver ~]# fdisk /dev/sda
WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
         switch off the mode (command 'c') and change display units to
         sectors (command 'u').
 
Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 
Value out of range.
Partition number (1-4): 3
First cylinder (7859-15665, default 7859): 
Using default value 7859
Last cylinder, +cylinders or +size{K,M,G} (7859-15665, default 15665): +20G
 
Command (m for help): t
Partition number (1-4): 3
Hex code (type L to list codes): 8e
Changed system type of partition 3 to 8e (Linux LVM)
 
Command (m for help): w
The partition table has been altered!
做LVM:
[root@testserver ~]# partx -a /dev/sda
BLKPG: Device or resource busy
error adding partition 1
BLKPG: Device or resource busy
error adding partition 2
BLKPG: Device or resource busy
error adding partition 3
[root@testserver ~]# pvcreate /dev/sda3
  Physical volume "/dev/sda3" successfully created
[root@testserver ~]# vgcreate myvg /dev/sda3
  Volume group "myvg" successfully created
[root@testserver ~]# lvcreate -L 10G -n mydata myvg
  Logical volume "mydata" created
[root@testserver ~]# lvs
  LV     VG   Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  mydata myvg -wi-a----- 10.00g                                                    
  root   vg0  -wi-ao---- 20.00g                                                    
  swap   vg0  -wi-ao----  2.00g                                                    
  usr    vg0  -wi-ao---- 10.00g                                                    
  var    vg0  -wi-ao---- 20.00g
格式化:
mke2fs -t ext4 /dev/myvg/mydata    
開機自動掛載:
mkdir /mydata/
在fstab文件中添加/dev/myvg/mydata        /mydata                 ext4    defaults        0 0
mount -a
mkdir /mydata/data
chown mysql.mysql /mydata/data/ -R
編輯my.cnf:在mysqld段加如下內容
datadir=/mydata/data
innodb_file_per_table = ON
skip_name_resolve = ON
log-bin=mysql-bin
binlog_format=mixed
啓動mysql service mysqld start
現在先導入一個數據庫,就用前面的備份文件
cp hellodbbak.sql incre.sql /tmp
MariaDB [(none)]> set sql_log_bin=0   #臨時關閉二進制日誌
    -> ;
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> source /tmp/hellodbbak.sql; #導入
MariaDB [hellodb]> SET sql_log_bin=1;  #開啓二進制日誌
Query OK, 0 rows affected (0.00 sec)
查看二進制日誌狀態:
MariaDB [(none)]> SHOW MASTER LOGS;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |       245 |
| mysql-bin.000002 |       245 |
+------------------+-----------+
2 rows in set (0.00 sec)

MariaDB [(none)]> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000002 |      245 |              |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
因爲導入時關閉了二進制日誌功能,所以沒有產生新的二進制日誌,避免了大量IO
MariaDB [(none)]>  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 |         245 | Server ver: 5.5.44-MariaDB-log, Binlog ver: 4 |
+------------------+-----+-------------+-----------+-------------+-----------------------------------------------+

(1) 請求鎖定所有表;
    mysql> FLUSH TABLES WITH READ LOCK;
(2) 記錄二進制日誌文件及事件位置;可以先滾動下日誌
    mysql> FLUSH LOGS;
MariaDB [(none)]> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000002 |      245 |              |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

MariaDB [(none)]> FLUSH LOGS;
Query OK, 0 rows affected (0.49 sec)

MariaDB [(none)]> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000003 |      245 |              |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.02 sec)
    mysql> SHOW MASTER STATUS;
    好的方法:
    mysql -e 'flush logs;'
    mysql -e 'SHOW MASTER STATUS' > /tmp/pos.`date +%F`    
(3) 創建快照;
    [root@testserver ~]# lvcreate -L 500M -n mydata-snap -p r -s /dev/myvg/mydata 
      Logical volume "mydata-snap" created
(4) 釋放鎖
    mysql> UNLOCK TABLES;
(5) 掛載快照卷,執行數據備份;
(6) 備份完成後,刪除快照卷;
(7) 制定好策略,通過原卷備份二進制日誌;

刪除兩行試試:
MariaDB [(none)]> use hellodb;
Database changed
MariaDB [hellodb]> DELETE FROM students WHERE StuID=5
    -> ;
Query OK, 1 row affected (0.05 sec)

MariaDB [hellodb]> DELETE FROM students WHERE StuID=11;
Query OK, 1 row affected (0.08 sec)
二進制日誌position從245變到了642
MariaDB [hellodb]> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000003 |      642 |              |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.01 sec)
掛載快照卷:
mount -r /dev/myvg/mydata-snap /mnt/
查看快照裏的內容
[root@testserver data]# ls /mnt/
data
[root@testserver data]# ls /mnt/data/
aria_log.00000001  ibdata1      mysql             mysql-bin.index
aria_log_control   ib_logfile0  mysql-bin.000001  testserver.err
hellodb            ib_logfile1  mysql-bin.000002  testserver.pid
執行備份:
[root@testserver data]# cp -a /mnt/data/ /tmp/
[root@testserver mysql]# rm -rf mysql-bin.*
[root@testserver data]# cp -a /mydata/data/mysql-bin.000003 /tmp

模擬故障:
service mysqld stop
[root@testserver data]# rm -rf /mydata/data/*
還原:
root@testserver data]# cp -a /tmp/data/* /mydata/data/
重啓查看:
MariaDB [(none)]> SHOW MASTER LOGS;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |       245 |
+------------------+-----------+
1 row in set (0.00 sec)
MariaDB [hellodb]> SELECT * FROM students;
+-------+---------------+-----+--------+---------+-----------+
| StuID | Name          | Age | Gender | ClassID | TeacherID |
+-------+---------------+-----+--------+---------+-----------+
|     1 | Shi Zhongyu   |  22 | M      |       2 |         3 |
|     2 | Shi Potian    |  22 | M      |       1 |         7 |
|     3 | Xie Yanke     |  53 | M      |       2 |        16 |
|     4 | Ding Dian     |  32 | M      |       4 |         4 |
|     5 | Yu Yutong     |  26 | M      |       3 |         1 |
|     6 | Shi Qing      |  46 | M      |       5 |      NULL |
|     7 | Xi Ren        |  19 | F      |       3 |      NULL |
|     8 | Lin Daiyu     |  17 | F      |       7 |      NULL |
|     9 | Ren Yingying  |  20 | F      |       6 |      NULL |
|    10 | Yue Lingshan  |  19 | F      |       3 |      NULL |
|    11 | Yuan Chengzhi |  23 | M      |       6 |      NULL |
|    12 | Wen Qingqing  |  19 | F      |       1 |      NULL |
|    13 | Tian Boguang  |  33 | M      |       2 |      NULL |
|    14 | Lu Wushuang   |  17 | F      |       3 |      NULL |
|    15 | Duan Yu       |  19 | M      |       4 |      NULL |
|    16 | Xu Zhu        |  21 | M      |       1 |      NULL |
|    17 | Lin Chong     |  25 | M      |       4 |      NULL |
|    18 | Hua Rong      |  23 | M      |       7 |      NULL |
|    19 | Xue Baochai   |  18 | F      |       6 |      NULL |
|    20 | Diao Chan     |  19 | F      |       7 |      NULL |
|    21 | Huang Yueying |  22 | F      |       6 |      NULL |
|    22 | Xiao Qiao     |  20 | F      |       1 |      NULL |
|    23 | Ma Chao       |  23 | M      |       4 |      NULL |
|    24 | Xu Xian       |  27 | M      |    NULL |      NULL |
|    25 | Sun Dasheng   | 100 | M      |    NULL |      NULL |
+-------+---------------+-----+--------+---------+-----------+
25 rows in set (0.01 sec)
使用bin-log繼續繼續恢復:
查看位置:
less /tmp/pos.2015-11-11
 mysqlbinlog --start-position=245 /tmp/mysql-bin.000003 > /tmp/incre.sql
 mysql < /tmp/incre.sql(這裏應該使用source命令導入,臨時關閉sql_log_bin)
恢復完成: 
MariaDB [hellodb]> SELECT * FROM students;
+-------+---------------+-----+--------+---------+-----------+
| StuID | Name          | Age | Gender | ClassID | TeacherID |
+-------+---------------+-----+--------+---------+-----------+
|     1 | Shi Zhongyu   |  22 | M      |       2 |         3 |
|     2 | Shi Potian    |  22 | M      |       1 |         7 |
|     3 | Xie Yanke     |  53 | M      |       2 |        16 |
|     4 | Ding Dian     |  32 | M      |       4 |         4 |
|     6 | Shi Qing      |  46 | M      |       5 |      NULL |
|     7 | Xi Ren        |  19 | F      |       3 |      NULL |
|     8 | Lin Daiyu     |  17 | F      |       7 |      NULL |
|     9 | Ren Yingying  |  20 | F      |       6 |      NULL |
|    10 | Yue Lingshan  |  19 | F      |       3 |      NULL |
|    12 | Wen Qingqing  |  19 | F      |       1 |      NULL |
|    13 | Tian Boguang  |  33 | M      |       2 |      NULL |
|    14 | Lu Wushuang   |  17 | F      |       3 |      NULL |
|    15 | Duan Yu       |  19 | M      |       4 |      NULL |
|    16 | Xu Zhu        |  21 | M      |       1 |      NULL |
|    17 | Lin Chong     |  25 | M      |       4 |      NULL |
|    18 | Hua Rong      |  23 | M      |       7 |      NULL |
|    19 | Xue Baochai   |  18 | F      |       6 |      NULL |
|    20 | Diao Chan     |  19 | F      |       7 |      NULL |
|    21 | Huang Yueying |  22 | F      |       6 |      NULL |
|    22 | Xiao Qiao     |  20 | F      |       1 |      NULL |
|    23 | Ma Chao       |  23 | M      |       4 |      NULL |
|    24 | Xu Xian       |  27 | M      |    NULL |      NULL |
|    25 | Sun Dasheng   | 100 | M      |    NULL |      NULL |
+-------+---------------+-----+--------+---------+-----------+
23 rows in set (0.00 sec)

3.xtrabackup實現備份:

使用日誌序列號lsn來識別時增量備份還是完全備份,以及保證增量備份可以在線進行



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