基於邏輯備份工具mysqldump備份

備份方式一:基於邏輯備份工具mysqldump備份mysql

1、mysqldump: MySQL客戶端工具;邏輯備份工具,查詢請求轉換爲批量插入的insert語句,保存爲SQL腳本;sql

         備份整個服務器,單個或部分數據庫,單個或部分表,表中某些行,存儲過程,存儲函數,觸發器;數據庫

         能自動記錄備份時的二進制日誌文件及相應position服務器

 

1.1直接在mysqldump命令中加讀鎖ide

         -x --lock-all-tables 在備份前鎖定全部表,僅對需備份的數據庫函數

         -l --lock-tables 在備份前鎖定單表,備一張前鎖一張,但多表間的時間不一致不能保證數據一致。所以只有在備份單表時使用此選項工具

[root@station253 data]# mysqldump -uroot -predhat --databases school cactidb --lock-all-tables > /backup/school_cactidb_full.sqlspa

mysql> show master status;rest

| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |日誌

| mysql-bin.000001 |     1314 |              |                  |

還原數據庫,記得先刪除源庫

mysql> source /backup/school_cactidb_full.sql;

 

1.2--master-data[=#]

這個參數在創建slave數據庫的時候會用到,默認爲0,不作CHANGE MASTER TO這個語句,當這個參數的值爲1的時候,mysqldump出來的文件就會包括CHANGE MASTER TO這個語句,CHANGE MASTER TO後面緊接着就是fileposition的記錄,fileposition記錄的位置就是slavemaster端複製文件的起始位置。默認狀況下這個值是1

當這個值是2的時候,chang master to也是會寫到dump文件裏面去的,可是不會有上面那個做用了,自動註釋掉。

[root@station253 data]# mysqldump -uroot -predhat --master-data=2 --databases school cactidb --lock-all-tables > /backup/school_cactidb_full_3.sql

[root@station253 data]# cat /backup/school_cactidb_full_3.sql | grep 'CHANGE MASTER'

-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=1314;

 

1.3 mysqldump

--lock-all-tables 鎖定全部表,全部用戶不能執行寫表。對於InnoDB引擎鎖定全部表未必當即生效,buffer pool還未能寫入磁盤。對於全是InnoDB引擎的數據庫使用另一個--single-transaction: 基於此選項能使mysqlmysqldump建立一個單一大事務應用於所有數據庫,對每張innoDB表建立快照,基於快照實現熱備InnoDB表;

由此,不須要同時使用--lock-all-tables;但會長時間佔用系統資源

完整的備份恢復過程:

         備份備份策略:例如每週一次徹底備份+天天一次增量備份(天天定時滾動後備份當天產生二進制日誌)

         mysqldump+二進制日誌

    備份步驟:

    1.徹底備份

    2.修庫並增量日誌備份

    3.修庫並即時點日誌備份

1.3.1週一作完整備份

[root@station253 data]# mysqldump -uroot -predhat --single-transaction --master-data=2 --databases cactidb > /backup/cactidb_`date +%F`.sql

[root@station253 backup]# ll cactidb_2014-05-22.sql

-rw-r--r-- 1 root root 2123 5  22 23:59 cactidb_2014-05-22.sql

mysql> show master status;           查看二進制日誌的當前位置

| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |

| mysql-bin.000001 |     1314 |              |                  |

mysql> show binlog events in 'mysql-bin.000001';

| Log_name         | Pos  | Event_type  | Server_id | End_log_pos | Info                               

| mysql-bin.000001 | 1108 | Query       |         1 |        1216 | use `cactidb`; insert into tb1 values(1,'Tom'),(2,'Mary')

| mysql-bin.000001 | 1243 | Query       |         1 |        1314 | FLUSH TABLES      

 

1.3.2次日新建表,導出上次徹底備份到昨天增量二進制日誌

mysql> use cactidb;

mysql> CREATE TABLE tb4(id INT);

mysql> INSERT INTO tb4 VALUES (1),(2),(4);

mysql> show master status;                查看二進制日誌的當前位置

| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |

| mysql-bin.000001 |     1602 |              |                  |

導出上次徹底備份到昨天增量二進制日誌

[root@station253 data]# mysqlbinlog --start-position=1314 --stop-position=1602 mysql-bin.000001 > /backup/cactidb_`date +%F_%H`.sql   

[root@station253 backup]# cat cactidb_2014-05-23_00.sql

# at 1314

#140523  0:12:00 server id 1  end_log_pos 1404      Query       thread_id=3     exec_time=0    error_code=0

use `cactidb`/*!*/;

# at 1575

#140523  0:12:19 server id 1  end_log_pos 1602      Xid = 201

 

1.3.3第三天新建表,導出上次增量備份到即時點日誌

mysql> use cactidb;

mysql> INSERT INTO tb4 values (5),(9);       未備份的操做

mysql> show master status;               查看二進制日誌的當前位置

| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |

| mysql-bin.000001 |     1796 |              |                  |

mysql> show binlog events in 'mysql-bin.000001';    查看二進制日誌的詳細內容

| Log_name         | Pos  | Event_type  | Server_id | End_log_pos | Info                                

| mysql-bin.000001 | 1673 | Query       |         1 |        1769 | use `cactidb`; INSERT INTO tb4 values (5),(9)                                                                                                                                   | mysql-bin.000001 | 1769 | Xid         |         1 |       1796| COMMIT /* xid=208 */             

 

1.3.4模擬數據庫崩潰

mysql> drop database cactidb;

mysql> show binlog events in 'mysql-bin.000001';

| mysql-bin.000001 | 1796 | Query       |         1 |        1883 | drop database cactidb                  

 

1.4恢復數據庫步驟

   1. 導出上增點到即時點的二進制日誌

   2. 重啓並關閉二進制日誌

   3. 恢復徹底備份,增量日誌,即時點日誌

   4. 打開二進制日誌

1.4.1記錄未備份的二進制日誌,先找出從上次增量備份結束1602DB崩潰前drop database 1796的二進制日誌

[root@station253 data]# mysqlbinlog --start-position=1602 --stop-position=1796 mysql-bin.000001 > /tmp/cactidb.sql

1.4.2模擬服務器崩潰,重啓服務並從新登陸

[root@station253 data]# ls mysql-bin.*

mysql-bin.000001  mysql-bin.index

[root@station253 data]# service mysqld restart

[root@station253 data]# ls mysql-bin.*

mysql-bin.000001  mysql-bin.000002  mysql-bin.index

[root@station253 ~]# mysql -uroot -predhat

mysql> SET sql_log_bin=0;關閉二進制日誌 ,防止導入時產生重複日誌

mysql> show master status;

| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |

| mysql-bin.000002 |      107 |              |                  |

mysql> 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 |         107 | Server ver: 5.5.33-log, Binlog ver: 4 |

#mysql> flush logs; 滾動出新日誌,如爲記錄能在位於頁首,這裏能夠不用

1.4.3 恢復備份和日誌

  1.恢復徹底備份

[root@station253 ~]# mysql -uroot -predhat < /backup/cactidb_2014-05-22.sql

 2.恢復增量二進制日誌

[root@station253 ~]# mysql -uroot -predhat < /backup/cactidb_2014-05-23_00.sql

 3.恢復未備份的二進制日誌

[root@station253 ~]# mysql -uroot -predhat < /tmp/cactidb.sql

 4.檢查恢復的數據庫

mysql> use cactidb;

Database changed

mysql> show tables;

| Tables_in_cactidb |

| tb1               |

| tb4               |

mysql> select * from tb4;

| id   |

|    1 |

|    2 |

|    4 |

|    5 |

|    9 |

mysql> show master status;   

| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |

| mysql-bin.000002 |     1473 |              |                  |

mysql> show binlog events in 'mysql-bin.000002';

| mysql-bin.000002 | 1350 | Query       |         1 |        1446 | use `cactidb`; INSERT INTO tb4 values (5),(9)                                                                                          | mysql-bin.000002 | 1446 | Xid         |         1 |        1473 | COMMIT /* xid=86 */

1.4.4 打開二進制日誌

mysql> SET sql_log_bin=1;

相關文章
相關標籤/搜索