本文目錄一覽:
MySQL為什麼會索引失效?_MySQL教程
對於MyISAM: a.alter table table_name disable keys b.loading data c.alter table table_name enable keys 對於Innodb: a.將要導入的數據按照主鍵排序 b.set unique_checks=0,關閉唯一性校驗 c.set autocommit=0,關閉自動提交索引並不是時時都會生效的,比如以下幾種情況,將導致索引失效:注意:要想使用or,又想讓索引生效,只能將or條件中的每個列都加上索引2.對於多列索引,不是使用的第一部分,則不會使用索引3.like查詢是以%開頭4.如果列類型是字符串,那一定要在條件中將數據使用引號引用起來,否則不使用索引5.如果mysql估計使用全表掃描要比使用索引快,則不使用索引此外,查看索引的使用情況show status like 『Handler_read%』;大家可以注意:–按筆畫排序 select ChannelID,ChannelName from dbo.HB_AdChannel order by ChannelName collate chinese_prc_stroke_cs_as_ks_ws –按拼音排序 select ChannelID,ChannelName+Description from dbo.HB_AdChannel order by ChannelName+Description collate chinese_
如何修復損壞的MySQL索引
解決方法如下:
找到mysql的安裝目錄的bin/myisamchk工具,
在命令行中輸入:
myisamchk -c -r ../data/dedecmsv4/dede_archives.MYI
然後myisamchk 工具會幫助你恢複數據表的索引。重新啟動mysql,問題解決。
如何處理mysql中表損壞問題
5.9.4. 表維護和崩潰恢復
後面幾節討論如何使用myisamchk來檢查或維護MyISAM表(對應.MYI和.MYD文件的表)。
你可以使用myisamchk實用程序來獲得有關你的數據庫表的信息或檢查、修復、優化他們。下列小節描述如何調用myisamchk(包括它的選項的描述),如何建立表的維護計劃,以及如何使用myisamchk執行各種功能。
儘管用myisamchk修復表很安全,在修復(或任何可以大量更改表的維護操作)之前先進行備份也是很好的習慣
影響索引的myisamchk操作會使ULLTEXT索引用full-text參數重建,不再與MySQL服務器使用的值兼容。要想避免,請閱讀5.9.5.1節,「用於myisamchk的一般選項」的說明。
在許多情況下,你會發現使用SQL語句實現MyISAM表的維護比執行myisamchk操作要容易地多:
· 要想檢查或維護MyISAM表,使用CHECK TABLE或REPAIR TABLE。
· 要想優化MyISAM表,使用OPTIMIZE TABLE。
· 要想分析MyISAM表,使用ANALYZE TABLE。
可以直接這些語句,或使用mysqlcheck客戶端程序,可以提供命令行接口。
這些語句比myisamchk有利的地方是服務器可以做任何工作。使用myisamchk,你必須確保服務器在同一時間不使用表。否則,myisamchk和服務器之間會出現不期望的相互干涉。
5.9.5. myisamchk:MyISAM表維護實用工具
5.9.5.1. 用於myisamchk的一般選項
5.9.5.2. 用於myisamchk的檢查選項
5.9.5.3. myisamchk的修複選項
5.9.5.4. 用於myisamchk的其它選項
5.9.5.5. myisamchk內存使用
5.9.5.6. 將myisamchk用於崩潰恢復
5.9.5.7. 如何檢查MyISAM表的錯誤
5.9.5.8. 如何修復表
5.9.5.9. 表優化
可以使用myisamchk實用程序來獲得有關數據庫表的信息或檢查、修復、優化他們。myisamchk適用MyISAM表(對應.MYI和.MYD文件的表)。
調用myisamchk的方法:
shell myisamchk [options] tbl_name …
options指定你想讓myisamchk做什麼。在後面描述它們。還可以通過調用myisamchk –help得到選項列表。
tbl_name是你想要檢查或修復的數據庫表。如果你不在數據庫目錄的某處運行myisamchk,你必須指定數據庫目錄的路徑,因為myisamchk不知道你的數據庫位於哪兒。實際上,myisamchk不在乎你正在操作的文件是否位於一個數據庫目錄;你可以將對應於數據庫表的文件拷貝到別處並且在那裡執行恢復操作。
如果你願意,可以用myisamchk命令行命名幾個表。還可以通過命名索引文件(用「 .MYI」後綴)來指定一個表。它允許你通過使用模式「*.MYI」指定在一個目錄所有的表。例如,如果你在數據庫目錄,可以這樣在目錄下檢查所有的MyISAM表:
shell myisamchk *.MYI
如果你不在數據庫目錄下,可通過指定到目錄的路徑檢查所有在那裡的表:
shell myisamchk /path/to/database_dir/*.MYI
你甚至可以通過為MySQL數據目錄的路徑指定一個通配符來檢查所有的數據庫中的所有表:
shell myisamchk /path/to/datadir/*/*.MYI
推薦的快速檢查所有MyISAM表的方式是:
shell myisamchk –silent –fast /path/to/datadir/*/*.MYI
如果你想要檢查所有MyISAM表並修復任何破壞的表,可以使用下面的命令:
shell myisamchk –silent –force –fast –update-state \
-O key_buffer=64M -O sort_buffer=64M \
-O read_buffer=1M -O write_buffer=1M \
/path/to/datadir/*/*.MYI
該命令假定你有大於64MB的自由內存。關於用myisamchk分配內存的詳細信息,參見5.9.5.5節,「myisamchk內存使用」。
當你運行myisamchk時,必須確保其它程序不使用表。否則,當你運行myisamchk時,會顯示下面的錯誤消息:
warning: clients are using or haven’t closed the table properly
這說明你正嘗試檢查正被另一個還沒有關閉文件或已經終止而沒有正確地關閉文件的程序(例如mysqld服務器)更新的表。
如果mysqld正在運行,你必須通過FLUSH TABLES強制清空仍然在內存中的任何錶修改。當你運行myisamchk時,必須確保其它程序不使用表。避免該問題的最容易的方法是使用CHECK TABLE而不用myisamchk來檢查表。
5.9.5.1. 用於myisamchk的一般選項
本節描述的選項可以用於用myisamchk執行的任何類型的表維護操作。本節後面的章節中描述的選項只適合具體操作,例如檢查或修復表。
· –help,-?
顯示幫助消息並退出。
· –debug=debug_options, -# debug_options
輸出調試記錄文件。debug_options字符串經常是’d:t:o,filename’。
· –silent,-s
沉默模式。僅當發生錯誤時寫輸出。你能使用-s兩次(-ss)使myisamchk沉默。
· –verbose,-v
冗長模式。打印更多的信息。這能與-d和-e一起使用。為了更冗長,使用-v多次(-vv, -vvv)!
· –version, -V
顯示版本信息並退出。
· –wait, -w
如果表被鎖定,不是提示錯誤終止,而是在繼續前等待到表被解鎖。請注意如果用–skip-external-locking選項運行mysqld,只能用另一個myisamchk命令鎖定表。
還可以通過–var_name=value選項設置下面的變量:
變量
默認值
decode_bits
9
ft_max_word_len
取決於版本
ft_min_word_len
4
ft_stopword_file
內建列表
key_buffer_size
523264
myisam_block_size
1024
read_buffer_size
262136
sort_buffer_size
2097144
sort_key_blocks
16
stats_method
nulls_unequal
write_buffer_size
262136
可以用myisamchk –help檢查myisamchk變量及其 默認值:
當用排序鍵值修復鍵值時使用sort_buffer_size,使用–recover時這是很普通的情況。
當用–extend-check檢查表或通過一行一行地將鍵值插入表中(如同普通插入)來修改鍵值時使用Key_buffer_size。在以下情況通過鍵值緩衝區進行修復:
· 使用–safe-recover。
· 當直接創建鍵值文件時,需要對鍵值排序的臨時文件有兩倍大。通常是當CHAR、VARCHAR、或TEXT列的鍵值較大的情況,因為排序操作在處理過程中需要保存全部鍵值。如果你有大量臨時空間,可以通過排序強制使用myisamchk來修復,可以使用–sort-recover選項。
通過鍵值緩衝區的修復佔用的硬盤空間比使用排序么少,但是要慢。
如果想要快速修復,將key_buffer_size和sort_buffer_size變量設置到大約可用內存的25%。可以將兩個變量設置為較大的值,因為一個時間只使用一個變量。
myisam_block_size是用於索引塊的內存大小。
stats_method影響當給定–analyze選項時,如何為索引統計搜集處理NULL值。它如同myisam_stats_method系統變量。詳細信息參見5.3.3節,「服務器系統變量」和7.4.7節,「MyISAM索引統計集合」的myisam_stats_method的描述。
ft_min_word_len和ft_max_word_len表示FULLTEXT索引的最小和最大字長。ft_stopword_file為停止字文件的文件名。需要在以下環境中對其進行設置。
如果你使用myisamchk來修改表索引(例如修復或分析),使用最小和最大字長和停止字文件的 默認全文參數值(除非你另外指定)重建FULLTEXT索引。這樣會導致查詢失敗。
出現這些問題是因為只有服務器知道這些參數。它們沒有保存在MyISAM索引文件中。如果你修改了服務器中的最小或最大字長或停止字文件,要避免該問題,為用於mysqld的myisamchk指定相同的ft_min_word_len,ft_max_word_len和ft_stopword_file值。例如,如果你將最小字長設置為3,可以這樣使用myisamchk來修復表:
shell myisamchk –recover –ft_min_word_len=3 tbl_name.MYI
要想確保myisamchk和服務器使用相同的全文
MySQL的InnoDB數據文件損壞如何修復
因為被破壞的地方只在索引的部分,所以當使用innodb_force_recovery = 1運行InnoDB時,操作如下:
執行check,repair table 都無效
alter table email_status engine =myisam; #也報錯了,因為模式是innodb_force_recovery =1。
ERROR 1025 (HY000): Error on rename of ‘…’ to ‘….’ (errno: -1)
建立一張表:create table email_status_bak #和原表結構一樣,只是把INNODB改成了MYISAM。把數據導進去insert into email_status_bak select * from email_status;
刪除掉原表:
drop table email_status;
注釋掉innodb_force_recovery 之後,重啟。
重命名:
rename table edm_email_status_bak to email_status;
最後該回存儲引擎
alter table edm_email_status engine = innodb
總結:
這裡的一個重要知識點就是 對 innodb_force_recovery 參數的理解了,要是遇到數據損壞甚至是其他的損壞。可能上面的方法不行了,需要嘗試另一個方法:insert into tb select * from ta limit X;甚至是dump出去,再load回來。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/184989.html