建立索引
在執行CREATE TABLE語句時能夠建立索引,也能夠單獨用CREATE INDEX或ALTER TABLE來爲表增長索引。
ALTER TABLE用來建立普通索引、UNIQUE索引或PRIMARY KEY索引。
Mysql > ALTER TABLE table_name ADD INDEX 索引名(列名);
Mysql > ALTER TABLE table_name ADD UNIQUE (column_list)
Mysql > ALTER TABLE table_name ADD PRIMARY KEY (column_list)
例:在hospital表中增長hid字段爲索引,索引名字爲hid;
Mysql > alter table hospital add index hid(hid);
查看索引
Mysql> show index from hospital;
刪除索引
Mysql > ALTER TABLE table_name DROP INDEX index_name
例:刪除hospital表中hid索引
Mysql > alter table hospital drop index hid;
遇到的問題
當字段類型是BLOB或TEXT,添加索引報以下錯
ERROR 1170 (42000): BLOB/TEXT column 'body' used in key specification without a key length
|
Mysql > use mysql;
Mysql > show grants for rootclub@219.232.241.74;
Grants for root club@219.232.241.74
|
+-------------------------------------------------------------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'rootclub'@'219.232.241.74' IDENTIFIED BY PASSWORD '*CA2E50EF9258EF8601C1AF1BF539510916747A3A' |
| GRANT ALL PRIVILEGES ON `club`.* TO 'rootclub'@'219.232.241.74' WITH GRANT OPTION |
grant SUPER,REPLICATION CLIENT on *.* to houzc@localhost identified by 'qwe123!'
1、當mysql表被損壞,提示以下錯誤
|mysqldump: Got error: 145: Table './cms_sichuan/dede_archives' is marked as crashed and should be repaired when using LOCK TABLES
|
修復方法
/usr/local/mysql/bin/myisamchk -c -r /usr/local/var/cms_sichuan/dede_archives.MYI
輸出
- recovering (with sort) MyISAM-table '/usr/local/var/cms_sichuan/dede_archives.MYI'
Data records: 2702
- Fixing index 1
- Fixing index 2
- Fixing index 3
- Fixing index 4
- Fixing index 5
- Fixing index 6
|
2、沒有中止mysql就重啓系統,mysql報錯
100419 10:19:56 [ERROR] /usr/local/mysql/libexec/mysqld: Table './cms_xyxy/dede_full_search' is marked as crashed and last (automatic?) repair failed
|
修復方法
/usr/local/mysql/bin/mysql -uroot -p
> use cms_xyxy
> repair table dede_full_search
3、修復全部表
中止mysql服務
# /usr/local/mysql/bin/myisamchk -r /data/mysqldata/club/*.MYI
多數狀況下,數據庫被破壞只是指索引文件受到了破壞,真正的數據被破壞掉的狀況很是少。大多數形式的數據庫破壞的的修復至關簡單。
和前面的校驗同樣,修復的方式也有三種。
下面講的方法只對MyISAM格式的表有效。其餘類型的損壞須要從備份中恢復。
1,REPAIR TABLE SQL statement(mysql服務必須處於運行狀態)。
2,命令mysqlcheck(mysql服務能夠處於運行狀態)。
3,命令myisamchk(必須停掉mysql服務,或者所操做的表處於不活動狀態)。
在修復表的時候,最好先做一下備份。因此你須要兩倍於原始表大小的硬盤空間。請確保在進行修復前你的硬盤空間尚未用完。
1>用」repair table」方式修復
語法:repair table 表名 [選項]
選項以下:
QUICK 用在數據表還沒被修改的狀況下,速度最快
EXTENDED 試圖去恢復每一個數據行,會產生一些垃圾數據行,萬般無奈的狀況下用
USE_FRM 用在.MYI文件丟失或者頭部受到破壞的狀況下。利用.frm的定義來重建索引
多數狀況下,簡單得用」repair table tablename」不加選項就能夠搞定問題。可是當.MYI文件丟失或者頭部受到破壞時,這樣的方式無論用,例如:
mysql> REPAIR TABLE mytable;
+————————-+——–+———-+———————————————+
| Table | Op | Msg_type | Msg_text |
+————————-+——–+———-+———————————————+
| sports_results.mytable | repair | error | Can’t find file: ‘mytable.MYI’ (errno: 2) |
+————————-+——–+———-+———————————————+
修復失敗的緣由時索引文件丟失或者其頭部遭到了破壞,爲了利用相關定義文件來修復,須要用USE_FRM選項。例如:
mysql> REPAIR TABLE mytable USE_FRM;
+————————-+——–+———-+————————————+
| Table | Op | Msg_type | Msg_text |
+————————-+——–+———-+————————————+
| sports_results.mytable | repair | warning | Number of rows changed from 0 to 2 |
| sports_results.mytable | repair | status | OK |
+————————-+——–+———-+————————————+
咱們能夠看到Msg_test表項的輸出信息」ok」,表名已經成功修復受損表。
2>用mysql內建命令mysqlcheck來修復
當mysql服務在運行時,也能夠用mysql內建命令mysqlcheck來修復。
語法:mysqlcheck -r 數據庫名 表名 -uuser -ppass
%mysqlcheck -r sports_results mytable -uuser -ppass
sports_results.mytable OK
利用mysqlcheck能夠一次性修復多個表。只要在數據庫名後列出相應表名便可(用空格隔開)。或者數據庫名後不加表名,將會修復數據庫中的全部表,例如:
%mysqlcheck -r sports_results mytable events -uuser -ppass
sports_results.mytable OK
sports_results.events OK
%mysqlcheck -r sports_results -uuser -ppass
sports_results.mytable OK
sports_results.events OK
3>用myisamchk修復
用這種方式時,mysql服務必須停掉,或者所操做的表處於不活動狀態(選項skip-external-locking沒被使用)。記着必定要在相關.MYI文件的路徑下或者本身定義其路徑。
語法:myisamchk [選項] [表名]
下面是其選項和描述
–backup, -B 在進行修復前做相關表得備份
–correct-checksum 糾正校驗和
–data-file-length=#, -D # 重建表時,指定數據文件得最大長度
–extend-check, -e 試圖去恢復每一個數據行,會產生一些垃圾數據行,萬般無奈的狀況下用
–force, -f 當遇到文件名相同的.TMD文件時,將其覆蓋掉。
keys-used=#, -k # 指定所用的keys可加快處理速度,每一個二進制位表明一個key.第一個key爲0
–recover, -r 最經常使用的選項,大多數破壞均可以經過它來修復。若是你的內存足夠大,能夠增大參數sort_buffer_size的值來加快恢復的速度。可是遇到惟一鍵因爲破壞而不惟一 的表時,這種方式無論用。
–safe-recover -o 最完全的修復方式,可是比-r方式慢,通常在-r修復失敗後才使用。這種方式讀出 全部的行,並以行爲基礎來重建索引。它的硬盤空間需求比-r方式稍微小一點,因 爲它沒建立分類緩存。你能夠增長key_buffer_size的值來加快修復的速度。
–sort-recover, -n mysql用它類分類索引,儘管結果是臨時文件會很是大
–character-sets-dir=… 包含字符集設置的目錄
–set-character-set=name 爲索引定義一個新的字符集
–tmpdir=path, -t 若是你不想用環境變量TMPDIR的值的話,能夠自定義臨時文件的存放位置
–quick, -q 最快的修復方式,當數據文件沒有被修改時用,當存在多鍵時,第二個-q將會修改 數據文件
–unpack, -u 解開被myisampack打包的文件
myisamchk應用的一個例子
% myisamchk -r mytable
- recovering (with keycache) MyISAM-table ‘mytable.MYI’
Data records: 0
# /usr/local/mysql/bin/mysqlbinlog mysql-bin.000026 > test26.sql
# /usr/local/mysql/bin/mysqlbinlog mysql-bin.000028 --start-position 1010663046 > test28.sql
// --start-position 選擇起始節點
Mysql > delete from user_common_new where pid in (select pid from tmppp) and age is null;
//刪除user_common_new表中的pid與tmppp表中的pid相等 且 年齡爲空的信息
Mysql出現的錯誤解決:
出現1040 錯誤
max_connections=1000 修改鏈接數
:http://blog.sina.com.cn/s/blog_6b92dc3b0100nhw2.html
解決方法:
因爲BLOB和TEXT類型的數據列只能索引前500個前綴,則添加時註明長度
Mysql > alter table news add index body_index(body (499));
通常mysql安裝完,默認的數據存儲路徑在/usr/local/mysql/data中,能夠把數據存儲到其餘路徑,步驟以下
# mkdir /data/mysqldata
# chown root:root /data
# chown -R mysql:mysql /data/mysqldata
若是已經有數據了,將/usr/local/mysql/data下的文件拷貝到新位置
# cp -r /usr/local/mysql/data/* /data/mysqldata
# chown -R mysql:mysql /data/mysqldata
修改mysql配置
# vi /etc/my.cnf
[mysql]
datadir = /data/mysqldata
innodb_data_home_dir = /data/mysqldata
innodb_data_file_path = ibdata1:10M:autoextend
innodb_log_group_home_dir = /data/mysqldata |