MySQL備份恢復第二篇
MySQL中的資料恢復功能相比Oracle來說還是要單薄一些,而Oracle中的資料恢復相對來說自動化的程度要高一些。不過Mysql的二進位制日誌提供的資訊很豐富,而日誌資訊在Oracle中式完全遮蔽的,對於資料的恢復可能MySQL也很靈活。
我們來模擬一下透過完整備份+增量備份(binlog)的方式來恢復。
首先我們來選擇一個表new_test作為恢復的參考點。
mysql> select count(*)from new_test;
+----------+
| count(*) |
+----------+
| 32081 |
+----------+
1 row in set (0.02 sec)
檢視一下binlog的情況,這個可以作為後續的恢復使用。
mysql> show binary logs ;
+-----------------------+-----------+
| Log_name | File_size |
+-----------------------+-----------+
| mysql_oel1_bin.000001 | 3413422 |
| mysql_oel1_bin.000002 | 356 |
+-----------------------+-----------+
2 rows in set (0.00 sec)
mysql> \q
Bye
我們來做一個完全備份。
[mysql@oel1 full_bak]$ mysqldump -u root --lock-all-tables --master-data=2 --flush-logs --all-databases > full.sql
[mysql@oel1 full_bak]$ ll
total 1672
-rw-r--r-- 1 mysql dba 1704276 Apr 14 18:50 full.sql
做完備份,我們嘗試做一些資料變更,這樣模擬增量備份就更清楚了。
mysql> insert into new_test select *from new_test limit 1,5;
Query OK, 5 rows affected, 1 warning (0.01 sec)
Records: 5 Duplicates: 0 Warnings: 1
mysql> select count(*)from new_test;
+----------+
| count(*) |
+----------+
| 32086 |
+----------+
1 row in set (0.02 sec)
可以看到在全量備份的時候指定重新整理日誌,日誌增長了一個。
mysql> show binary logs;
+-----------------------+-----------+
| Log_name | File_size |
+-----------------------+-----------+
| mysql_oel1_bin.000001 | 3413422 |
| mysql_oel1_bin.000002 | 408 |
| mysql_oel1_bin.000003 | 356 |
+-----------------------+-----------+
3 rows in set (0.00 sec)
這個時候我們可以備份binlog,為了更加簡化,我們可以直接匯出二進位制日誌中的sql
[mysql@oel1 data]$ mysqlbinlog mysql_oel1_bin.000003 > /u02/mysql/bak/new_bak/new.sql
這個時候我們做了一個大膽的決定,刪除所有的資料,直接到data目錄下,全部刪除,刪刪刪。
[mysql@oel1 data]$ rm -rf *
這個時候直接去停Mysql都會有問題,我們來透過mysqladmin來停。
[mysql@oel1 data]$ mysqladmin -u root shutdown
[mysql@oel1 data]$ 150414 18:54:34 mysqld_safe mysqld from pid file /u02/mysql/data/oel1.pid ended
這個時候檢視mysql程式的情況。
[mysql@oel1 data]$ pstree -p|grep mysql
做完破壞,任務開始了,我們來做恢復,先來嘗試一下是否能啟動Mysql,毫無疑問啟動失敗。
[mysql@oel1 mysql]$MYSQL_BASE/bin/mysqld_safe --user=mysql --basedir=$MYSQL_BASE --datadir=$MYSQL_DATA --port=1550 --log-bin=mysql_oel1_bin --log-error=/u02/mysql/log/log_error.log --long_query_time=5 --slow-query-log=true --slow-query-log-file=/u02/mysql/log/slow_qeury.log &
[mysql@oel1 mysql]$ 150414 18:55:20 mysqld_safe Logging to '/u02/mysql/log/log_error.log'.
150414 18:55:21 mysqld_safe Starting mysqld daemon with databases from /u02/mysql/data
150414 18:55:22 mysqld_safe mysqld from pid file /u02/mysql/data/oel1.pid ended
[mysql@oel1 mysql]$ pstree -p|grep mysql
但是資料目錄下生成了一些檔案這是在初始化的時候建立的,但是最後無功而返。我們也不需要,可以直接刪除。
[mysql@oel1 mysql]$ cd data
[mysql@oel1 data]$ ll
total 110724
-rw-rw---- 1 mysql dba 56 Apr 14 18:55 auto.cnf
-rw-rw---- 1 mysql dba 12582912 Apr 14 18:55 ibdata1
-rw-rw---- 1 mysql dba 50331648 Apr 14 18:55 ib_logfile0
-rw-rw---- 1 mysql dba 50331648 Apr 14 18:55 ib_logfile1
-rw-rw---- 1 mysql dba 120 Apr 14 18:55 mysql_oel1_bin.000001
-rw-rw---- 1 mysql dba 24 Apr 14 18:55 mysql_oel1_bin.index
[mysql@oel1 data]$ rm -rf *
這個時候我們來做初始化,就更重新弄建立MySQL一樣。
[mysql@oel1 mysql]$ $MYSQL_BASE/scripts/mysql_install_db --user=mysql --basedir=$MYSQL_BASE --datadir=$MYSQL_DATA --port=1550
然後啟動MySQL服務。
[mysql@oel1 mysql]$MYSQL_BASE/bin/mysqld_safe --user=mysql --basedir=$MYSQL_BASE --datadir=$MYSQL_DATA --port=1550 --log-bin=mysql_oel1_bin --log-error=/u02/mysql/log/log_error.log --long_query_time=5 --slow-query-log=true --slow-query-log-file=/u02/mysql/log/slow_qeury.log &
啟動的過程很快,從日誌中看到啟動成功。
[mysql@oel1 mysql]$ 150414 18:57:14 mysqld_safe Logging to '/u02/mysql/log/log_error.log'.
150414 18:57:14 mysqld_safe Starting mysqld daemon with databases from /u02/mysql/data
對應的mysql程式也都起來了。
[mysql@oel1 mysql]$ pstree -p|grep mysql
|-mysqld_safe(20548)---mysqld(20781)-+-{mysqld}(20803)
| |-{mysqld}(20804)
| |-{mysqld}(20805)
| |-{mysqld}(20806)
| |-{mysqld}(20807)
| |-{mysqld}(20808)
| |-{mysqld}(20809)
| |-{mysqld}(20810)
| |-{mysqld}(20811)
| |-{mysqld}(20812)
| |-{mysqld}(20814)
| |-{mysqld}(20815)
| |-{mysqld}(20816)
| |-{mysqld}(20817)
| |-{mysqld}(20818)
| |-{mysqld}(20819)
| |-{mysqld}(20820)
| |-{mysqld}(20821)
| |-{mysqld}(20822)
| `-{mysqld}(20823)
這個時候來做恢復,先來恢復最初的全量備份。
[mysql@oel1 full_bak]$ mysql -u root < full.sql
[mysql@oel1 full_bak]$
檢視資料的情況,資料是最開始的狀態了。
mysql> select count(*)from new_test;
+----------+
| count(*) |
+----------+
| 32081 |
+----------+
1 row in set (0.03 sec)
然後我們來部署最新的增量備份,就是二進位制日誌匯出的sql檔案
[mysql@oel1 new_bak]$ mysql -u root < new.sql
資料就這樣恢復了。
mysql> select count(*)from new_test;
+----------+
| count(*) |
+----------+
| 32086 |
+----------+
1 row in set (0.02 sec)
不過整個過程中,沒有考慮實時的資料變化情況,對於binlog的備份就顯得更為重要。要不很多最新的變更就會丟失。
我們來模擬一下透過完整備份+增量備份(binlog)的方式來恢復。
首先我們來選擇一個表new_test作為恢復的參考點。
mysql> select count(*)from new_test;
+----------+
| count(*) |
+----------+
| 32081 |
+----------+
1 row in set (0.02 sec)
檢視一下binlog的情況,這個可以作為後續的恢復使用。
mysql> show binary logs ;
+-----------------------+-----------+
| Log_name | File_size |
+-----------------------+-----------+
| mysql_oel1_bin.000001 | 3413422 |
| mysql_oel1_bin.000002 | 356 |
+-----------------------+-----------+
2 rows in set (0.00 sec)
mysql> \q
Bye
我們來做一個完全備份。
[mysql@oel1 full_bak]$ mysqldump -u root --lock-all-tables --master-data=2 --flush-logs --all-databases > full.sql
[mysql@oel1 full_bak]$ ll
total 1672
-rw-r--r-- 1 mysql dba 1704276 Apr 14 18:50 full.sql
做完備份,我們嘗試做一些資料變更,這樣模擬增量備份就更清楚了。
mysql> insert into new_test select *from new_test limit 1,5;
Query OK, 5 rows affected, 1 warning (0.01 sec)
Records: 5 Duplicates: 0 Warnings: 1
mysql> select count(*)from new_test;
+----------+
| count(*) |
+----------+
| 32086 |
+----------+
1 row in set (0.02 sec)
可以看到在全量備份的時候指定重新整理日誌,日誌增長了一個。
mysql> show binary logs;
+-----------------------+-----------+
| Log_name | File_size |
+-----------------------+-----------+
| mysql_oel1_bin.000001 | 3413422 |
| mysql_oel1_bin.000002 | 408 |
| mysql_oel1_bin.000003 | 356 |
+-----------------------+-----------+
3 rows in set (0.00 sec)
這個時候我們可以備份binlog,為了更加簡化,我們可以直接匯出二進位制日誌中的sql
[mysql@oel1 data]$ mysqlbinlog mysql_oel1_bin.000003 > /u02/mysql/bak/new_bak/new.sql
這個時候我們做了一個大膽的決定,刪除所有的資料,直接到data目錄下,全部刪除,刪刪刪。
[mysql@oel1 data]$ rm -rf *
這個時候直接去停Mysql都會有問題,我們來透過mysqladmin來停。
[mysql@oel1 data]$ mysqladmin -u root shutdown
[mysql@oel1 data]$ 150414 18:54:34 mysqld_safe mysqld from pid file /u02/mysql/data/oel1.pid ended
這個時候檢視mysql程式的情況。
[mysql@oel1 data]$ pstree -p|grep mysql
做完破壞,任務開始了,我們來做恢復,先來嘗試一下是否能啟動Mysql,毫無疑問啟動失敗。
[mysql@oel1 mysql]$MYSQL_BASE/bin/mysqld_safe --user=mysql --basedir=$MYSQL_BASE --datadir=$MYSQL_DATA --port=1550 --log-bin=mysql_oel1_bin --log-error=/u02/mysql/log/log_error.log --long_query_time=5 --slow-query-log=true --slow-query-log-file=/u02/mysql/log/slow_qeury.log &
[mysql@oel1 mysql]$ 150414 18:55:20 mysqld_safe Logging to '/u02/mysql/log/log_error.log'.
150414 18:55:21 mysqld_safe Starting mysqld daemon with databases from /u02/mysql/data
150414 18:55:22 mysqld_safe mysqld from pid file /u02/mysql/data/oel1.pid ended
[mysql@oel1 mysql]$ pstree -p|grep mysql
但是資料目錄下生成了一些檔案這是在初始化的時候建立的,但是最後無功而返。我們也不需要,可以直接刪除。
[mysql@oel1 mysql]$ cd data
[mysql@oel1 data]$ ll
total 110724
-rw-rw---- 1 mysql dba 56 Apr 14 18:55 auto.cnf
-rw-rw---- 1 mysql dba 12582912 Apr 14 18:55 ibdata1
-rw-rw---- 1 mysql dba 50331648 Apr 14 18:55 ib_logfile0
-rw-rw---- 1 mysql dba 50331648 Apr 14 18:55 ib_logfile1
-rw-rw---- 1 mysql dba 120 Apr 14 18:55 mysql_oel1_bin.000001
-rw-rw---- 1 mysql dba 24 Apr 14 18:55 mysql_oel1_bin.index
[mysql@oel1 data]$ rm -rf *
這個時候我們來做初始化,就更重新弄建立MySQL一樣。
[mysql@oel1 mysql]$ $MYSQL_BASE/scripts/mysql_install_db --user=mysql --basedir=$MYSQL_BASE --datadir=$MYSQL_DATA --port=1550
然後啟動MySQL服務。
[mysql@oel1 mysql]$MYSQL_BASE/bin/mysqld_safe --user=mysql --basedir=$MYSQL_BASE --datadir=$MYSQL_DATA --port=1550 --log-bin=mysql_oel1_bin --log-error=/u02/mysql/log/log_error.log --long_query_time=5 --slow-query-log=true --slow-query-log-file=/u02/mysql/log/slow_qeury.log &
啟動的過程很快,從日誌中看到啟動成功。
[mysql@oel1 mysql]$ 150414 18:57:14 mysqld_safe Logging to '/u02/mysql/log/log_error.log'.
150414 18:57:14 mysqld_safe Starting mysqld daemon with databases from /u02/mysql/data
對應的mysql程式也都起來了。
[mysql@oel1 mysql]$ pstree -p|grep mysql
|-mysqld_safe(20548)---mysqld(20781)-+-{mysqld}(20803)
| |-{mysqld}(20804)
| |-{mysqld}(20805)
| |-{mysqld}(20806)
| |-{mysqld}(20807)
| |-{mysqld}(20808)
| |-{mysqld}(20809)
| |-{mysqld}(20810)
| |-{mysqld}(20811)
| |-{mysqld}(20812)
| |-{mysqld}(20814)
| |-{mysqld}(20815)
| |-{mysqld}(20816)
| |-{mysqld}(20817)
| |-{mysqld}(20818)
| |-{mysqld}(20819)
| |-{mysqld}(20820)
| |-{mysqld}(20821)
| |-{mysqld}(20822)
| `-{mysqld}(20823)
這個時候來做恢復,先來恢復最初的全量備份。
[mysql@oel1 full_bak]$ mysql -u root < full.sql
[mysql@oel1 full_bak]$
檢視資料的情況,資料是最開始的狀態了。
mysql> select count(*)from new_test;
+----------+
| count(*) |
+----------+
| 32081 |
+----------+
1 row in set (0.03 sec)
然後我們來部署最新的增量備份,就是二進位制日誌匯出的sql檔案
[mysql@oel1 new_bak]$ mysql -u root < new.sql
資料就這樣恢復了。
mysql> select count(*)from new_test;
+----------+
| count(*) |
+----------+
| 32086 |
+----------+
1 row in set (0.02 sec)
不過整個過程中,沒有考慮實時的資料變化情況,對於binlog的備份就顯得更為重要。要不很多最新的變更就會丟失。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26845409/viewspace-1579237/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Mysql備份恢復MySql
- mysql 備份恢復MySql
- 【MySQL】MySQL備份和恢復MySql
- MySQL備份與恢復——基於Xtrabackup物理備份恢復MySql
- MySQL備份與恢復MySql
- Mysql備份和恢復MySql
- MySQL 備份與恢復MySql
- Mysql備份與恢復(1)---物理備份MySql
- mysql innobackupex增量備份恢復MySql
- MySql邏輯備份恢復MySql
- Mysql的備份與恢復MySql
- mysql備份恢復測試MySql
- MySQL 備份和恢復 一MySql
- Mysql 備份與恢復 二MySql
- MySQL 非常規恢復與物理備份恢復MySql
- Mysql備份與恢復(2)---邏輯備份MySql
- MySQL備份與恢復——基於MyDumper/MyLoader 邏輯備份恢復MySql
- 入門MySQL——備份與恢復MySql
- docker 中 MySQL 備份及恢復DockerMySql
- 《入門MySQL—備份與恢復》MySql
- MySQL備份與恢復操作解析MySql
- Mysql資料備份與恢復MySql
- MySQL備份與恢復——實操MySql
- MySQL備份與恢復簡介MySql
- 【MySql】innobackupex增量備份和恢復MySql
- mysql備份恢復mysqldump面面觀MySql
- Effective MySQL之備份與恢復MySql
- Linux下mysql備份 恢復LinuxMySql
- MySQL innobackupex全量備份恢復MySql
- 【MySql】innobackupex 增量備份和恢復MySql
- MySQL備份與恢復——基於OUTFILE /LOAD DATA 邏輯備份恢復MySql
- mysql之 Innobackupex(全備+增量)備份恢復MySql
- 【備份恢復】從備份恢復資料庫資料庫
- 【管理篇備份恢復】備份恢復基礎
- Oracle備份恢復之熱備份恢復及異機恢復Oracle
- MySQL入門--備份與恢復(一)MySql
- MySQL入門--備份與恢復(二)MySql
- MySQL入門--備份與恢復(三)MySql