程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> [MySQL Reference Manual] 7 備份和恢復,referencemanual

[MySQL Reference Manual] 7 備份和恢復,referencemanual

編輯:MySQL綜合教程

[MySQL Reference Manual] 7 備份和恢復,referencemanual


7. 備份和恢復

本章主要會介紹:

1.備份的類型:邏輯備份,物理備份,全備和增量4種

2.創建備份的方法

3.還原方法,包括還原到時間點

4.備份計劃,壓縮和加密

5.表維護,恢復損壞的表

7. 備份和恢復... 1

7.1備份和還原類型... 1

7.1.1 物理備份VS邏輯備份... 1

7.1.2 Online VS OFFLINE. 1

7.1.3 本地VS遠程... 1

7.1.4 快照備份... 1

7.1.5 全備VS增量備份... 1

7.1.6 完全恢復VS時間點(增量)恢復... 1

7.1.7 表維護... 1

7.1.8 備份調度,壓縮,加密... 1

7.2 數據庫備份方法... 1

7.2.1 使用MySQL企業備份工具熱備... 1

7.2.2 使用mysqldump和mysqlhotcopy備份... 1

7.2.3 使用復制表文件備份... 1

7.2.4 文本文件備份... 1

7.2.5 使用binary log創建增量備份... 1

7.2.6 使用slave備份... 1

7.2.7 恢復錯誤表... 1

7.2.8 使用文件系統快照備份... 1

7.3 備份還原策略例子... 1

7.3.1 創建備份策略... 1

7.3.2 使用備份還原... 1

7.3.3 備份策略總結... 1

7.4 使用mysqldump備份... 1

7.4.1 使用SQL格式輸出... 1

7.4.2 加載SQL格式輸出... 1

7.4.3 使用文本格式的輸出... 1

7.4.4 加載文本格式輸出... 1

7.4.5 mysqldump提示... 1

7.4.5.1 如何復制數據庫... 1

7.4.5.2如何復制數據庫從A服務器到B服務器... 1

7.4.5.3 dump存儲程序... 1

7.4.5.4 分開dump數據庫結構和數據... 1

7.4.5.5 使用mysqldump測試升級兼容性問題... 1

7.5 使用binary log時間點(增量)恢復... 1

7.5.1 使用時間的時間來做時間點恢復... 1

7.5.2 使用Event位置來做時間點恢復... 1

7.6 MyISAM表的維護和Crash恢復... 1

7.6.1 使用myisamchk災難恢復... 1

7.6.2 如何檢查MyISAM表的錯誤... 1

7.6.3 修復MyISAM表... 1

7.6.4 MyISAM表優化... 1

7.6.5 創建MyISAM表維護計劃... 1

 

7.1備份和還原類型

7.1.1 物理備份VS邏輯備份

物理備份是直接復制備份數據庫目錄或者文件,這種備份比較適合大的比較重要的數據庫。

邏輯備份是把數據庫信息保存為數據庫結構(create database ,create table)和數據(insert語句或者text文本)。比較適合小的數據庫。

 

物理備份方法有幾個特點:

1.一系列的復制數據庫文件和文件夾,通常是備份全部或者部分數據文檔

2.物理備份一般比邏輯備份快,只需要復制數據不需要轉化

3.輸出比邏輯備份少

4.對於繁忙,重要的數據庫備份的速度和窄數據比較重要

5.備份和還原粒度可以從數據文檔到個別數據文件。

6.備份可以包含配置文件和日志

7.對於MEMORY表不能用這種方式備份,因為數據不在磁盤中

8.備份只能被移植到相同或者相識的硬件上(不明白)

9.backup只能在服務停止是運行,若在運行是運行,那麼需要合適的鎖定,防止備份的時候數據被修改。mysql企業版備份在備份的時用到的表會自動加鎖。

10.物理備份工具mysqlbackup,文件系統級別的命令(cp,scp,tar,rsync),或者mysqlhotcopy備份MyISAM。

對於還原:

1.mysql企業級備份工具可以還原它的備份

2.ndb_restore恢復ndb表

3.文件系統級別復制或者mysqlhotcopy可以備份,可以復制到原來的文件目錄來恢復

 

邏輯備份方法有幾個特點:

1.邏輯備份通過查詢獲得數據和數據庫結構。

2.邏輯備份比物理備份慢,因為需要訪問數據然後轉化為邏輯結構

3.邏輯備份結果比物理備份結果要大。

4.邏輯備份還原的粒度,從實例級到標記。

5.邏輯備份不能包含,日志和配置文件

6.備份是以邏輯格式存放,恢復很方便

7.備份需要服務啟動

8.主要的備份工具有sqldump和SELECT … INTO OUTFILE語句,MEMORY引擎照樣備份。

9.可以使用遠程的邏輯備份來還原。

7.1.2 Online VS Offline

在線備份是在服務啟動下備份,離線備份是在服務停止狀態下備份。也可以稱為熱備(hot back),冷備(cold back)。除此之外還有暖備(warm back),意思是服務在運行狀態下,但是備份在訪問數據庫的時候不讓修改數據。

 

在線備份有幾個特點:

1.備份不會打擾其他客戶端,但是是否可以訪問數據,和客戶端發過來的操作有關。

2.必須要加適當的鎖,不讓發生數據修改,以至於出現備份一致性問題。

 

離線備份幾個特點:

1.客戶端在備份期間不可用。因為這個問題備份可以放到slave上面進行。

2.因為客戶端都不能訪問,所以沒有一致性問題,比較簡單。

 

上面2個備份的區別和還原的區別類似。但是在線的還原比在線備份對客戶端影響更大,在還原時,client訪問數據庫。

7.1.3 本地VS遠程

本地備份是備份的結果放在MySQL所在的服務器上,遠程是生產的備份放在其他服務器上。

mysqldump:可以把生產在本地或者遠程

mysqlhotcopy:在本地執行,並在備份本地表文件的時候不讓數據修改,備份生產在本地

SELECT… INTO OUTFILE可以從遠程或者本地連接,但是備份生產在本地

盡管復制文件的目標是在遠程,但是都是在本地初始化

 

7.1.4 快照備份

一些文件系統可以支持快照,在一個時間點上,通關過了文件系統的邏輯copy,不需要備份整個文件系統。快照主要依賴於copy-on-write技術實現。LVM的快照可以查看《鳥哥linux私房菜 基礎篇》 15.1。

 

7.1.5 全備VS增量備份

全備是某個時間點的所有數據

增量備份是2個時間點內,數據的變更,MySQL中增量備份由binary log實現。

7.1.6 完全恢復VS時間點(增量)恢復

完全恢復是恢復全備中的所有數據。如果全備恢復不能滿足當前,可以使用全備之後的增量備份來還原

增量恢復是2個時間點內的數據修改,也被叫做時間點恢復,讓數據庫數據狀態更新到指定事件。增量備份一般在全備之後,使用binary log實現。

 

7.1.7 表維護

如果表出錯,那麼肯定會出現數據一致性問題。對於INNODB表基本上不會發送。

MyISAM的表維護可以看7.6 MyISAM表的維護和Crash恢復

7.1.8 備份調度,壓縮,加密

備份調度是用來自動產生備份。

壓縮用來減少備份占用的空間。

加密保護數據安全性。

MySQL本身不包含這些能力,可以通過MySQL企業級備份工具,壓縮innodb備份。文件系統可以壓縮,加密備份。

7.2 數據庫備份方法

7.2.1 使用MySQL企業備份工具熱備

MySQL企業級備份工具,備份沖instance到table級別,可以增量,全備,壓縮備份。

innodb表可以直接熱備,對於其他引擎進行warm備份。

具體看:http://dev.mysql.com/doc/refman/5.6/en/backup-types.html

 

7.2.2 使用mysqldump和mysqlhotcopy備份

mysqldump的備份例子:

shell> mysqldump db_name > backup-file.sql

恢復數據庫:

shell> mysql db_name < backup-file.sql

shell> mysql -e "source /path-to-backup/backup-file.sqldb_name

遷移數據庫:

shell> mysqldump --opt db_name | mysql --host=remote_host -C db_name

備份多個數據庫:

shell> mysqldump --databases db_name1 [db_name2 ...] > my_databases.sql

mysqlhotcopy是一個perl腳本,使用FLUSH TABLES,LOCK TABLES和cp,scp備份數據庫。只能備份myisam和ARCHIVE的表。

shell> mysqlhotcopy db_name [/path/to/new_directory]

shell> mysqlhotcopy db_name_1 ... db_name_n /path/to/new_directory

也可以用正則表達式,備份數據庫中的表:

shell> mysqlhotcopy db_name./regex/

用~前綴排除表名

shell> mysqlhotcopy db_name./~regex/

 

7.2.3 使用復制表文件備份

對於每個表都有自己文件的存儲過程可以使用復制表的文件來做備份,為了獲取一致性的備份,要停止服務或者flush表:

FLUSH TABLES tbl_list WITH READ LOCK;

當備份文件的時候,只需要在表上加READ LOCK,其他客戶端能夠照常讀取表,但是不能寫入。flush用處:在備份之前,把所有被修改的page都寫入到文件中。

 

通過這個方法可以創建一個bianry備份,備份所有的表文件。mysqlhotcopy就是使用這個方法,但是mysqlhotcopy不對innodb起作用,因為innodb的數據庫文件夾沒有必要保存表的所有數據,此外雖然服務沒有發起修改數據但是innodb還是可能會修改緩存在內存中的數據,並且不刷新到磁盤。

7.2.4 文本文件備份

創建文本文件備份,可以使用SELECT * FROM OUTFILE ‘file_name’FROM tbl_name 。

也可以使用mysqldump創建文本文件備份。

7.2.5 使用binary log創建增量備份

binary log提供了數據修改的sql,所以可以使用bianry log 來做增量備份。當增量備份的時候,使用flush logs,來重繞binary log,然後復制上次全備或者增量備份到最近全部復制,下次做全備時也要使用flush log。(flush log在dump之前)

7.2.6 使用slave備份

當你在master上執行備份,問題很多,所以可以把備份放到slave上。

在slave備份的時候,不管用什麼方法,都要備份master info和relay log info。當要恢復復制的時候,等還原完slave,都需要使用master info和relay log info來恢復復制。如果slave在復制LOAD DATA INFILE語句,就需要備份任何在—slave-load-tmpdir選項中的SQL_LOAD-*文件,用來恢復中斷的load data infile語句。

7.2.7 恢復錯誤表

如果你要恢復出錯的MyISAM表,可以嘗試使用REPAIR TABLE或者myisamchk –r基本上都能恢復。

具體可以看:7.6 MyISAM表的維護和Crash恢復

7.2.8 使用文件系統快照備份

如果有支持Veritas文件系統:

1.連接客戶端,然後執行FLUSH TABLES WITH READ LOCK

2.在另外一個shell,執行 mount vxfs snapshot

3.客戶端上,unlock tables

4.從快照中復制文件

5.卸載快照

和lvm的快照處理方法不同,具體可以看《鳥哥linux私房菜 基礎篇》15.1

7.3 備份還原策略例子

crash有記下幾種:1.系統crash,2.斷電,3.文件系統crash,4.硬件錯誤。

當系統crash或者斷電後,假設mysql磁盤數據可以用,innodb可能沒有一致性問題的數據,但是在日志文件發現掛起的提交事務和未提交事務。那麼innodb會重做提交事務,回滾未提交事務。

假設crash之後,mysql的磁盤數據不可用,也就是說不能成功啟動服務。那麼就有必要恢復備份數據,那麼之前就需要有備份。需要備份策略。

7.3.1 創建備份策略

如在innodb表的數據中執行備份:

shell> mysqldump --single-transaction --all-databases > backup_sunday_1_PM.sql

備份操作要在所有的表上面獲取全局的讀鎖(flush tables with read lock),來保證數據不被修改。當長的update語句執行的時候可能會被flush 堵塞。直到語句完成。

假設是在innodb表的數據庫上面,使用—single-transaction可以保證mysqldump的讀一致性。就算數據被其他應用修改,mysqldump也不會讀入。—single-transaction只在innodb上有效。

 

對於大的數據庫做一次全備是很不容易的,所以使用增量來配合全備就很有效率。

增量備份相對較小,備份速度快,當恢復完全備之後恢復增量備份。

 

當全備的時候要做flush logs,這樣從全備以來的數據修改都會被記錄在當前的binary log:

shell> mysqldump --single-transaction --flush-logs --master-data=2 \

         --all-databases > backup_sunday_1_PM.sql

執行完上面命令後,生產一個新的日志文件,因為—flush-logs導致binary log 被刷新打開一個新的日志。

--master-data選項導致mysqldump寫信息到binary log。

-- Position to start replication or point-in-time recovery from

-- CHANGE MASTER TO MASTER_LOG_FILE='gbichot2-bin.000007',MASTER_LOG_POS=4;

這個命令意味著:

1.dump文件包含所有的在gbichot2-bin.000007生產之前的所有數據修改

2.所有備份之後的數據修改不在dump文件中,在gbichot2-bin.000007以及之後的日志中。

 

假設後來在周1 13:00,通過flush logs創建了一個增量備份,gbichot2-bin.000008,那麼在原先gbichot2-bin.000007中包含了全備到周1 13:00所有的數據修改記錄。

假設在周2 13:00又通過flush logs執行了增量備份,gbichot2-bin.000008包含了周1 13:00 到周2 13:00之間的所有數據的修改記錄。

 

binary log 是比較占用空間的,可以使用—delete-master-logs來刪除binary log:

shell> mysqldump --single-transaction --flush-logs --master-data=2 \

         --all-databases --delete-master-logs > backup_sunday_1_PM.sql

注意:

如果有配置復制的情況下使用—delete-master-logs很危險。可能出現還沒有被復制到slave的日志被刪除。

7.3.2 使用備份還原

假設在周3 8:00出現crash,需要從備份恢復,那麼先還原全備:

shell> mysql < backup_sunday_1_PM.sql

然後還原2個差異備份:

shell> mysqlbinlog gbichot2-bin.000007 gbichot2-bin.000008 | mysql

等執行完之後,數據已經被恢復到了周2 13:00,但是還是有數據丟失,如果還能取到尾日志的情況(就是gbichot2-bin.000009),執行:

shell> mysqlbinlog gbichot2-bin.000009 ... | mysql

執行完之後數據就恢復到了周3的8:00。

7.3.3 備份策略總結

系統crash或者斷電,innodb會自己修復,但是為了安全性考慮:

1.確定已經啟動了binary log

2.定期的做全備

3.定期的做增量備份

7.4 使用mysqldump備份

mysqldump有2中方式:

1.不帶—tab,那麼mysqldump會輸出一個文件所有的表結構和數據都在以sql方式在一個文件中

2.帶—tab,那麼mysqldump會輸出一個數據庫接口文件(sql),和一個文本文件(數據)

7.4.1 使用SQL格式輸出

指定所有數據庫輸出:

shell> mysqldump --all-databases > dump.sql

指定數據庫輸出:

shell> mysqldump --databases db1 db2 db3 > dump.sql

如果指定了—all-databases或者—databases,mysqldump會輸出create database,和use,這樣就能夠保證數據會被寫入到指定的數據庫。如果指定了—add-drop-database那麼會先drop數據庫然後create。

dump單個數據庫:

shell> mysqldump --databases test > dump.sql

或者

shell> mysqldump test > dump.sql

但是不指定—databases不會有create database和use。所以:

1.在使用dump文件的時候,需要指定默認數據庫

2.可以指定和原來不一樣的數據庫

3.如果數據庫不存在需要先創建

4. —all-databases沒有效果

7.4.2 加載SQL格式輸出

加載sql個是數據很方便:

shell> mysql < dump.sql

也可以

mysql> source dump.sql

如果是不帶數據庫的dump,需要先創建數據庫:

shell> mysqladmin create db1

shell> mysql db1 < dump.sql

或者

mysql> CREATE DATABASE IF NOT EXISTS db1;

mysql> USE db1;

mysql> source dump.sql

7.4.3 使用文本格式的輸出

當使用選項—tab=dir_name就會輸出文本格式,並輸出到dir_name,每個數據庫有2個文件,1,數據庫結構(.sql),2.文本存儲的數據(.txt)。

創建文本輸出:

shell> mysqldump --tab=/tmp db1

因為是server寫的,所以到時候dump文件是owner是運行服務的用戶。服務使用select…into outfile,所以需要有file權限的用戶來操作,如果輸出目錄出現同名文件就會報錯。

如果在遠程服務上執行,那麼可能會出現.txt文件在遠程,.sql文件在本地。所以最好在本地運行。

 

數據文件的輸出可以指定格式;

--fields-terminated-by=str 列分隔符默認為tab

--fields-enclosed-by=char 封裝列值,默認不使用

--fields-optionally-enclosed-by=char 封裝非數值列,默認不適用

--fields-escaped-by=char 需要跳過的字符,默認沒有

--lines-terminated-by=str 換行符默認為0xA

shell> mysqldump --tab=/tmp --fields-terminated-by=,

         --fields-enclosed-by='"' --lines-terminated-by=0x0d0a db1

可以使用hex來代替字符:

--fields-enclosed-by='"'

--fields-enclosed-by=0x22

7.4.4 加載文本格式輸出

shell> mysql db1 < t1.sql

shell> mysqlimport db1 t1.txt

或者

mysql> USE db1;

mysql> LOAD DATA INFILE 't1.txt' INTO TABLE t1;

如果是帶格式的,不是默認格式可以使用如下:

shell> mysqlimport --fields-terminated-by=,

         --fields-enclosed-by='"' --lines-terminated-by=0x0d0a db1 t1.txt

或者

mysql> USE db1;

mysql> LOAD DATA INFILE 't1.txt' INTO TABLE t1

    -> FIELDS TERMINATED BY ',' FIELDS ENCLOSED BY '"'

    -> LINES TERMINATED BY '\r\n';

7.4.5 mysqldump提示

mysqldump可以解決一下問題:

1.如何復制數據庫

2.如何復制數據庫從A服務器到B服務器

3.輸出存儲程序(存儲過程,函數,觸發器,事件)

4.分開輸出數據庫結構和數據

7.4.5.1 如何復制數據庫

shell> mysqldump db1 > dump.sql

shell> mysqladmin create db2

shell> mysql db2 < dump.sql

7.4.5.2如何復制數據庫從A服務器到B服務器

在服務A中:

shell> mysqldump --databases db1 > dump.sql

在服務B中:

shell> mysql < dump.sql

或者

在服務A中:

shell> mysqldump db1 > dump.sql

在服務B中:

shell> mysqladmin create db1

shell> mysql db1 < dump.sql

7.4.5.3 dump存儲程序

可以使用參數:

--events:用來導出調度事件

--routines:導出存儲過程和函數

--triggers:導出觸發器

當導出表的時候 –triggers默認是啟動的,其他2個選項默認是不系統的。可以使用—skip-events.—skip-routines,--skip-triggers跳過。

7.4.5.4 分開dump數據庫結構和數據

當制定—no-data的時候不帶數據導出,--no-create-info不帶結構導出。

shell> mysqldump --no-data test > dump-defs.sql

shell> mysqldump --no-create-info test > dump-data.sql

對於只dump結構可以如下:

shell> mysqldump --no-data --routines --events test > dump-defs.sql

7.4.5.5 使用mysqldump測試升級兼容性問題

在生產服務器上導出結構:

shell> mysqldump --no-data --routines --events test > dump-defs.sql

在升級服務器上導入:

shell> mysql < dump-defs.sql

查看打印的警告和錯誤。

如果沒有問題或者處理了問題,導入數據:

生產服務器:

shell> mysqldump --all-databases --no-create-info > dump-data.sql

升級服務器:

shell> mysql < dump-data.sql

然後再檢查數據是否正確導入。

7.5 使用binary log時間點(增量)恢復

時間點恢復,實質恢復到指定時間點,一般運行在全備之後。

7.5.1 使用時間的時間來做時間點恢復

使用—start-datetime,--stop-datetime來指定時間,

shell> mysqlbinlog --stop-datetime="2005-04-20 9:59:59" \

         /var/log/mysql/bin.123456 | mysql -u root -p

從開始恢復到—stop-datetime指定的時間

shell> mysqlbinlog --start-datetime="2005-04-20 10:01:00" \

         /var/log/mysql/bin.123456 | mysql -u root -p

從—start-datetime開始恢復到最後

使用以下方法來查看確定准確的時間:

shell> mysqlbinlog /var/log/mysql/bin.123456 > /tmp/mysql_restore.sql

然後打開/tmp/mysql_restore.sql來檢查。

7.5.2 使用Event位置來做時間點恢復

不是用時間可以使用Event位置來指定開始和結束:

shell> mysqlbinlog --stop-position=368312 /var/log/mysql/bin.123456 \

         | mysql -u root -p

 

shell> mysqlbinlog --start-position=368315 /var/log/mysql/bin.123456 \

         | mysql -u root -p

Event位置在binary log的log_pos下.

7.6 MyISAM表的維護和Crash恢復

myisamchk可以用來檢查,修復,優化MyISAM表。

盡管myisamchk很安全,但是還是要全備一下數據庫,以防萬一。

myisamchk操作會熬制MyISAM全文索引重建,需要注意。

MyISAM表維護也可以使用SQL語句:

1.MyISAM表檢查,可以使用CHECK TABLE.

2.MyISAM表修復,可以使用REPAIR TABLE

3.MyISAM表優化,可以使用OPTIMIZE TABLE

4.MyISAM表分析,可以使用ANALYZE TABLE

使用myisamchk,要保證服務沒有使用這個表,不然會出現沒必要的和服務之間的交互行為。

7.6.1 使用myisamchk災難恢復

若能保證不會有別人訪問mysqld,那麼只需要執行mysqladmin flush-tabls,如果無法保證那麼就關閉服務。如果在運行myisamchk時,mysqld修改,就會出現告警說表出錯,就算沒有出錯還是會被認為出錯。

 

如果服務啟動external鎖啟動服務,可以在任何時候使用myisamchk檢查表,如果服務參數修改數據,就會堵塞,等待myisamchk完成。

 

如果使用myisamchk修復或者優化表,在沒有啟用external鎖的時候要保證mysqld不使用這個表。如果你不關閉mysqld,在執行myisam之前至少要mysqladmin flush-tabls。如果服務和myisamchk同時訪問就有可能會表出錯。

 

myisam表,每個表有3個文件,.frm結構文件,.myd數據文件,.myi索引文件。

雖然每個文件都有可能出現問題,但是一般不會出現在.frm結構文件中。

 

myisamchk一行一行的檢查.myd數據文件,當完成時,刪除老的myd文件,使用新的myd替代。

如果使用—quick,myisamchk不會創建一個臨時myd文件,而是假設myd文件是正確的,並生成新的索引。然後myisamchk自動發現myd文件是否出錯,如果出錯就停止修復。

如果指定2次—quick,這樣myisamchk在一些錯誤上不會終止修復,而是嘗試去修改myd文件來解決錯誤。2次—quick一般在沒有多少空間的情況下使用。使用之前記得要備份。

 

7.6.2 如何檢查MyISAM表的錯誤

myisamchk tbl_name:可以發現大多數錯誤,只涉及到數據文件的錯誤不會被發現

myisamchk –m tbl_name:可以發現大多數錯誤,先檢查所有索引項,然後通過讀取所有行,計算所有key的checksum,然後和index tree對比。

myisamchk –e tbl_name:做全面的檢查,檢查讀取每一行,驗證他們實際上是指向當前行的。這個檢查很慢,特別是大表,有很多索引的。一般發現一個錯誤就停止了,可以加-v選項,但也最多只能有20個錯誤。

myisamchk –e -i tbl_name:檢查和上面一樣,-i就是讓myisamchk打印一些靜態信息。

7.6.3 修復MyISAM表

表出錯的症狀,包括查詢突然異常,或者有一下錯誤:

1.tbl_name.frm被鎖定

2.找不到tbl_name.myi文件

3.異常的文件結尾

4.數據文件crash

5.從錯誤表上獲取nnn錯誤。

為了獲取更多的錯誤信息,可以使用perror nnn,nnn為錯誤碼獲取更多信息。

shell> perror 126 127 132 134 135 136 141 144 145

MySQL error code 126 = Index file is crashed

MySQL error code 127 = Record-file is crashed

MySQL error code 132 = Old database file

MySQL error code 134 = Record was already deleted (or record file crashed)

MySQL error code 135 = No more room in record file

MySQL error code 136 = No more room in index file

MySQL error code 141 = Duplicate unique key or constraint on write or update

MySQL error code 144 = Table is crashed and last repair failed

MySQL error code 145 = Table was marked as crashed and should be repaired

其中135和136並不算是錯誤,只是所有文件或者數據文件空間不足可以使用:

ALTER TABLE tbl_name MAX_ROWS=xxx AVG_ROW_LENGTH=yyy;

如果無法確定的當前表的使用量,可以使用show create table

 

對於其他錯誤就必須修復表了,表修復有4個階段,在修復之前要保證對表文件有訪問權限。

myisamchk的一些選項可以查看: Section 4.6.3, “myisamchk — MyISAM Table-Maintenance Utility”

myisamchk內存的使用,會影響myisamchk性能可以查看: Section 4.6.3.6, “myisamchk Memory Usage”.

 

如果在命令行上修復表,最好先把服務停掉,如果在遠程使用mysqladmin shutdown,會一段時間之後才能停止,因為需要一段時間把所有index的修改寫入到磁盤。

 

階段1:檢查表

使用myisamchk *.MYI或者myisamchk -e *.MYI來檢查表,可以使用-s(slient)跳過不必要的信息。

如果服務器沒有啟動,使用—update-state告訴myisamchk標記檢查過的表。

只需要修復出現錯誤的表,對於這些表進入第二階段進行修復。

如果檢查的時候出現無法預期的錯誤,或者myisamchk奔潰,進入第三階段修復

 

階段2:簡單安全修復

先運行 myisamchk -r -q tbl_name,視圖修復索引文件,如果數據文件包含了所有信息,刪除連接(是什麼)指向了正確的數據文件中的位置。那麼就能修復錯誤。

否則的話,以下過程:

1.先備份數據文件

2.使用myisamchk –r tbl_name 來清理數據文件中的錯誤的行和已經刪除的行,並重新構建index文件。

3.如果之前的步驟失敗,使用myisamchk –safe-recover tbl_name,安全模式修復使用老的修復方法來處理一些常規無法修復的問題。

如果出現異常錯誤,或者myisamchk崩潰進入階段3

注:

如果想要檢查快點可以把sort_buffer_size和key_buffer_size放大為可用內存的25%

 

階段3:比較困難的修復

到了這個階段只有索引文件頭16KB塊出現問題,或者索引文件消失的情況

1.把數據文件放到一個安全的地方

2.創建一個空的數據文件和索引文件

shell> mysql db_name

mysql> SET autocommit=1;

mysql> TRUNCATE TABLE tbl_name;

mysql> quit

3.把老的數據文件復制過來,替換新的數據文件,然後進入第二階段,直接運行簡單修復應該就可以正常了。

注意:如果有復制,那麼需要先停止,因為涉及到文件系統操作。

除了使用myisamchk –r –q,還可以使用REPAIR TABLE tbl_name USE_FRM 語句

 

階段4:非常困難修復

進入到這個階段說明frm文件出錯。

1.從備份中恢復放入frm文件,然後返回到階段3

2.如果沒有備份,但是記得表結構,可以直接創建一個表,刪除新的數據文件,然後復制frm,myi文件到你crash的數據庫裡面,然後到階段2重新創建索引文件。

 

7.6.4 MyISAM表優化

為了合並碎片行,清理由刪除或者update造成的浪費的空間,使用myisamchk的恢復模式,重新創建索引:

shell> myisamchk -r tbl_name

當然可以使用OPTIMIZE TABLE語句來優化表。

 

mysiamchk還有其他選項可以用來提高表的性能:

--analyze(-a):分析key的分布(更新統計信息),可以提高join的性能。

--sort-index(-s):排序index塊,可以優化查詢,讓表掃描更快

--sort-records=index_num(-R index_num):根據給定的索引重排數據行。可以提高range-base select和order by操作。

7.6.5 創建MyISAM表維護計劃

檢查和修復表的方法:

1.CHECK TABLE,REPAIR TABLE語句來檢查修復

2.使用myisamchk工具

可以通過crontab工具來完成定期的MyISAM表的維護

35 0 * * 0 /path/to/myisamchk --fast --silent /path/to/datadir/*/*.MYI

通常mysql表不需要維護,但是對變長字段修改頻繁,刪除頻繁的表可以做一下維護

shell> myisamchk -r -s --sort-index --myisam_sort_buffer_size=16M */*.MYI

 


MYSQL數據庫備份恢復

我推薦使用數騰科技的Ocaenbackup for Server備份軟件

1.支持在Windows系統上執行備份和恢復。
2.備份和恢復引擎分開執行。
3.支持備份主流數據庫,支持SQL Server和Oracle等大型數據庫。
4.直接備份操作系統,系統宕機時一鍵恢復。
5.加入鏡像復制技術,高速復制大文件備份,備份更快捷。
6.存儲介質更為豐富,最新加入對於磁帶的支持。
7.高效細致的備份保存策略,定期清理過期數據,節省存儲空間和提高數據的可使用性。
8.郵件報告、陰影卷復制、外部程序、病毒掃描等更多高級功能支持。
9.支持FTP服務器備份,加強了Online功能。
10.隱藏式服務開啟,備份更及時。
 

前輩,可以把把你mysqldump恢復mysql的代碼發給我,我備份已成功但是恢復是不成功

用mysql命令恢復 mysqldum只是備份
mysql客戶程序一般交互使用:

shell> mysql db_name
還可以將SQL語句放到一個文件中然後告訴mysql從該文件讀取輸入。要想實現,創建一個文本文件text_file,並包含你想要執行的語句。然後按如下所示調用mysql:

shell> mysql db_name < text_file
還可以用一個USE db_name語句啟動文本文件。在這種情況下,不需要在命令行中指定數據庫名:

shell> mysql < text_file
如果正運行mysql,可以使用source或\.命令執行SQL腳本文件:

mysql> source filename
mysql> \. filename
有時想要使用腳本來向用戶顯示進度信息;為此可以插入下述行:

SELECT '<info_to_display>' AS ' ';
將輸出<info_to_display>。
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved