作業系統層面恢復mysql的資料庫

kakaxi9521發表於2018-01-17
利用複製一個mysql中的庫的目錄,來恢復mysql資料庫。
問題描述:
2018年1月10號上午10點我們的oa系統的伺服器突然down機,嘗試啟動伺服器,但磁碟出現問題,最後只能用顯示器直接連線伺服器,crt不能遠端連線,它也不能ssh到別的伺服器,也不能scp檔案到別的伺服器,只能透過行動硬碟,把程式和資料庫的備份copy出來,每天晚上mysqldump的sql檔案,如果使用它恢復資料的話,今天早上的打卡記錄就沒有了,於是嘗試使用作業系統目錄恢復資料
我們知道mysql中每個資料庫對應一個目錄,然後這個庫下的所有表都在這個目錄下,如果這個mysql開啟了獨立表空間,理論上是可以用這個目錄恢復資料的,
下面說下具體的流程:下面過程能成功的前提是源端mysql開啟了獨立表空間 也就是引數innodb_file_per_table =on
一:首先在目的端建立上需要恢復的那個庫
mysql> create database oa;
Query OK, 1 row affected (0.03 sec)
二:根據昨天的備份的sql檔案,恢復出oa庫下的表結構,必須做這一步,否則mysql資料字典中沒有這些表的資訊,那麼這些表就不能使用,也就是不能進行dml操作;
mysql> use oa;
mysql> source oa-20180109.sql;
mysql> show tables; #檢視確實已經有了表結構,我們只需要建立表結構就可以。
+------------------------------------------+
| Tables_in_oa |
+------------------------------------------+
| 20161213_2_sch_assess_mark_opponent_copy |
| 20161213sch_assess_copy |
| 20161213sch_assess_mark_column_copy |
| 20161213sch_assess_mark_copy |
| 20161213sch_assess_mark_opponent_copy |
| 20161213sch_assess_order_copy |
| 20161213sch_assess_player_copy |
| #Tableau_sid_000011DF_2_Group |
| #Tableau_sid_000011E1_4_Group |
| #Tableau_sid_000011EE_4_Group |
| #Tableau_sid_000011EE_5_Group |
| BDF2_BLOB_STORE |
| BDF2_CLOB_STORE |
| BDF2_COMPANY |
| BDF2_COMPONENT |
三:在作業系統層面用copy出來的oa目錄,覆蓋現在的oa目錄;
bogon:root@/>ps -ef | grep mysql
root 20076 7826 0 21:44 pts/2 00:00:00 grep --color=auto mysql
root 25748 1 0 2017 ? 00:00:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --datadir=/mysql/data/data--pid-file=/var/run/mysql/mysql.pid
bogon:root@/> cd/mysql/data/data
bogon:root@/mysql/data/data>ll
total 1126436
-rw-rw----. 1 mysql mysql 56 Dec 15 11:46 auto.cnf
-rw-rw----. 1 mysql mysql 79691776 Jan 10 21:32 ibdata1
-rw-rw----. 1 mysql mysql 536870912 Jan 10 21:32 ib_logfile0
-rw-rw----. 1 mysql mysql 536870912 Jan 10 21:32 ib_logfile1
drwx------. 2 mysql mysql 4096 Jan 4 16:38 liuwenhe
drwx------. 2 mysql mysql 4096 Dec 20 22:10 mysql
drwx------. 2 mysql mysql 12288 Jan 10 21:31 oa
drwx------. 2 mysql mysql 4096 Dec 20 22:10 performance_schema
drwx------. 2 mysql mysql 6 Dec 20 22:10 test
bogon:root@/>cp -r oa_bak/ /mysql/data/data
bogon:root@/mysql/data/data>ll
total 1126452
-rw-rw----. 1 mysql mysql 56 Dec 15 11:46 auto.cnf
-rw-rw----. 1 mysql mysql 79691776 Jan 10 21:32 ibdata1
-rw-rw----. 1 mysql mysql 536870912 Jan 10 21:32 ib_logfile0
-rw-rw----. 1 mysql mysql 536870912 Jan 10 21:32 ib_logfile1
drwx------. 2 mysql mysql 4096 Jan 4 16:38 liuwenhe
drwx------. 2 mysql mysql 4096 Dec 20 22:10 mysql
drwx------. 2 mysql mysql 12288 Jan 10 21:31 oa
drwx------. 2 root root 12288 Jan 10 21:46 oa_bak
drwx------. 2 mysql mysql 4096 Dec 20 22:10 performance_schema
drwx------. 2 mysql mysql 6 Dec 20 22:10 test
bogon:root@/mysql/data/data>rm -rf oa
bogon:root@/mysql/data/data>mv oa_bak oa
四:一定注意修改oa目錄的許可權,
bogon:root@/mysql/data/data>chown -R mysql:mysql oa
五:檢視資料庫是否正常
檢視確實已經有了今天的資料
mysql> use oa;
mysql> select * from LOG_ATTENDANCE where User_Uid='liuwenhe' order by 4 desc limit 2;
+---------+----------+---------------+---------------------+
| Sort_ID | User_Uid | IP_Address | Create_Date |
+---------+----------+---------------+---------------------+
| 213614 | liuwenhe | 192.168.8.172 | 2018-01-10 08:12:50 |
| 213501 | liuwenhe | 192.168.8.172 | 2018-01-09 17:47:59 |
+---------+----------+---------------+---------------------+
嘗試做增刪改查操作,是可以的;
mysql> create table test (id int);
Query OK, 0 rows affected (0.24 sec)
mysql> insert into test values (1);
Query OK, 1 row affected (0.04 sec)
六:最後一步很關鍵,
因為我是在一套主主複製的mysql上恢復的,這個操作我只是在一個例項上操作了,所以我打算先mysqldump出來這個庫,然後再刪除這個庫,之後再從新恢復出來,保證兩套庫資料一致;
bogon:root@/mysql/data/data>mysqldump -uroot -pliuwenhe oa >oa.sql
但是刪除這個庫有問題,(後來我模擬這個過程的時候,沒有報錯,很奇怪!)
mysql> drop database oa;
ERROR 1010 (HY000): Error dropping database (can't rmdir './oa/', errno: 17)
於是從作業系統級別直接刪除目錄,兩個例項都刪除
bogon:root@/mysql/data/data>rm -rf oa
然後從新建立上庫oa,並恢復出最近的資料;
mysql> create database oa;
mysql> source oa.sql;
至此利用作業系統的檔案恢復資料庫的操作完成了;
總結:mysql資料庫不像oracle那樣有scn號,oracle SCN是用於標示資料庫變化的唯一標識號,其數值順序遞增。當執行事務時(DML語句、DDL語句),系統會為每個事務變化生成相應的SCN,也就並且oracle資料庫中一共有四個scn號,分別為系統scn、檔案scn、結束scn,這三者是在控制檔案中,資料檔案頭部scn在資料檔案上,當資料庫啟動的時候,會校驗這些scn號(具體怎麼校驗參考http://blog.itpub.net/29654823/viewspace-2127804/),如果不一致,並且沒有redo或者歸檔日誌的話,資料庫就會有問題,所以oracle很難直接用檔案來恢復其中的一個表,mysql居然可以,並且還可以直接刪除資料庫目錄,然後資料庫例項不會出現任何問題,只是這個目錄對應的庫就沒有了,並且資料字典中也就沒有這個庫了;



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/21374452/viewspace-2150236/,如需轉載,請註明出處,否則將追究法律責任。

相關文章