Mysql 阿里雲備份 恢復資料
阿新 • • 發佈:2019-01-23
瞭解MYSQL的都知道,在MYSQL中建立任何一張資料表,在其資料目錄對應的資料庫目錄下都有對應表的.frm檔案,.frm檔案是用來儲存每個資料表的元資料(meta)資訊,包括表結構的定義等,.frm檔案跟資料庫儲存引擎無關,也就是任何儲存引擎的資料表都必須有.frm檔案,命名方式為資料表名.frm,如user.frm. .frm檔案可以用來在資料庫崩潰時恢復表結構。 下面說說如何通過.frm檔案恢復資料表結構。 一. InnoDB表結構的恢復 假定:MYSQL資料庫已經崩潰,目前只有對應表的frm檔案,大家都知道,frm檔案無法通過文字編輯器檢視,因為如果不恢復,基本上來說對我們沒什麼用。這裡我們為了測試,假定該檔案為test_innodb.frm. 該表建立指令碼如下: mysql> create table test_innodb -> (A int(11) default NULL, -> B varchar(30) default NULL, -> C date default NULL) engine=innodb; Query OK, 0 rows affected (0.05 sec) 恢復方法介紹(過程): 1. 在新的正常工作的MYSQL環境下建立一個數據庫,比如aa. 2. 在aa資料庫下建立同名的資料表test_innodb,表結構隨意,這裡只有一個id欄位,操作過程片段如下: mysql> create table test_innodb (id bigint not null)engine=InnoDB; Query OK, 0 rows affected (0.09 sec) mysql> show tables; +--------------+ | Tables_in_aa | +--------------+ | test_innodb | +--------------+ 2 rows in set (0.00 sec) mysql> desc test_innodb; +-------+------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+------------+------+-----+---------+-------+ | id | bigint(20) | NO | | NULL | | +-------+------------+------+-----+---------+-------+ 1 row in set (0.00 sec) 3.停止mysql伺服器,將系統崩潰後留下的test_innodb.frm檔案拷貝到新的正常資料庫的資料目錄aa下,覆蓋掉下邊同名的frm檔案: 4.重新啟動MYSQL服務。 5.測試下是否恢復成功,進入aa資料庫,用desc命令測試下: mysql> desc test_innodb; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | A | int(11) | YES | | NULL | | | B | varchar(30) | YES | | NULL | | | C | date | YES | | NULL | | +-------+-------------+------+-----+---------+-------+ 3 rows in set (0.01 sec) OK,發現表結構已經恢復過來了。 二. MyISAM表結構的恢復。 MyISAM型別的表恢復相對比較簡單。 同樣先假定需要恢復的表的FRM檔案為test_myisam.frm,表結構為 mysql> create table test_myisam -> (A int(11) default NULL, -> B varchar(30) default NULL, -> C date default NULL) engine=myisam; Query OK, 0 rows affected (0.05 sec) 恢復過程如下: 1. 直接將test_myisam.frm拷貝到正常資料庫對應的資料目錄下。這時測試 mysql> show tables; +--------------+ | Tables_in_aa | +--------------+ | test_innodb | | test_myisam | +--------------+ 3 rows in set (0.00 sec) mysql> desc test_myisam; ERROR 1017 (HY000): Can't find file: 'test_myisam' (errno: 2) 發現只能通過show tables命令看見表名,但是表結構還是沒有恢復,desc命令報錯。 2. 在與test_myisam.frm同一目錄建立以下2個檔案,檔案內容可以為空: test_myisam.MYD test_myisam.MYI 3. 在MYSQL命令列使用MYSQL本身的資料表恢復命令repair命令恢復表,如下: mysql> repair table test_myisam USE_FRM; +-----------------+--------+----------+----------+ | Table | Op | Msg_type | Msg_text | +-----------------+--------+----------+----------+ | aa.test_myisam | repair | status | OK | +-----------------+--------+----------+----------+ 1 row in set (0.00 sec) 根據結果可以知道,恢復命令執行成功,下邊用desc命令測試下: mysql> desc test_myisam; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | A | int(11) | YES | | NULL | | | B | varchar(30) | YES | | NULL | | | C | date | YES | | NULL | | +-------+-------------+------+-----+---------+-------+ 3 rows in set (0.02 sec) 果然恢復成功了。 也可以用show create table命令測試下: mysql> show create table test_myisam; +--------------+----------------------------------------------------------------- ----------------------------------------------------------------------+ | Table | Create Table | +--------------+----------------------------------------------------------------- ----------------------------------------------------------------------+ | test_myisam | Create TABLE `test_myisam` ( `A` int(11) DEFAULT NULL, `B` varchar(30) DEFAULT NULL, `C` date DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 | 在恢復MyISAM表結構時,提到MYD檔案和MYI檔案,這兩個檔案都專屬於MyISAM儲存引擎的,前者用來儲存MyISAM表的資料,後者用來存放MyISAM表的索引資訊。具體在以後的日誌再做詳細介紹,這裡不再贅述。 From:http://blog.sina.com.cn/s/blog_5d3da3280100hymn.html 來自 <http://myceo.blog.51cto.com/2340655/737216>