### 第8章:客戶端和實用工具程序
** 目錄**
[ 8.1. 客戶端腳本和實用工具概述](#)[8.2. myisampack:生成壓縮、只讀MyISAM表](#)[ 8.3. mysql:MySQL命令行工具](#)[ 8.3.1. 選項](#)[8.3.2. ** mysql**命令](#)[ 8.3.3. 怎樣從文本文件執行SQL語句](#)[8.3.4. ** mysql**技巧](#)[ 8.4. mysqlaccess:用于檢查訪問權限的客戶端](#)[ 8.5. mysqladmin:用于管理MySQL服務器的客戶端](#)[ 8.6. mysqlbinlog:用于處理二進制日志文件的實用工具](#)[ 8.7. mysqlcheck:表維護和維修程序](#)[ 8.8. mysqldump:數據庫備份程序](#)[ 8.9. mysqlhotcopy:數據庫備份程序](#)[ 8.10. mysqlimport:數據導入程序](#)[ 8.11. mysqlshow-顯示數據庫、表和列信息](#)[ 8.12. myisamlog:顯示MyISAM日志文件內容](#)[ 8.13. perror:解釋錯誤代碼](#)[ 8.14. replace:字符串替換實用工具](#)[ 8.15. mysql_zap:殺死符合某一模式的進程](#)
有許多不同的MySQL客戶端程序可以連接服務器以訪問數據庫或執行管理任務。也可以使用其它工具。這些程序不與服務器進行通訊但可以執行MySQL相關的操作。
本章簡述了這些程序然后詳細描述了每個程序。描述了如何調用這些程序和它們理解的選項。調用程序和指定程序選項的總信息參見[第4章:](#)[*MySQL程序概述*](# "Chapter?4.?Using MySQL Programs")。
### 8.1.?客戶端腳本和實用工具概述
下面簡單列出了MySQL客戶端程序和實用工具:
·???????? myisampack
壓縮MyISAM表以產生更小的只讀表的一個工具。參見[8.2節,“myisampack:生成壓縮、只讀MyISAM表”](# "8.2.?myisampack — Generate Compressed, Read-Only MyISAM Tables")。
·???????? mysql
交互式輸入SQL語句或從文件以批處理模式執行它們的命令行工具。參見[8.3節,“mysql:MySQL命令行工具”](# "8.3.?mysql — The MySQL Command-Line Tool")。
·???????? mysqlaccess
檢查訪問主機名、用戶名和數據庫組合的權限的腳本。
·???????? mysqladmin
執行管理操作的客戶程序,例如創建或刪除數據庫,重載授權表,將表刷新到硬盤上,以及重新打開日志文件。**mysqladmin**還可以用來檢索版本、進程,以及服務器的狀態信息。參見[8.5節,“mysqladmin:用于管理MySQL服務器的客戶端”](# "8.5.?mysqladmin — Client for Administering a MySQL Server")。
·???????? mysqlbinlog
從二進制日志讀取語句的工具。在二進制日志文件中包含的執行過的語句的日志可用來幫助從崩潰中恢復。參見[8.6節,“mysqlbinlog:用于處理二進制日志文件的實用工具”](# "8.6.?mysqlbinlog — Utility for Processing Binary Log Files")。
·???????? mysqlcheck
檢查、修復、分析以及優化表的表維護客戶程序。參見[8.7節,“mysqlcheck:表維護和維修程序”](# "8.7.?mysqlcheck — A Table Maintenance and Repair Program")。
·???????? mysqldump
將MySQL數據庫轉儲到一個文件(例如SQL語句或tab分隔符文本文件)的客戶程序。增強版免費軟件首先由Igor Romanenko提供。參見[8.8節,“mysqldump:數據庫備份程序”](# "8.8.?mysqldump — A Database Backup Program")。
·???????? mysqlhotcopy
當服務器在運行時,快速備份MyISAM或ISAM表的工具。參見[8.9節,“mysqlhotcopy:數據庫備份程序”](# "8.9.?mysqlhotcopy — A Database Backup Program")。
·???????? mysql import
使用LOAD DATA INFILE將文本文件導入相關表的客戶程序。參見[8.10節,“mysqlimport:數據導入程序”](# "8.10.?mysqlimport — A Data Import Program")。
·???????? mysqlshow
顯示數據庫、表、列以及索引相關信息的客戶程序。參見[8.11節,“mysqlshow:顯示數據庫、表和列信息”](# "8.11.?mysqlshow — Display Database, Table, and Column Information")。
·???????? perror
顯示系統或MySQL錯誤代碼含義的工具。參見[8.13節,“perror:解釋錯誤代碼”](# "8.13.?perror — Explain Error Codes")。
·???????? replace
更改文件中或標準輸入中的字符串的實用工具。參見[8.14節,“replace:字符串替換實用工具”](# "8.14.?replace — A String-Replacement Utility")。
MySQL AB還提供了大量GUI工具用于管理和MySQL服務器的其它工作。相關基本信息參見[第4章:](#)[*MySQL程序概述*](# "Chapter?4.?Using MySQL Programs")。
每個MySQL程序有許多不同的選項。但每個MySQL程序均提供一個---help選項,可以用來全面描述程序不同的選項。例如,可以試試**mysql---help**。
使用mysqlclient庫同服務器進行通訊的MySQL客戶使用下面的環境變量:
<table border="1" cellpadding="0" id="table1"><tr><td> <p> <span>MYSQL_UNIX_PORT</span></p></td> <td> <p>默認<span>Unix</span>套接字文件;用于連接<span>localhost</span></p></td> </tr><tr><td> <p> <span>MYSQL_TCP_PORT</span></p></td> <td> <p>默認端口號;用于<span>TCP/IP</span>連接</p></td> </tr><tr><td> <p> <span>MYSQL_PWD</span></p></td> <td> <p>默認密碼</p></td> </tr><tr><td> <p> <span>MYSQL_DEBUG</span></p></td> <td> <p>調試過程中的調試跟蹤選項</p></td> </tr><tr><td> <p> <span>TMPDIR</span></p></td> <td> <p>創建臨時表和文件的目錄</p></td> </tr></table>
使用MYSQL_PWD不安全。參見[5.8.6節,“使你的密碼安全”](# "5.8.6.?Keeping Your Password Secure")。
可以在選項文件中或在命令行中指定選項來替換所有標準程序的默認選項值或指定的環境變量的值。參見[4.3節,“指定程序選項”](# "4.3.?Specifying Program Options")。
### 8.2.?myisampack:生成壓縮、只讀MyISAM表
**myisampack**工具可以壓縮MyISAM表.MYI**sampack**分別壓縮表中的每一列。通常,**myisampack**可以將數據文件壓縮到40%-70%。
當以后使用表時,解壓縮列需要的信息被讀入內存。當訪問具體的記錄時性能會更好,因為你只需要解壓縮一個記錄。
MySQL使用mmap()對壓縮的表進行內存映射。如果mmap()不工作,MySQL返回到普通讀/寫文件操作。
請注意:
·???????? 如果用--skip-external-locking選項調用**mysqld**服務器,如果在壓縮過程中表可能被更新,調用**myisampack**不是一個好注意。
·???????? 表壓縮后,它變為只讀。這是故意的(例如當訪問CD上的壓縮的表時)。允許寫入到壓縮的表位于我們的TODO列表中,但優先級較低。
·???????? **myisampack**可以壓縮BLOB或TEXT列。舊版本ISAM表的**pack_isam**程序不可以。
調用**myisampack**的方法:
~~~
shell> myisampack [options] filename ...
~~~
文件名應為索引(.MYI)文件的文件名。如果不在數據庫目錄,應指定文件的路徑名。允許忽略.MYI擴展名。
**myisampack**支持下面的選項:
·???????? --help,-?
顯示幫助消息并退出。
·???????? --backup,-b
使用*tbl_name*.OLD名備份表數據文件。
·???????? ---debug[=*debug_options*],-# [*debug_options*]
寫調試日志。*debug_options*字符串通常為'd:t:o,*file_name*'。
·???????? --force,-f
產生一個壓縮的表,即使它比原始表大,或如果以前調用**myisampack**的中間文件存在。(**myisampack**壓縮表時在數據庫目錄中創建一個名為*tbl_name*.TMD的中間文件。如果殺掉**myisampack**,.TMD文件會被刪除)。通常情況,如果**myisampack**發現*tbl_name*.TMD存在則退出并提示錯誤。用--force,**myisampack**則一定壓縮表。
·???????? -join=*big_tbl_name*,-j *big_tbl_name*
將命令行中的所有表聯接為一個表*big_tbl_name*。將要連接的所有表必須有相等的結構(相同的列名和類型,相同的索引等等)。
·???????? --pack length=*len*,-p *len*
指定記錄長度存儲大小,以字節計。值應為1、2或者3。**myisampack**保存所有長度指針為1、2或者3字節的行。在大多數正常情況下,**myisampack**在開始壓縮文件前可以確定準確的長度值,但在壓縮過程中它可以提示它可能已經使用了一個短的長度。在這種情況下,**myisampack**輸出一條提示,下次你壓縮同一文件時,你可以使用更短的記錄長度。
·???????? --silent,-s
沉默模式。只有發生錯誤時才寫輸出。
·???????? --test,-t
沒有實際地壓縮表,只是測試壓縮。
·???????? --tmpdir=*path*,-T *path*
使用**myisamchk**創建臨時文件的目錄。
·???????? --verbose,-v
冗長模式。寫壓縮操作過程相關信息和其結果。
·???????? --version,-V
顯示版本信息并退出。
·???????? --wait,-w
如果表正使用則等待并重試。如果用--skip-external-locking選項調用了**mysqld**服務器,如果在壓縮過程中表可能被更新,調用**myisampack**不是一個好注意。
下面的順序命令說明了典型的表壓縮會話:
~~~
shell> ls -l station.*
~~~
~~~
-rw-rw-r--?? 1 monty??? my???????? 994128 Apr 17 19:00 station.MYD
~~~
~~~
-rw-rw-r--?? 1 monty??? my????????? 53248 Apr 17 19:00 station.MYI
~~~
~~~
-rw-rw-r--?? 1 monty??? my?????????? 5767 Apr 17 19:00 station.frm
~~~
~~~
?
~~~
~~~
shell> myisamchk -dvv station
~~~
~~~
?
~~~
~~~
MyISAM file:???? station
~~~
~~~
Isam-version:? 2
~~~
~~~
Creation time: 1996-03-13 10:08:58
~~~
~~~
Recover time:? 1997-02-02? 3:06:43
~~~
~~~
Data records:????????????? 1192? Deleted blocks:????????????? 0
~~~
~~~
Datafile parts:??????????? 1192? Deleted data:??????????????? 0
~~~
~~~
Datafile pointer (bytes):???? 2? Keyfile pointer (bytes): ????2
~~~
~~~
Max datafile length:?? 54657023? Max keyfile length:?? 33554431
~~~
~~~
Recordlength:?????????????? 834
~~~
~~~
Record format: Fixed length
~~~
~~~
?
~~~
~~~
table description:
~~~
~~~
Key Start Len Index?? Type???????????????? Root? Blocksize??? Rec/key
~~~
~~~
1?? 2???? 4?? unique? unsigned long??????? 1024?????? 1024????????? 1
~~~
~~~
2?? 32??? 30? multip. text??????????????? 10240?????? 1024????????? 1
~~~
~~~
?
~~~
~~~
Field Start Length Type
~~~
~~~
1???? 1???? 1
~~~
~~~
2???? 2???? 4
~~~
~~~
3???? 6???? 4
~~~
~~~
4???? 10??? 1
~~~
~~~
5???? 11??? 20
~~~
~~~
6???? 31??? 1
~~~
~~~
7???? 32??? 30
~~~
~~~
8???? 62??? 35
~~~
~~~
9???? 97? ??35
~~~
~~~
10??? 132?? 35
~~~
~~~
11??? 167?? 4
~~~
~~~
12??? 171?? 16
~~~
~~~
13??? 187?? 35
~~~
~~~
14??? 222?? 4
~~~
~~~
15??? 226?? 16
~~~
~~~
16??? 242?? 20
~~~
~~~
17??? 262?? 20
~~~
~~~
18??? 282?? 20
~~~
~~~
19??? 302?? 30
~~~
~~~
20??? 332?? 4
~~~
~~~
21??? 336?? 4
~~~
~~~
22??? 340?? 1
~~~
~~~
23??? 341?? 8
~~~
~~~
24??? 349?? 8
~~~
~~~
25??? 357?? 8
~~~
~~~
26??? 365?? 2
~~~
~~~
27?? ?367?? 2
~~~
~~~
28??? 369?? 4
~~~
~~~
29??? 373?? 4
~~~
~~~
30??? 377?? 1
~~~
~~~
31??? 378?? 2
~~~
~~~
32??? 380?? 8
~~~
~~~
33??? 388?? 4
~~~
~~~
34??? 392?? 4
~~~
~~~
35??? 396?? 4
~~~
~~~
36??? 400?? 4
~~~
~~~
37??? 404?? 1
~~~
~~~
38??? 405?? 4
~~~
~~~
39??? 409?? 4
~~~
~~~
40??? 413?? 4
~~~
~~~
41??? 417?? 4
~~~
~~~
42??? 421?? 4
~~~
~~~
43??? 425?? 4
~~~
~~~
44??? 429?? 20
~~~
~~~
45??? 449?? 30
~~~
~~~
46??? 479?? 1
~~~
~~~
47??? 480?? 1
~~~
~~~
48??? 481?? 79
~~~
~~~
49??? 560?? 79
~~~
~~~
50??? 639?? 79
~~~
~~~
51??? 718?? 79
~~~
~~~
52??? 797?? 8
~~~
~~~
53??? 805?? 1
~~~
~~~
54??? 806?? 1
~~~
~~~
55??? 807?? 20
~~~
~~~
56??? 827?? 4
~~~
~~~
57??? 831?? 4
~~~
~~~
?
~~~
~~~
shell> myisampack station.MYI
~~~
~~~
Compressing station.MYI: (1192 records)
~~~
~~~
- Calculating statistics
~~~
~~~
?
~~~
~~~
normal:???? 20? empty-space:?? 16? empty-zero:???? 12? empty-fill:? 11
~~~
~~~
pre-space:?? 0? end-space:???? 12? table-lookups:?? 5? zero:???????? 7
~~~
~~~
Original trees:? 57? After join: 17
~~~
~~~
- Compressing file
~~~
~~~
87.14%
~~~
~~~
Remember to run myisamchk -rq on compressed tables
~~~
~~~
?
~~~
~~~
shell> ls -l station.*
~~~
~~~
-rw-rw-r--?? 1 monty??? my???????? 127874 Apr 17 19:00 station.MYD
~~~
~~~
-rw-rw-r--?? 1 monty??? my????????? 55296 Apr 17 19:04 station.MYI
~~~
~~~
-rw-rw-r--?? 1 monty??? my?????????? 5767 Apr 17 19:00 station.frm
~~~
~~~
?
~~~
~~~
shell> myisamchk -dvv station
~~~
~~~
?
~~~
~~~
MyISAM file:???? station
~~~
~~~
Isam-version:? 2
~~~
~~~
Creation time: 1996-03-13 10:08:58
~~~
~~~
Recover time:? 1997-04-17 19:04:26
~~~
~~~
Data records:?????????????? 1192? Deleted blocks:????????????? 0
~~~
~~~
Datafile parts:???????????? 1192? Deleted data:??????????????? 0
~~~
~~~
Datafile pointer (bytes):????? 3? Keyfile pointer (bytes):???? 1
~~~
~~~
Max datafile length:??? 16777215? Max keyfile length:???? 131071
~~~
~~~
Recordlength:??????????????? 834
~~~
~~~
Record format: Compressed
~~~
~~~
?
~~~
~~~
table description:
~~~
~~~
Key Start Len Index?? Type? ???????????????Root? Blocksize??? Rec/key
~~~
~~~
1?? 2???? 4?? unique? unsigned long?????? 10240?????? 1024????????? 1
~~~
~~~
2?? 32??? 30? multip. text??????????????? 54272?????? 1024????????? 1
~~~
~~~
?
~~~
~~~
Field Start Length Type???????????????????????? Huff tree? Bits
~~~
~~~
1???? 1 ????1????? constant???????????????????????????? 1???? 0
~~~
~~~
2???? 2???? 4????? zerofill(1)????????????????????????? 2???? 9
~~~
~~~
3???? 6???? 4????? no zeros, zerofill(1)??????????????? 2???? 9
~~~
~~~
4???? 10??? 1?????????????????????????????????????????? 3???? 9
~~~
~~~
5???? 11??? 20???? table-lookup???????????????????????? 4???? 0
~~~
~~~
6???? 31??? 1?????????????????????????????????????????? 3???? 9
~~~
~~~
7???? 32??? 30???? no endspace, not_always????????????? 5???? 9
~~~
~~~
8???? 62??? 35???? no endspace, not_always, no empty??? 6???? 9
~~~
~~~
9???? 97??? 35???? no empty???????????????????????????? 7???? 9
~~~
~~~
10??? 132?? 35???? no endspace, not_always, no empty??? 6???? 9
~~~
~~~
11??? 167?? 4????? zerofill(1)????????????????????????? 2???? 9
~~~
~~~
12??? 171?? 16???? no endspace, not_always, no empty??? 5???? 9
~~~
~~~
13??? 187?? 35???? no endspace, not_always, no empty??? 6???? 9
~~~
~~~
14??? 222?? 4????? zerofill(1)????????????????????????? 2???? 9
~~~
~~~
15??? 226?? 16???? no endspace, not_always, no empty??? 5???? 9
~~~
~~~
16??? 242?? 20???? no endspace, not_always????????????? 8???? 9
~~~
~~~
17??? 262?? 20???? no endspace, no empty??????????????? 8???? 9
~~~
~~~
18??? 282?? 20???? no endspace, no empty??????????????? 5???? 9
~~~
~~~
19??? 302?? 30???? no endspace, no empty??????????????? 6???? 9
~~~
~~~
20??? 332?? 4????? always zero????????????????????????? 2???? 9
~~~
~~~
21??? 336?? 4????? always zero????????????????????????? 2???? 9
~~~
~~~
22??? 340?? 1?????????????????????????????????????????? 3???? 9
~~~
~~~
23??? 341?? 8????? table-lookup???????????????????????? 9???? 0
~~~
~~~
24??? 349?? 8????? table-lookup??????????????????????? 10???? 0
~~~
~~~
25??? 357?? 8????? always zero????????????????????????? 2???? 9
~~~
~~~
26??? 365?? 2?????????????????????????????????????????? 2???? 9
~~~
~~~
27??? 367?? 2????? no zeros, zerofill(1)??????????????? 2???? 9
~~~
~~~
28??? 369?? 4????? no zeros, zerofill(1)??????????????? 2???? 9
~~~
~~~
29??? 373?? 4????? table-lookup??????????????????????? 11???? 0
~~~
~~~
30??? 377?? 1?????????????????????????????????????????? 3???? 9
~~~
~~~
31??? 378?? 2????? no zeros, zerofill(1)??????????????? 2???? 9
~~~
~~~
32??? 380?? 8????? no zeros???????????????????????????? 2???? 9
~~~
~~~
33??? 388?? 4????? always zero????????????????????????? 2???? 9
~~~
~~~
34??? 392?? 4????? table-lookup??????????????????????? 12???? 0
~~~
~~~
35??? 396?? 4????? no zeros, zerofill(1)?????????????? 13???? 9
~~~
~~~
36??? 400?? 4????? no zeros, zerofill(1)??????????????? 2???? 9
~~~
~~~
37??? 404?? 1?????????????????????????????????????????? 2???? 9
~~~
~~~
38??? 405?? 4????? no zeros???????????????????????????? 2???? 9
~~~
~~~
39??? 409?? 4????? always zero????????????????????????? 2???? 9
~~~
~~~
40??? 413?? 4????? no zeros???????????????????????????? 2???? 9
~~~
~~~
41??? 417?? 4????? always zero????????????????????????? 2???? 9
~~~
~~~
42??? 421?? 4????? no zeros???????????????????????????? 2???? 9
~~~
~~~
43??? 425?? 4????? always zero????????????????????????? 2???? 9
~~~
~~~
44??? 429?? 20???? no empty???????????????????????????? 3???? 9
~~~
~~~
45??? 449?? 30???? no empty???????????????????????????? 3???? 9
~~~
~~~
46??? 479?? 1????????????????????????????????????????? 14???? 4
~~~
~~~
47??? 480?? 1????????????????????????????????????????? 14???? 4
~~~
~~~
48??? 481?? 79???? no endspace, no empty?????????????? 15???? 9
~~~
~~~
49??? 560?? 79???? no empty???????????????????????????? 2???? 9
~~~
~~~
50??? 639?? 79???? no empty???????????????????????????? 2???? 9
~~~
~~~
51??? 718?? 79???? no endspace???????????????????????? 16???? 9
~~~
~~~
52??? 797?? 8????? no empty???????????????????????????? 2???? 9
~~~
~~~
53??? 805?? 1????????????????????????????????????????? 17???? 1
~~~
~~~
54??? 806?? 1?????????????????????????????????????????? 3???? 9
~~~
~~~
55??? 807?? 20???? no empty???????????????????????????? 3???? 9
~~~
~~~
56??? 827?? 4????? no zeros, zerofill(2)??????????????? 2???? 9
~~~
~~~
57??? 831?? 4????? no zeros, zerofill(1)??????????????? 2???? 9
~~~
**myisampack**顯示下面的各種信息:
·???????? normal
不需要進行額外壓縮的列的數量。
·???????? empty-space
只包含空格的列的數量;占一個比特。
·???????? empty-zero
只包含二進制零的列的數量;占一個比特。
·???????? empty-fill
不占該類全字節范圍的整數列的數量;這些列被改為較小的類型。例如,如果所有值的范圍為從-128到127,BIGINT列(8個字節)可以保存為TINYINT列(1個字節)。
·???????? pre-space
用引導空格保存的十進制列的數量。在這種情況下,每個值包含一個引導空格的數量計數。
·???????? end-space
有大量結尾空格的列的數量。在這種情況下,每個值包含一個結尾空格的數量計數。
·???????? table-lookup
該列只有少量的不同的值,在進行哈夫曼壓縮前被轉換為一個ENUM。
·???????? zero
所有值為零的列的數量。
·???????? Original trees
哈夫曼樹的最初數量。
·???????? After join
聯接樹以節省一些頭空間之后留下的哈夫曼樹的數量。
表被壓縮后,**myisamchk -dvv**為每列輸出詳細信息:
·???????? Type
列的類型。該值可以包含下面的任何描述符:
o??????? constant
所有行具有相同的值。
o??????? no endspace
不保存結尾空格。
o??????? no endspace,not_always
不保存結尾空格并且對于所有的值不壓縮結尾空格。
o??????? no endspace,no empty
不保存結尾空格。不保存空值。
o??????? table-lookup
列被轉換為一個ENUM。
o??????? zerofill(*n*)
值中最有意義的*n*字節總為0,并且不保存。
o??????? no zeros
不保存零。
o??????? always zeros
用一個位保存零值。
·???????? Huff tree
列相關的哈夫曼樹的數量。
·???????? Bits
哈夫曼樹使用的位數。
運行**myisampack**后,必須運行**myisamchk**以重新創建索引。此時,你也可以排序索引塊并創建MySQL優化器需要的統計信息以更有效地工作:
~~~
shell> myisamchk -rq --sort-index --analyze tbl_name.MYI
~~~
將壓縮的表安裝到MySQL數據庫目錄中后,應執行**mysqladmin flush-tables**以強制**mysqld**使用新的表。
要想解壓縮一個壓縮的表,使用**myisamchk**或**isamchk**的--unpack選項。
### 8.3.?mysql:MySQL命令行工具
[ 8.3.1. 選項](#)[8.3.2. ** mysql**命令](#)[ 8.3.3. 怎樣從文本文件執行SQL語句](#)[8.3.4. ** mysql**技巧](#)
**mysql**是一個簡單的SQL外殼(有GNU readline功能)。它支持交互式和非交互式使用。當交互使用時,查詢結果采用ASCII表格式。當采用非交互式(例如,用作過濾器)模式時,結果為tab分割符格式。可以使用命令行選項更改輸出格式。
如果由于結果較大而內存不足遇到問題,使用--quick選項。這樣可以強制**mysql**從服務器每次一行搜索結果,而不是檢索整個結果集并在顯示之前不得不將它保存到內存中。使用mysql_use_result()而不是mysql_store_result()來搜索結果集。
使用**mysql**很簡單。從命令解釋符提示來調用它:
~~~
shell> mysql db_name
~~~
或:
~~~
shell> mysql --user=user_name --password=your_password db_name
~~~
這樣輸入一個SQL語句,用‘;’、\g或者\G結尾并按回車鍵。
你可以這樣運行一個腳本:
~~~
shell> mysql db_name < script.sql > output.tab
~~~
### 8.3.1.?選項
**mysql**支持下面的選項:
·???????? ---help,-?
顯示幫助消息并退出。
·???????? --batch,-B
打印結果,使用tab作為列間隔符,每個行占用新的一行。使用該選項,則**mysql**不使用歷史文件。
·???????? --character-sets -dir=*path*
字符集的安裝目錄。參見[5.10.1節,“數據和排序用字符集”](# "5.10.1.?The Character Set Used for Data and Sorting")。
·???????? --compress,-C
壓縮在客戶端和服務器之間發送的所有信息(如果二者均支持壓縮)。
·???????? ---database=*db_name*,-D *db_name*
要使用的數據庫。主要在選項文件中有用。
·???????? ---debug[=*debug_options*],-# [*debug_options*]
寫調試日志。*debug_options*字符串通常為'd:t:o,*file_name*'。 默認為'd:t:o,/tmp/mysql.trace'。
·???????? ---debug-info,-T
當程序退出時輸出部分調試信息。
·???????? --default-character-set=*charset*
使用*charset*as作為默認字符集。參見[5.10.1節,“數據和排序用字符集”](# "5.10.1.?The Character Set Used for Data and Sorting")。
·???????? --execute=*statement*, -e *statement*
執行語句并退出。默認輸出格式與用--batch產生的相同。[4.3.1節,“在命令行上使用選項”](# "4.3.1.?Using Options on the Command Line")中提供了一些例子。
·???????? --force,-f
即使出現一個SQL錯誤仍繼續。
·???????? --host=*host_name*,-h *host_name*
連接給定主機上的MySQL服務器。
·???????? --html,-H
產生HTML輸出。
·???????? --ignore-space,-i
忽視函數名后面的空格。其結果描述參見[5.3.2節,“SQL服務器模式”](# "5.3.2.?The Server SQL Mode")中的IGNORE_SPACE的討論。
·???????? --local-infile[={0|1}]
為LOAD DATA INFILE啟用或禁用LOCAL功能。沒有值,該選項啟用LOCAL。還可以采用--local-infile=0或--local-infile=1以顯式禁用或啟用LOCAL。如果服務器不支持,啟用LOCAL不會生效。
·???????? --named-commands,-G
命名的命令被*啟用*。允許長格式命令和短格式\*命令。例如,quit和\q均被識別。
·???????? --no-auto-rehash,-A
不自動重新進行哈希運算。該選項使**mysql**啟動得更快,但果你想要完成表和列名,你必須發出rehash命令。
·???????? --no-beep,-b
當發生錯誤時不要保持。
·???????? --no-named-commands,-g
命名的命令被禁用。只使用\*形式,或者只使用行開頭的命名用分號(‘;’)結束的的命令。對于MySQL 3.23.22,默認情況**mysql**啟動時啟用該選項。然而,即使使用該選項,長格式命令仍然從第1行工作。
·???????? --no-pager
不使用分頁器來顯示查詢輸出。在[8.3.2節,“**mysql**命令”](# "8.3.2.?mysql Commands")中詳細討論了輸出分頁。
·???????? --no-tee
不將輸出復制到文件中。在[8.3.2節,“**mysql**命令”](# "8.3.2.?mysql Commands")中詳細討論了Tee文件。
·???????? --one--database,-O
忽視除了為命令行中命名的默認數據庫的語句。可以幫助跳過對二進制日志中的其它數據庫的更新。
·???????? --pager[=*command*]
使用給出的命令來分頁查詢輸出。如果該命令被刪除,默認分頁器為PAGER環境變量的值。合法pagers是**less、more、cat [>filename]**等等。該選項只在Unix中工作。不能以批處理模式工作。在[8.3.2節,“**mysql**命令”](# "8.3.2.?mysql Commands")中詳細討論了輸出分頁。
·???????? --password[=*password*],-p[*password*]
當連接服務器時使用的密碼。如果使用短選項形式(-p),選項和 密碼之間*不能*有空格。如果在命令行中--password或-p選項后面沒有 密碼值,則提示輸入一個密碼。在SysV-based UNIX系統中應省略密碼,因為密碼可以顯示在ps的輸出中。
·???????? --port=*port_num*,-P *port_num*
用于連接的TCP/IP端口號。
·???????? --prompt=*format_str*
將提示設置為指定的格式。默認為mysql>。在[8.3.2節,“**mysql**命令”](# "8.3.2.?mysql Commands")中描述了提示中可以包含的具體順序。
·???????? --protocol={TCP | SOCKET | PIPE | MEMORY}
使用的連接協議。
·???????? --quick,-q
不緩存每個查詢的結果,按照接收順序打印每一行。如果輸出被掛起,服務器會慢下來。使用該選項,**mysql**不使用歷史文件。
·???????? --raw,-r
寫列的值而不轉義轉換。通常結合--batch選項使用。
·???????? --reconnect
如果與服務器之間的連接斷開,自動嘗試重新連接。每次連接斷開后則嘗試一次重新連接。要想禁止重新連接,使用--skip-reconnect。
·???????? --safe-updates,--i-am-a-dummy,-U
只允許那些使用鍵值指定行生效的UPDATE和DELETE語句。如果已經在選項文件中設置了該選項,可以用命令行中的--safe-updates覆蓋它。關于該選項的詳細信息參見[8.3.4節,“**mysql**技巧”](# "8.3.4.?mysql Tips")。
·???????? --secure-auth
不向舊(pre-4.1.1)格式的服務器發送密碼。這樣可以防止不使用新密碼格式的服務器的連接。
·???????? --show-warnings
如果每個語句后有警告則顯示。該選項適用于交互式和批處理模式。
·???????? --sigint-ignore
忽視SIGINT符號(一般為Control-C的結果)。
·???????? --silent,-s
沉默模式。產生少的輸出。可以多次使用該選項以產生更少的輸出。
·???????? --skip-column-names,-N
在結果中不寫列名。
·???????? --skip-line-numbers,-L
在錯誤信息中不寫行號。當你想要比較包括錯誤消息的結果文件時有用。
·???????? --socket=*path*,-S *path*
用于連接的套接字文件。
·???????? --tables,-t
用表格式顯示輸出。這是交互式應用的默認設置,但可用來以批處理模式產生表輸出。
·???????? --tee=*file_name*
將輸出拷貝添加到給定的文件中。該選項在批處理模式不工作。在[8.3.2節,“**mysql**命令”](# "8.3.2.?mysql Commands")中詳細討論了Tee文件。
·???????? --unbuffered,-n
每次查詢后刷新緩存區。
·???????? --user=*user_name*,-u *user_name*
當連接服務器時MySQL使用的用戶名。
·???????? --verbose,-v
冗長模式。產生更多的輸出。可以多次使用該選項以產生更多的輸出。(例如,-v -v -v甚至可以在批處理模式產生表輸出格式)。
·???????? --version,-V
顯示版本信息并退出。
·???????? --vertical,-E
垂直輸出查詢輸出的行。沒有該選項,可以用\G結尾來指定單個語句的垂直輸出。
·???????? --wait,-w
如果不能建立連接,等待并重試而不是放棄。
·???????? --xml,-X
產生XML輸出。
你還可以使用--*var_name*=*value*選項設置下面的變量:
·???????? connect_timeout
連接超時前的秒數。(默認值是0)。
·???????? max_allowed_packet
從服務器發送或接收的最大包長度。(默認值是16MB)。
·???????? max_join_size
當使用--safe-updates時聯接中的行的自動限制。(默認值是1,000,000)。
·???????? net_buffer_length
TCP/IP和套接字通信緩沖區大小。(默認值是16KB)。
·???????? select_limit
當使用--safe-updates時SELECT語句的自動限制。(默認值是1,000)。
也可以使用--set-variable=*var_name*=*value* or -O *var_name*=*value*語法來設置變量。*不贊成使用*該語法**。
在Unix中,**mysql客戶程序向**歷史文件中寫入已執行語句的一條記錄。默認情況,歷史文件名為.mysql_history并在根目錄中重建。要想指定不同的文件,應設置MYSQL_HISTFILE環境變量的值。
如果不想要歷史文件,首先刪除.mysql_history(如果有),然后使用下面的任何一種方法:
·???????? 將MYSQL_HISTFILE變量設到/dev/null。要想在每次登錄時讓該設置生效,將該設置放入外殼的一個啟動文件中。
·???????? 創建.mysql_history,作為一個符號鏈接指向/dev/null:
~~~
·??????????????? shell> ln -s /dev/null $HOME/.mysql_history
~~~
只需要執行一次。
### 8.3.2.?**mysql**命令
**mysql**將發出的SQL語句發送到待執行的服務器。還有一系列命令**mysql**可以自己解釋。要查看這些命令,在mysql>提示下輸入help或\h:
~~~
mysql> help
List of all MySQL commands:
Note that all text commands must be first on line and end with ';'
? (\?) Synonym for `help'.
clear (\c) Clear command.
connect (\r) Reconnect to the server. Optional arguments are db and host.
delimiter (\d) Set statement delimiter. NOTE: Takes the rest of the line as new delimiter.
edit (\e) Edit command with $EDITOR.
ego (\G) Send command to mysql server, display result vertically.
exit (\q) Exit mysql. Same as quit.
go (\g) Send command to mysql server.
help (\h) Display this help.
nopager (\n) Disable pager, print to stdout.
notee (\t) Don't write into outfile.
pager (\P) Set PAGER [to_pager]. Print the query results via PAGER.
print (\p) Print current command.
prompt (\R) Change your mysql prompt.
quit (\q) Quit mysql.
rehash (\#) Rebuild completion hash.
source (\.) Execute a SQL script file. Takes a file name as an argument.
status (\s) Get status information from the server.
system (\!) Execute a system shell command.
tee (\T) Set outfile [to_outfile]. Append everything into given outfile.
use (\u) Use another database. Takes database name as argument.
warnings (\W) Show warnings after every statement.
nowarning (\w) Don't show warnings after every statement.
~~~
每個命令有長形式和短形式。長形式對大小寫不敏感;短形式敏感。長形式后面可以加一個分號結束符,但短形式不可以。
在delimiter命令中,應避免使用反斜線(‘\’),因為這是MySQL的轉義符。
**Edit**、**nopager**、**pager**和**system**命令只在Unix中工作。
status命令提供連接和使用的服務器相關的部分信息。如果用--safe-updates模式運行,status也打印影響查詢的MySQL變量的值。
要想記錄查詢及其輸出,應使用**tee**命令。屏幕上顯示的所有數據被追加到給定的文件后面。這對于調試也很有用。可以用--tee選項在命令行中啟用該特性,或者用**tee**命令交互式啟用。可以用**notee**命令交互式禁用**tee**文件。再次執行**tee**可以重新啟用日志。前面的文件使用時不帶任何參數。請注意執行完每個語句后**tee**可以將查詢結果刷新到一個文件中,并且在**mysql**打印下一個提示前刷新。
用--pager選項,可以用交互式模式使用Unix程序,例如**less、more**或者其它類似的程序,來瀏覽或搜索查詢結果。如果未指定該選項的值,**mysql**檢查PAGER環境變量的值并將PAGER設為該值。可以用**pager**命令交互式啟用輸出分頁,并用**nopager**禁用。該命令采用可選參量;如果給出,分頁程序設置為該值。如果沒有給出參量,分頁器被設置為在命令行中設置的分頁器的值,如果未指定分頁器,則設置為stdout。
輸出分頁只適合Unix,因為它使用popen()函數,該函數在Windows中不存在。在Windows中,可以使用**tee**選項來保存查詢輸出,盡管在某些情況下瀏覽輸出時不如**pager**方便。
關于**pager**命令的一些技巧:
·???????? 可以使用它寫入一個文件,將結果只輸出到該文件中:
~~~
·??????????????? mysql> pager cat > /tmp/log.txt
~~~
也可以為將用作分頁器的程序傳遞選項:
~~~
mysql> pager less -n -i -S
~~~
·???????? 注意前面例子中的-S選項。它可以幫助瀏覽廣范圍的查詢結果。有時太廣的結果很難在屏幕上讀出來。**less**的-S選項可以使結果更易于讀,因為可以用左、右箭頭水平滾動它。還可以在**less**中交互式使用-S,以關閉或打開水平瀏覽模式。詳細信息請閱讀手冊中的**less**頁:
~~~
·??????????????? shell> man less
~~~
·???????? 可以指定很復雜的pager命令來處理查詢輸出:
~~~
·??????????????? mysql> PAGER cat | tee /dr1/tmp/res.txt \
~~~
~~~
·??????????????? ??????????| tee /dr2/tmp/res2.txt | less -n -i -S
~~~
在該例子中,該命令將查詢結果發送到位于/dr1和/dr2上安裝的兩個不同的文件系統中的兩個不同目錄中的兩個文件中,但仍然可以通過**less**將結果顯示在屏幕上。
還可以結合使用**tee**和**pager**函數。啟用一個**tee**文件并將**pager**設置為**less**,能夠使用**less**程序瀏覽結果,并且仍然可以同時將內容添加到一個文件中。結合**pager**命令使用的Unix **tee**和 **mysql**嵌入式**tee**命令的差別是即使沒有可用的Unix **tee**,嵌入式**tee仍然可以**工作。嵌入式**tee**還可以記錄在屏幕上輸出的內容,而結合**pager**命令使用的Unix **tee**不能記錄那么多的內容。并且,可以從MySQL中交互式打開或關閉**tee**文件日志。當你想要將部分查詢記錄到一個文件中時很有用,但其它不適合。
默認mysql>提示符可以重新配置。定義提示符的字符串可以包含下面的特殊序列:
<table border="1" cellpadding="0" id="table2"><tr><td> <p><strong><span>選項</span></strong></p></td> <td> <p><strong><span>描述</span></strong></p></td> </tr><tr><td> <p> <span>\v</span></p></td> <td> <p>服務器版本</p></td> </tr><tr><td> <p> <span>\d</span></p></td> <td> <p>當前的數據庫</p></td> </tr><tr><td> <p> <span>\h</span></p></td> <td> <p>服務器主機</p></td> </tr><tr><td> <p> <span>\p</span></p></td> <td> <p>當前的<span>TCP/IP</span>端口或套接字文件</p></td> </tr><tr><td> <p> <span>\u</span></p></td> <td> <p>你的用戶名</p></td> </tr><tr><td> <p> <span>\U</span></p></td> <td> <p>你的全<span><i><span>user_name</span></i><span>@<i>host_name</i></span></span>賬戶名</p></td> </tr><tr><td> <p> <span>\\</span></p></td> <td> <p>‘<span>\</span>’反斜線字符</p></td> </tr><tr><td> <p> <span>\n</span></p></td> <td> <p>新行字符</p></td> </tr><tr><td> <p> <span>\t</span></p></td> <td> <p><span>Tab</span>字符</p></td> </tr><tr><td> <p> <span>\ </span> </p></td> <td> <p>空格<span>(</span>反斜線后面的空格<span>)</span></p></td> </tr><tr><td> <p> <span>\_</span></p></td> <td> <p>空格</p></td> </tr><tr><td> <p> <span>\R</span></p></td> <td> <p>當前的時間,<span>24-</span>小時軍用時間<span>(0-23)</span></p></td> </tr><tr><td> <p> <span>\r</span></p></td> <td> <p>當前的時間,標準<span>12-</span>小時<span>(1-12)</span></p></td> </tr><tr><td> <p> <span>\m</span></p></td> <td> <p>當前時間的分鐘</p></td> </tr><tr><td> <p> <span>\y</span></p></td> <td> <p>當前的年,兩位</p></td> </tr><tr><td> <p> <span>\Y</span></p></td> <td> <p>當前的年,四位</p></td> </tr><tr><td> <p> <span>\D</span></p></td> <td> <p>當前的日期</p></td> </tr><tr><td> <p> <span>\s</span></p></td> <td> <p>當前時間的秒</p></td> </tr><tr><td> <p> <span>\w</span></p></td> <td> <p>當前周的天,<span>3</span>字符格式<span>(Mon</span>,<span>Tue</span>,<span>...)</span></p></td> </tr><tr><td> <p> <span>\P</span></p></td> <td> <p><span>am/pm</span></p></td> </tr><tr><td> <p> <span>\o</span></p></td> <td> <p>當前的月,數字格式</p></td> </tr><tr><td> <p> <span>\O</span></p></td> <td> <p>當前的月,<span>3</span>字符格式<span>(Jan</span>,<span>Feb</span>,<span>...)</span></p></td> </tr><tr><td> <p> <span>\c</span></p></td> <td> <p>隨發出的每個語句遞增的計數</p></td> </tr><tr><td> <p> <span>\S</span></p></td> <td> <p>分號</p></td> </tr><tr><td> <p> <span>\'</span></p></td> <td> <p>單引號</p></td> </tr><tr><td> <p> <span>\"</span></p></td> <td> <p>雙引號</p></td> </tr></table>
‘\’后面跟隨的其它字母則變為該字母。
如果不用任何參量指定提示命令,**mysql**將提示重新設置位默認mysql>。
可以用幾種方式設置提示:
·???????? 使用環境變量
可以用MYSQL_PS1環境變量來設置提示字符串。例如:
~~~
shell> export MYSQL_PS1="(\u@\h) [\d]> "
~~~
·???????? 使用選項文件
可以在MySQL選項文件中的[mysql]組設置提示,例如根目錄中的/etc/my.cnf或.my.cnf文件。例如:
~~~
[mysql]
~~~
~~~
prompt=(\\u@\\h) [\\d]>\\_
~~~
在該例子中,請注意反斜線是雙線。如果使用選項文件中的prompt選項來設置提示,當使用特殊提示選項時,建議使用雙反斜線。在允許的提示選項和選項文件中可識別的特殊轉義序列中有部分重疊。(這些序列列于[4.3.2節,“使用選項文件”](# "4.3.2.?Using Option Files"))。如果使用單反斜線,會遇到問題。例如,\s被解釋為空格而不是當前的秒值。下面的例子顯示了如何在選項文件中定義提示以包括當前的時間,格式為HH:MM:SS>:
~~~
[mysql]
~~~
~~~
prompt="\\r:\\m:\\s> "
~~~
·???????? 使用命令行選項
可以在**mysql**的命令行中設置--prompt選項。例如:
~~~
shell> mysql --prompt="(\u@\h) [\d]> "
~~~
~~~
(user@host) [database]>
~~~
·???????? 交互式
你可以使用prompt(或\R)命令交互地更改提示。例如:
~~~
mysql> prompt (\u@\h) [\d]>\_
~~~
~~~
PROMPT set to '(\u@\h) [\d]>\_'
~~~
~~~
(user@host) [database]>
~~~
~~~
(user@host) [database]> prompt
~~~
~~~
Returning to default PROMPT of mysql>
~~~
~~~
mysql>
~~~
### 8.3.3.?怎樣從文本文件執行SQL語句
**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>。
關于批處理模式的詳細信息,參見[3.5節,“在批處理模式**下使用my**sql”](# "3.5.?Using mysql in Batch Mode")。
### 8.3.4.?**mysql**技巧
[ 8.3.4.1. 垂直顯示查詢結果](#)[ 8.3.4.2. 使用--safe-updates選項](#)[ 8.3.4.3. 禁用mysql自動連**接**](#)
該節描述了可以幫助你更有效使用**mysql的一些**技術。
#### 8.3.4.1.?垂直顯示查詢結果
一些查詢結果如果垂直顯示而不用通常的水平表格式顯示,則更容易讀取。用\G而不用分號結束查詢可以垂直顯示查詢。例如,包括新行的更長的文本值垂直輸出時通常更容易讀取:
~~~
mysql> SELECT * FROM mails WHERE LENGTH(txt) < 300 LIMIT 300,1\G
*************************** 1. row ***************************
msg_nro: 3068
date: 2000-03-01 23:29:50
time_zone: +0200
mail_from: Monty
reply: monty@no.spam.com
mail_to: "Thimble Smith" <tim@no.spam.com>
sbj: UTF-8
txt: >>>>> "Thimble" == Thimble Smith writes:
Thimble> Hi. I think this is a good idea. Is anyone familiar
Thimble> with UTF-8 or Unicode? Otherwise, I'll put this on my
Thimble> TODO list and see what happens.
Yes, please do that.
Regards,
Monty
file: inbox-jani-1
hash: 190402944
1 row in set (0.09 sec)
~~~
#### 8.3.4.2.?使用--safe-updates選項
對于新手,有一個有用的啟動選項--safe-updates(或--i-am-a-dummy,具有相同的效果)。當你已經發出一個DELETE FROM *tbl_name*語句但忘記了WHERE子句時很有用。通常情況,這樣的語句從表中刪除所有行。用--safe-updates,可以通過指定可以識別它們的鍵值只刪除某些行。這樣可以幫助防止事故。
若使用--safe-updates選項,**mysql**連接MySQL服務器時發出下面的語句:
~~~
SET SQL_SAFE_UPDATES=1,SQL_SELECT_LIMIT=1000, SQL_MAX_JOIN_SIZE=1000000;
~~~
參見[13.5.3節,“SET語法”](# "13.5.3.?SET Syntax")。
SET語句有下面的效果:
·???????? 不允許你執行UPDATE或DELETE語句,除非在WHERE子句中指定一個鍵值約束或提供一個LIMIT子句(或二者皆使用)。例如:
~~~
·??????????????? UPDATE tbl_name SET not_key_column=val WHERE key_column=val;
~~~
~~~
·??????????????? ?
~~~
~~~
·??????????????? UPDATE tbl_name SET not_key_column=val LIMIT 1;
~~~
·???????? 所有大的SELECT結果自動限制到1,000行,除非語句包括一個LIMIT子句。
·???????? 放棄可能需要檢查1,000,000多行組合的多表SELECT語句。
要將限制指定為1,000和1,000,000之外的值,可以使用--select_limit和--max_join_size選項覆蓋默認值:
~~~
shell> mysql --safe-updates --select_limit=500 --max_join_size=10000
~~~
#### 8.3.4.3.?禁用mysql自動連**接**
如果**mysql**客戶程序發送查詢時斷開與服務器的連接,它立即并自動嘗試重新連接服務器并再次發送查詢。然而,即使**mysql**重新連接成功,你的第1個連接也已經結束,并且以前的會話對象和設定值被丟失:包括臨時表、自動提交模式,以及用戶和會話變量。該行為很危險,如下面的例子所示,服務器將在你不知道的情況下關閉并重啟:
~~~
mysql> SET @a=1;
~~~
~~~
Query OK, 0 rows affected (0.05 sec)
~~~
~~~
?
~~~
~~~
mysql> INSERT INTO t VALUES(@a);
~~~
~~~
ERROR 2006: MySQL server has gone away
~~~
~~~
No connection. Trying to reconnect...
~~~
~~~
Connection id:??? 1
~~~
~~~
Current database: test
~~~
~~~
?
~~~
~~~
Query OK, 1 row affected (1.30 sec)
~~~
~~~
?
~~~
~~~
mysql> SELECT * FROM t;
~~~
~~~
+------+
~~~
~~~
| a??? |
~~~
~~~
+------+
~~~
~~~
| NULL |
~~~
~~~
+------+
~~~
~~~
1 row in set (0.05 sec)
~~~
@a用戶變量已經隨連接丟失,并且重新連接后它也沒有定義。如果有必要在連接斷開時終止**mysql**并提示錯誤,你可以用--skip-reconnect選項啟動**mysql**客戶程序。
### 8.4.?mysqlaccess:用于檢查訪問權限的客戶端
**mysqlaccess**是Yves Carlier為MySQL分發提供的一個診斷工具。它檢查訪問權限的主機名、用戶名和數據庫組合。請注意 **mysqlaccess**檢查只使用user、db和host表的訪問。它不檢查在tables_priv、columns_priv或procs_priv表中指定的表、列或者程序的權限。
調用**mysqlaccess**的方法:
~~~
shell> mysqlaccess [host_name [user_name [db_name]]] [options]
~~~
**mysqlaccess**理解下面的選項:
·???????? ---help,-?
顯示幫助消息并退出。
·???????? --brief,-b
生成單行表格式的報告。
·???????? --commit
從臨時表將新訪問權限復制到原授權表。必須為新的權限刷新授權表以使其生效。(例如,執行**mysqladmin RELOAD**命令)。
·???????? --copy
從原授權表重載臨時授權表。
·???????? --db=*db_name*,-d *db_name*
指定數據庫名。
·???????? ---debug=*N*
指定調試級別。*N*可以為從0到3的一個整數。
·???????? --host=*host_name*,-h *host_name*
在訪問權限中使用的主機名。
·???????? --howto
顯示一些例子顯示如何使用**mysqlaccess**。
·???????? --old_server
假定服務器是一個舊版本的MySQL服務器(MySQL 3.21之前),還不知道如何處理全WHERE子句。
·???????? --password[=*password*],-p[*password*]
當連接服務器時使用的密碼。如果你在命令行中在--password或-p選項后面省略 密碼值,將提示你輸入密碼。
·???????? --plan
顯示將來發布的建議和思想。
·???????? --preview
更改臨時授權表后顯示權限的不同。
·???????? --relnotes
顯示發布注解。
·???????? --rhost=*host_name*,-H *host_name*
連接給定主機的MySQL服務器。
·???????? --rollback
取消對臨時授權表的最新的更改。
·???????? --spassword[=*password*],-P[*password*]
以super用戶連接服務器時使用的密碼。如果在命令行中在--password或-p選項后面省略了 密碼值,將提示你輸入密碼。
·???????? --superuser=*user_name*,-U *user_name*
指定以super用戶連接時的用戶名。
·???????? --tables,-t
生成表格式的報告。
·???????? --user=*user_name*,-u *user_name*
在訪問權限中使用的主機名。
·???????? --version,-v
顯示版本信息并退出。
如果你的MySQL分發安裝在某個非標準位置,必須進入**mysqlaccess**期望找到**mysql**客戶的目錄。編輯大約在18行處的mysqlaccess腳本。搜索類似下面的一行:
~~~
$MYSQL???? = '/usr/local/bin/mysql';??? # path to mysql executable
~~~
將路徑更改為**mysql**實際在系統中保存的位置。如果不這樣做,當運行**mysqlaccess**時會發生Broken pipe錯誤。
### 8.5.?mysqladmin:用于管理MySQL服務器的客戶端
**mysqladmin**是一個執行管理操作的客戶程序。可以用它來檢查服務器的配置和當前的狀態,創建并刪除數據庫等等。
這樣調用**mysqladmin**:
~~~
shell> mysqladmin [options] command [command-options] [command [command-options]] ...
~~~
**mysqladmin**支持下面的命令:
·???????? create *db_name*
創建一個名為*db_name*的新數據庫。
·???????? debug
告訴服務器向錯誤日志寫入調試信息。
·???????? drop *db_name*
刪除名為*db_nam*的數據庫和所有表。
·???????? extended-status
顯示服務器狀態變量及其值。
·???????? flush-hosts
刷新主機緩存中的所有信息。
·???????? flush-logs
刷新所有日志。
·???????? flush-privileges
重載授權表(類似reload)。
·???????? flush-status
清除狀態變量。
·???????? flush-tables
刷新所有表。
·???????? flush-threads
刷新線程緩存。
·???????? kill id,id,...
殺掉服務器線程。
·???????? old-password *new-password*
類似password但使用舊的(pre-4.1)密碼哈希格式保存 密碼。(參見[5.7.9節,“MySQL 4.1中的密碼哈希處理”](# "5.7.9.?Password Hashing in MySQL 4.1"))。
·???????? password *new-password*
設置一個新密碼。將用**mysqladmin**連接服務器使用的 賬戶的密碼更改為new-password。
如果*new-password*包含空格或其它命令解釋符的特殊字符,需要用引號將它引起來。在Windows中,一定要使用雙引號而不要用單引號;單引號不會從 密碼中剝離出來,而是解釋為密碼的一部分。例如:
shell> mysqladmin password "my new password"
·???????? ping
檢查服務器是否仍活動。如果服務器在運行**mysqladmin**返回狀態0,如果不運行返回1。即使出現錯誤例如Access denied也為0,因為這說明服務器在運行但拒絕了連接,與服務器不在運行不同。
·???????? processlist
顯示活動服務器線程的列表。類似SHOW PROCESSLIST語句的輸出。如果給出了--verbose選項,輸出類似SHOW FULL PROCESSLIST。(參見[13.5.4.16節,“SHOW PROCESSLIST語法”](# "13.5.4.16.?SHOW PROCESSLIST Syntax"))。
·???????? reload
重載授權表。
·???????? refresh
刷新所有表并關閉和打開日志文件。
·???????? shutdown
停止服務器。
·???????? start-slave
開始從服務器上的復制。
·???????? status
顯示短服務器狀態消息。
·???????? stop-slave
停止從服務器上的復制。
·???????? variables
顯示服務器系統變量及其值。
·???????? version
顯示服務器的版本信息。
所有命令可以簡化為任何唯一的前綴。例如:
~~~
shell> mysqladmin proc stat
~~~
~~~
+----+-------+-----------+----+---------+------+-------+------------------+
~~~
~~~
| Id | User? | Host????? | db | Command | Time | State | Info?? ??????????|
~~~
~~~
+----+-------+-----------+----+---------+------+-------+------------------+
~~~
~~~
| 51 | monty | localhost |??? | Query?? | 0??? |?????? | show processlist |
~~~
~~~
+----+-------+-----------+----+---------+------+-------+------------------+
~~~
~~~
Uptime: 1473624 ?Threads: 1? Questions: 39487?
~~~
~~~
Slow queries: 0? Opens: 541? Flush tables: 1?
~~~
~~~
Open tables: 19? Queries per second avg: 0.0268
~~~
~~~
?
~~~
**mysqladmin status**命令的結果顯示下面的值:
·???????? Uptime
MySQL服務器已經運行的秒數。
·???????? Threads
活動線程(客戶)的數目。
·???????? Questions
服務器啟動以來客戶的問題(查詢)數目。
·???????? Slow queries
執行時間超過long_query_time秒的查詢的數量。參見[5.11.4節,“慢速查詢日志”](# "5.11.4.?The Slow Query Log")。
·???????? Opens
服務器已經打開的數據庫表的數量。
·???????? Flush tables
服務器已經執行的flush ...、refresh和reload命令的數量。
·???????? Open tables
目前打開的表的數量。
·???????? Memory in use
**mysqld**代碼直接分配的內存數量。只有用--with--debug=full編譯了MySQL該值才顯示。
·???????? Maximum memory used
**mysqld**代碼直接分配的最大內存數量。只有用--with--debug=full編譯了MySQL該值才顯示。
如果當使用Unix套接字文件連接本地服務器時執行**mysqladmin shutdown**,**mysqladmin**將等待直到服務器的進程ID文件被刪除,以確保服務器正確停止。
**mysqladmin**支持下面的選項:
·???????? ---help,-?
顯示幫助消息并退出。
·???????? --character-sets-dir=*path*
字符集的安裝目錄。參見[5.10.1節,“數據和排序用字符集”](# "5.10.1.?The Character Set Used for Data and Sorting")。
·???????? --compress,-C
壓縮客戶和服務器之間發送的所有信息(如果二者均支持壓縮)。
·???????? --count=*num*,-c *num*
迭代數目。該選項只有結合--sleep (-i)才能工作。
·???????? ---debug[=*debug_options*],-# [*debug_options*]
寫調試日志。*debug_options*字符串通常為'd:t:o,*file_name*'。 默認為'd:t:o,/tmp/mysqladmin.trace'。
·???????? --default-character-set=*charset*
使用*charset*as作為默認字符集。參見[5.10.1節,“數據和排序用字符集”](# "5.10.1.?The Character Set Used for Data and Sorting")。
·???????? --force,-f
不再為drop database命令進行確認。對于多個命令,即使出現錯誤也繼續。
·???????? --host=*host_name*,-h *host_name*
連接給定主機上的MySQL服務器。
·???????? --password[=*password*],-p[*password*]
連接服務器使用的密碼。如果使用短選項形式(-p),該選項和 密碼之間*不能*有空格。如果你在命令行中在--password或-p選項后面省略 密碼值,將提示你輸入密碼。
·???????? --port=*port_num*,-P* port_num*
用于連接的TCP/IP端口號。
·???????? --protocol={TCP | SOCKET | PIPE | MEMORY}
使用的連接協議。
·???????? --relative,-r
當帶-I使用時顯示當前和前面值的差別。目前,該選項只用于extended-status命令。
·???????? --silent,-s
如果不能建立與服務器的連接則以沉默方式退出。
·???????? --sleep=*delay*,-i *delay*
每睡眠*delay*秒后執行一次命令。
·???????? --socket=*path*,-S *path*
用于連接的套接字文件。
·???????? --user=*user_name*,-u *user_name*
當連接服務器時使用的MySQL用戶名。
·???????? --verbose,-v
冗長模式。打印出程序操作的詳細信息。
·???????? --version,-V
顯示版本信息并退出。
·???????? --vertical,-E
垂直打印輸出。類似于--relative,但垂直打印輸出。
·???????? --wait[=*count*],-w[*count*]
如果連接不能建立,等待并重試而不是放棄。如果給出一個選項值,則指示重試的次數。默認是一次。
也可以使用--*var_name*=*value*選項設置下面的變量:
·???????? connect_timeout
連接超時之前的最大秒數。默認值為43200(12小時)。
·???????? shutdown_timeout
等候關閉的最大秒數。默認值為3600(1小時)。
也可以使用--set-variable=*var_name*=*value*或-O *var_name*=*value*語法來設置變量。然而,現在不贊成該語法,并且不再使用。
### 8.6.?mysqlbinlog:用于處理二進制日志文件的實用工具
服務器生成的二進制日志文件寫成二進制格式。要想檢查這些文本格式的文件,應使用**mysqlbinlog**實用工具。
應這樣調用**mysqlbinlog**:
~~~
shell> mysqlbinlog [options] log-files...
~~~
例如,要想顯示二進制日志binlog.000003的內容,使用下面的命令:
~~~
shell> mysqlbinlog binlog.0000003
~~~
輸出包括在binlog.000003中包含的所有語句,以及其它信息例如每個語句花費的時間、客戶發出的線程ID、發出線程時的時間戳等等。
通常情況,可以使用**mysqlbinlog**直接讀取二進制日志文件并將它們用于本地MySQL服務器。也可以使用--read-from-remote-server選項從遠程服務器讀取二進制日志。
當讀取遠程二進制日志時,可以通過連接參數選項來指示如何連接服務器,但它們經常被忽略掉,除非你還指定了--read-from-remote-server選項。這些選項是--host、--password、--port、--protocol、--socket和--user。
還可以使用**mysqlbinlog**來讀取在復制過程中從服務器所寫的中繼日志文件。中繼日志格式與二進制日志文件相同。
在[5.11.3節,“二進制日志”](# "5.11.3.?The Binary Log")中詳細討論了二進制日志。
**mysqlbinlog**支持下面的選項:
·???????? ---help,-?
顯示幫助消息并退出。
·???????? ---database=*db_name*,-d *db_name*
只列出該數據庫的條目(只用本地日志)。
·???????? --force-read,-f
使用該選項,如果**mysqlbinlog**讀它不能識別的二進制日志事件,它會打印警告,忽略該事件并繼續。沒有該選項,如果**mysqlbinlog**讀到此類事件則停止。
·???????? --hexdump,-H
在注釋中顯示日志的十六進制轉儲。該輸出可以幫助復制過程中的調試。在MySQL 5.1.2中添加了該選項。
·???????? --host=*host_name*,-h *host_name*
獲取給定主機上的MySQL服務器的二進制日志。
·???????? --local-load=*path*,-l *pat*
為指定目錄中的LOAD DATA INFILE預處理本地臨時文件。
·???????? --offset=*N*,-o *N*
跳過前*N*個條目。
·???????? --password[=*password*],-p[*password*]
當連接服務器時使用的密碼。如果使用短選項形式(-p),選項和 密碼之間*不能*有空格。如果在命令行中--password或-p選項后面沒有 密碼值,則提示輸入一個密碼。
·???????? --port=*port_num*,-P port_*num*
用于連接遠程服務器的TCP/IP端口號。
·???????? --position=*N*,-j *N*
不贊成使用,應使用--start-position。
·???????? --protocol={TCP | SOCKET | PIPE | -position
使用的連接協議。
·???????? --read-from-remote-server,-R
從MySQL服務器讀二進制日志。如果未給出該選項,任何連接參數選項將被忽略。這些選項是--host、--password、--port、--protocol、--socket和--user。
·???????? --result-file=*name*, -r *name*
將輸出指向給定的文件。
·???????? --short-form,-s
只顯示日志中包含的語句,不顯示其它信息。
·???????? --socket=*path*,-S *path*
用于連接的套接字文件。
·???????? --start-datetime=*datetime*
從二進制日志中第1個日期時間等于或晚于*datetime*參量的事件開始讀取。*datetime*值相對于運行**mysqlbinlog**的機器上的本地時區**。該**值格式應符合DATETIME或TIMESTAMP數據類型。例如:
~~~
shell> mysqlbinlog --start-datetime="2004-12-25 11:25:56" binlog.000003
~~~
該選項可以幫助點對點恢復。
·???????? --stop-datetime=*datetime*
從二進制日志中第1個日期時間等于或晚于*datetime*參量的事件起停止讀。關于*datetime*值的描述參見--start-datetime選項。該選項可以幫助及時恢復。
·???????? --start-position=*N*
從二進制日志中第1個位置等于*N*參量時的事件開始讀。
·???????? --stop-position=*N*
從二進制日志中第1個位置等于和大于*N*參量時的事件起停止讀。
·???????? --to-last-logs,-t
在MySQL服務器中請求的二進制日志的結尾處不停止,而是繼續打印直到最后一個二進制日志的結尾。如果將輸出發送給同一臺MySQL服務器,會導致無限循環。該選項要求--read-from-remote-server。
·???????? --disable-logs-bin,-D
禁用二進制日志。如果使用--to-last-logs選項將輸出發送給同一臺MySQL服務器,可以避免無限循環。該選項在崩潰恢復時也很有用,可以避免復制已經記錄的語句。**注釋:**該選項要求有SUPER權限。
·???????? --user=*user_name*,-u *user_name*
連接遠程服務器時使用的MySQL用戶名。
·???????? --version,-V
顯示版本信息并退出。
還可以使用--var_name=value選項設置下面的變量:
·???????? open_files_limit
指定要保留的打開的文件描述符的數量。
可以將**mysqlbinlog**的輸出傳到**mysql**客戶端以執行包含在二進制日志中的語句。如果你有一個舊的備份,該選項在崩潰恢復時也很有用(參見[5.9.1節,“數據庫備份”](# "5.9.1.?Database Backups")):
~~~
shell> mysqlbinlog hostname-bin.000001 | mysql
~~~
或:
~~~
shell> mysqlbinlog hostname-bin.[0-9]* | mysql
~~~
如果你需要先修改含語句的日志,還可以將**mysqlbinlog**的輸出重新指向一個文本文件。(例如,想刪除由于某種原因而不想執行的語句)。編輯好文件后,將它輸入到**mysql**程序并執行它包含的語句。
**mysqlbinlog**有一個--position選項,只打印那些在二進制日志中的偏移量大于或等于某個給定位置的語句(給出的位置必須匹配一個事件的開始)。它還有在看見給定日期和時間的事件后停止或啟動的選項。這樣可以使用--stop-datetime選項進行點對點恢復(例如,能夠說“將數據庫前滾動到今天10:30 AM的位置”)。
如果MySQL服務器上有多個要執行的二進制日志,安全的方法是在一個連接中處理它們。下面是一個說明什么是*不安全*的例子:
~~~
shell> mysqlbinlog hostname-bin.000001 | mysql # DANGER!!
~~~
~~~
shell> mysqlbinlog hostname-bin.000002 | mysql # DANGER!!
~~~
使用與服務器的不同連接來處理二進制日志時,如果第1個日志文件包含一個CREATE TEMPORARY TABLE語句,第2個日志包含一個使用該臨時表的語句,則會造成問題。當第1個**mysql**進程結束時,服務器撤銷臨時表。當第2個**mysql**進程想使用該表時,服務器報告 “不知道該表”。
要想避免此類問題,使用一個連接來執行想要處理的所有二進制日志中的內容。下面提供了一種方法:
~~~
shell> mysqlbinlog hostname-bin.000001 hostname-bin.000002 | mysql
~~~
另一個方法是:
~~~
shell> mysqlbinlog hostname-bin.000001 >? /tmp/statements.sql
~~~
~~~
shell> mysqlbinlog hostname-bin.000002 >> /tmp/statements.sql
~~~
~~~
shell> mysql -e "source /tmp/statements.sql"
~~~
**mysqlbinlog**產生的輸出可以不需要原數據文件即可重新生成一個LOAD DATA INFILE操作。**mysqlbinlog**將數據復制到一個臨時文件并寫一個引用該文件的LOAD DATA LOCAL INFILE語句。由系統確定寫入這些文件的目錄的默認位置。要想顯式指定一個目錄,使用--local-load選項。
因為**mysqlbinlog**可以將LOAD DATA INFILE語句轉換為LOAD DATA LOCAL INFILE語句(也就是說,它添加了LOCAL),用于處理語句的客戶端和服務器必須配置為允許LOCAL操作。參見[5.6.4節,“LOAD DATA LOCAL安全問題``”](# "5.6.4.?Security Issues with LOAD DATA LOCAL")。
**警告:**為LOAD DATA LOCAL語句創建的臨時文件不會自動刪除,因為在實際執行完那些語句前需要它們。不再需要語句日志后應自己刪除臨時文件。文件位于臨時文件目錄中,文件名類似original_file_name-#-#。
--hexdump選項可以在注釋中產生日志內容的十六進制轉儲:
~~~
shell> mysqlbinlog --hexdump master-bin.000001
~~~
上述命令的輸出應類似:
~~~
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
~~~
~~~
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
~~~
~~~
# at 4
~~~
~~~
#051024 17:24:13 server id 1? end_log_pos 98
~~~
~~~
# Position? Timestamp?? Type?? Master ID??????? Size????? Master Pos??? Flags
~~~
~~~
# 00000004 9d fc 5c 43?? 0f?? 01 00 00 00?? 5e 00 00 00?? 62 00 00 00?? 00 00
~~~
~~~
# 00000017 04 00 35 2e 30 2e 31 35? 2d 64 65 62 75 67 2d 6c |..5.0.15.debug.l|
~~~
~~~
# 00000027 6f 67 00 00 00 00 00 00? 00 00 00 00 00 00 00 00 |og..............|
~~~
~~~
# 00000037 00 00 00 00 00 00 00 00? 00 00 00 00 00 00 00 00 |................|
~~~
~~~
# 00000047 00 00 00 00 9d fc 5c 43? 13 38 0d 00 08 00 12 00 |.......C.8......|
~~~
~~~
# 00000057 04 04 04 04 12 00 00 4b? 00 04 1a??????????????? |.......K...|
~~~
~~~
#?????? Start: binlog v 4, server v 5.0.15-debug-log created 051024 17:24:13
~~~
~~~
#?????? at startup
~~~
~~~
ROLLBACK;
~~~
十六進制轉儲的輸出包含下面的元素:
·???????? Position: The byte position within the log file.
·???????? Timestamp: The event timestamp. In the example just shown, '9d fc 5c 43' is the representation of '051024 17:24:13' in hexadecimal.
·???????? Type: The type of the log event. '0f' means that the example event is a FORMAT_DESCRIPTION_EVENT. The types are:
~~~
·??????????????? 00? UNKNOWN_EVENT
~~~
~~~
·??????????????? ????This event should never be present in the log.
~~~
~~~
·??????????????? 01? START_EVENT_V3
~~~
~~~
·??????????????? ????This indicates the start of a log file written by MySQL 4 or earlier.
~~~
~~~
·??????????????? 02? QUERY_EVENT
~~~
~~~
·??????????????? ????The most common type of events.? These contain queries executed
~~~
~~~
·??????????????? ????on the master.
~~~
~~~
·??????????????? 03? STOP_EVENT
~~~
~~~
·??????????????? ????Indicates that master has stopped.
~~~
~~~
·??????????????? 04? ROTATE_EVENT
~~~
~~~
·??????????????? ????Written when the master switches to a new log file.
~~~
~~~
·??????????????? 05? INTVAR_EVENT
~~~
~~~
·??????????????? ????Used mainly for AUTO_INCREMENT values and if the LAST_INSERT_ID()
~~~
~~~
·??????????????? ????function is used in the statement.
~~~
~~~
·??????????????? 06? LOAD_EVENT
~~~
~~~
·??????????????? ????Used for LOAD DATA INFILE in MySQL 3.23.
~~~
~~~
·??????????????? 07? SLAVE_EVENT
~~~
~~~
·??????????????? ????Reserved for future use.
~~~
~~~
·??????????????? 08? CREATE_FILE_EVENT
~~~
~~~
·??????????????? ????Used for LOAD DATA INFILE statements.? This indicates the start
~~~
~~~
·??????????????? ????of execution of such a statement.? A temporary file is created
~~~
~~~
·??????????????? ????on the slave.? Used in MySQL 4 only.
~~~
~~~
·??????????????? 09? APPEND_BLOCK_EVENT
~~~
~~~
·??????????????? ????Contains data for use in a LOAD DATA INFILE statement.? The
~~~
~~~
·??????????????? ????data is stored in the temporary file on the slave.
~~~
~~~
·??????????????? 0a? EXEC_LOAD_EVENT
~~~
~~~
·??????????????? ????Used for LOAD DATA INFILE statements.? The contents of the
~~~
~~~
·??????????????? ????temporary file is stored in the table on the slave.
~~~
~~~
·??????????????? ????Used in MySQL 4 only.
~~~
~~~
·??????????????? 0b? DELETE_FILE_EVENT
~~~
~~~
·??????????????? ????Rollback of LOAD DATA INFILE statement.? The temporary file
~~~
~~~
·??????????????? ????should be deleted on slave.
~~~
~~~
·??????????????? 0c? NEW_LOAD_EVENT
~~~
~~~
·??????????????? ????Used for LOAD DATA INFILE in MySQL 4 and earlier.
~~~
~~~
·??????????????? 0d? RAND_EVENT
~~~
~~~
·??????????????? ????Used to send information about random values if the RAND()
~~~
~~~
·??????????????? ????function is used in the query.
~~~
~~~
·??????????????? 0e? USER_VAR_EVENT
~~~
~~~
·??????????????? ????Used to replicate user variables.
~~~
~~~
·??????????????? 0f? FORMAT_DESCRIPTION_EVENT
~~~
~~~
·??????????????? ????This indicates the start of a log file written by MySQL 5 or later.
~~~
~~~
·??????????????? 10? XID_EVENT
~~~
~~~
·??????????????? ????Event indicating commit of XA transaction
~~~
~~~
·??????????????? 11? BEGIN_LOAD_QUERY_EVENT
~~~
~~~
·??????????????? ????Used for LOAD DATA statements in MySQL 5 and later.
~~~
~~~
·??????????????? 12? EXECUTE_LOAD_QUERY_EVENT
~~~
~~~
·??????????????? ????Used for LOAD DATA statements in MySQL 5 and later.
~~~
~~~
·??????????????? 13? TABLE_MAP_EVENT
~~~
~~~
·??????????????? ????Reserved for future use
~~~
~~~
·??????????????? 14? WRITE_ROWS_EVENT
~~~
~~~
·??????????????? ????Reserved for future use
~~~
~~~
·??????????????? 15? UPDATE_ROWS_EVENT
~~~
~~~
·??????????????? ????Reserved for future use
~~~
~~~
·??????????????? 16? DELETE_ROWS_EVENT
~~~
~~~
·??????????????? ????Reserved for future use
~~~
·???????? Master ID: The server id of the master that created the event.
·???????? Size: The size in bytes of the event.
·???????? Master Pos: The position of the event in the original master log file.
·???????? Flags: 16 flags.
~~~
·??????????????? 01? LOG_EVENT_BINLOG_IN_USE_F
~~~
~~~
·??????????????? ????Log file correctly closed (Used only in FORMAT_DESCRIPTION_EVENT)
~~~
~~~
·??????????????? ????If this flag is set (if the flags are e.g. '01 00') in an
~~~
~~~
·??????????????? ????FORMAT_DESCRIPTION_EVENT, then the log file has not been
~~~
~~~
·??????????????? ????properly closed.? Most probably because of a master crash (for
~~~
~~~
·??????????????? ????example, due to power failure).
~~~
~~~
·??????????????? 02? Reserved for future use.
~~~
~~~
·??????????????? 04? LOG_EVENT_THREAD_SPECIFIC_F
~~~
~~~
·??????????????? ????Set if the event is dependent on the connection it was
~~~
~~~
·??????????????? ????executed in (example '04 00'), e.g. if the event uses
~~~
~~~
·??????????????? ????temporary tables.
~~~
~~~
·??????????????? 08? LOG_EVENT_SUPPRESS_USE_F
~~~
~~~
·??????????????? ????Set in some circumstances when the event is not dependent on
~~~
~~~
·??????????????? ????the current database
~~~
其它標志保留用于將來使用。
在以后的版本中十六進制轉儲輸出的格式可能會改變。
### 8.7.?mysqlcheck:表維護和維修程序
**mysqlcheck**客戶端可以檢查和修復MyISAM表。它還可以優化和分析表。
**mysqlcheck**的功能類似**myisamchk**,但其工作不同。主要差別是當**mysqld**服務器在運行時必須使用**mysqlcheck**,而**myisamchk**應用于服務器沒有運行時。使用**mysqlcheck的**好處是不需要停止服務器來檢查或修復表。
**Mysqlcheck為用戶提供了一種方便的**使用SQL語句CHECK TABLE、REPAIR TABLE、ANALYZE TABLE和OPTIMIZE TABLE的方式。它確定在要執行的操作中使用使用哪個語句,然后將語句發送到要執行的服務器上。
有3種方式來調用**mysqlcheck**:
~~~
shell> mysqlcheck[options] db_name [tables]
~~~
~~~
shell> mysqlcheck[options] ---database DB1 [DB2 DB3...]
~~~
~~~
shell> mysqlcheck[options] --all--database
~~~
如果沒有指定任何表或使用---database或--all--database選項,則檢查整個數據庫。
同其它客戶端比較,**mysqlcheck**有一個特殊特性。重新命名二進制可以更改檢查表的默認行為(--check)。如果你想要一個工具默認可以修復表的工具,只需要將**mysqlcheck**重新復制為**mysqlrepair**,或者使用一個符號鏈接**mysqlrepair**鏈接**mysqlcheck**。如果調用**mysqlrepair**,可按照命令修復表。
下面的名可用來更改**mysqlcheck**的默認行為:
<table border="1" cellpadding="0" id="table3"><tr><td> <p><strong> <span>mysqlrepair</span></strong></p></td> <td> <p>默認選項為<span>--repair</span></p></td> </tr><tr><td> <p><strong> <span>mysqlanalyze</span></strong></p></td> <td> <p>默認選項為<span>--analyze</span></p></td> </tr><tr><td> <p><strong> <span>mysqloptimize</span></strong></p></td> <td> <p>默認選項為<span>--optimize</span></p></td> </tr></table>
**mysqlcheck**支持下面的選項:
·???????? ---help,-?
顯示幫助消息并退出。
·???????? --all--database,-A
檢查所有數據庫中的所有表。與使用---database選項相同,在命令行中命名所有數據庫。
·???????? --all-in-1,-1
不是為每個表發出一個語句,而是為命名數據庫中待處理的所有表的每個數據庫執行一個語句。
·???????? --analyze,-a
分析表。
·???????? --auto-repair
如果某個被檢查的表破壞了,自動修復它。檢查完所有表后自動進行所有需要的修復。
·???????? --character-sets-dir=*path*
字符集的安裝目錄。參見[5.10.1節,“數據和排序用字符集”](# "5.10.1.?The Character Set Used for Data and Sorting")。
·???????? --check,-c
檢查表的錯誤。
·???????? --check-only-changed,-C
只檢查上次檢查以來已經更改的或沒有正確關閉的表。
·???????? --compress
壓縮在客戶端和服務器之間發送的所有信息(如果二者均支持壓縮)。
·???????? ---database,-B
處理數據庫中命名的所有表。使用該選項,所有字名參量被看作數據庫名,而不是表名。
·???????? ---debug[=*debug_options*],-# [*debug_options*]
寫調試日志。*debug_options*字符串通常為'd:t:o,*file_name*'。
·???????? --default-character-set=*charset*
使用*charset*as默認字符集。參見[5.10.1節,“數據和排序用字符集”](# "5.10.1.?The Character Set Used for Data and Sorting")。
·???????? --extended,-e
如果你正使用該選項來檢查表,可以確保它們100%地一致,但需要很長的時間。
如果你正使用該選項來修復表,則運行擴展修復,不但執行的時間很長,而且還會產生大量的垃圾行!
·???????? --fast,-F
只檢查沒有正確關閉的表。
·???????? --force,-f
即使出現SQL錯誤也繼續。
·???????? --host=*host_name*,-h *host_name*
連接給定主機上的MySQL服務器。
·???????? --medium-check,-m
執行比--extended操作更快的檢查。只能發現99.99%的錯誤,在大多數情況下這已經足夠了。
·???????? --optimize,-o
優化表。
·???????? --password[=*password*],-p[*password*]
當連接服務器時使用的密碼。如果使用短選項形式(-p),選項和 密碼之間*不能*有空格。如果在命令行中--password或-p選項后面沒有 密碼值,則提示輸入一個密碼。
·???????? --port=*port_num*,-P port_*num*
用于連接的TCP/IP端口號。
·???????? --protocol={TCP | SOCKET | PIPE | MEMORY}
使用的連接協議。
·???????? --quick,-q
如果你正使用該選項在檢查表,它防止掃描行以檢查錯誤鏈接的檢查。這是最快的檢查方法。
如果你正使用該選項在修復表,它嘗試只修復索引樹。這是最快的修復方法。
·???????? --repair,-r
執行可以修復大部分問題的修復,只是唯一值不唯一時不能修復。
·???????? --silent,-s
沉默模式。只打印錯誤消息。
·???????? --socket=*path*,-S *path*
用于連接的套接字文件。
·???????? --tables
覆蓋---database或-B選項。選項后面的所有參量被視為表名。
·???????? --user=*user_name*,-u *user_name*
當連接服務器時使用的MySQL用戶名。
·???????? --verbose,-v
冗長模式。打印關于各階段程序操作的信息。
·???????? --version,-V
顯示版本信息并退出。
### 8.8.?mysqldump:數據庫備份程序
**mysqldump**客戶端可用來轉儲數據庫或搜集數據庫進行備份或將數據轉移到另一個SQL服務器(不一定是一個MySQL服務器)。轉儲包含創建表和/或裝載表的SQL語句。
如果你在服務器上進行備份,并且表均為MyISAM表,應考慮使用**mysqlhotcopy**,因為可以更快地進行備份和恢復。參見[8.9節,“mysqlhotcopy:數據庫備份程序”](# "8.9.?mysqlhotcopy — A Database Backup Program")。
有3種方式來調用**mysqldump**:
~~~
shell> mysqldump [options] db_name [tables]
~~~
~~~
shell> mysqldump [options] ---database DB1 [DB2 DB3...]
~~~
~~~
shell> mysqldump [options] --all--database
~~~
如果沒有指定任何表或使用了---database或--all--database選項,則轉儲整個數據庫。
要想獲得你的版本的**mysqldump**支持的選項,執行**mysqldump ---help**。
如果運行**mysqldump**沒有--quick或--opt選項,**mysqldump**在轉儲結果前將整個結果集裝入內存。如果轉儲大數據庫可能會出現問題。該選項默認啟用,但可以用--skip-opt禁用。
如果使用最新版本的**mysqldump**程序生成一個轉儲重裝到很舊版本的MySQL服務器中,不應使用--opt或-e選項。
**mysqldump**支持下面的選項:
·???????? ---help,-?
顯示幫助消息并退出。
·???????? --add-drop--database
在每個CREATE DATABASE語句前添加DROP DATABASE語句。
·???????? --add-drop-tables
在每個CREATE TABLE語句前添加DROP TABLE語句。
·???????? --add-locking
用LOCK TABLES和UNLOCK TABLES語句引用每個表轉儲。重載轉儲文件時插入得更快。參見[7.2.16節,“INSERT語句的速度”](# "7.2.16.?Speed of INSERT Statements")。
·???????? --all--database,-A
轉儲所有數據庫中的所有表。與使用---database選項相同,在命令行中命名所有數據庫。
·???????? --allow-keywords
允許創建關鍵字列名。應在每個列名前面加上表名前綴。
·???????? ---comments[={0|1}]
如果設置為 0,禁止轉儲文件中的其它信息,例如程序版本、服務器版本和主機。--skip—comments與---comments=0的結果相同。 默認值為1,即包括額外信息。
·???????? --compact
產生少量輸出。該選項禁用注釋并啟用--skip-add-drop-tables、--no-set-names、--skip-disable-keys和--skip-add-locking選項。
·???????? --compatible=*name*
產生與其它數據庫系統或舊的MySQL服務器更兼容的輸出。值可以為ansi、mysql323、mysql40、postgresql、oracle、mssql、db2、maxdb、no_key_options、no_tables_options或者no_field_options。要使用幾個值,用逗號將它們隔開。這些值與設置服務器SQL模式的相應選項有相同的含義。參見[5.3.2節,“SQL服務器模式”](# "5.3.2.?The Server SQL Mode")。
該選項不能保證同其它服務器之間的兼容性。它只啟用那些目前能夠使轉儲輸出更兼容的SQL模式值。例如,--compatible=oracle不映射Oracle類型或使用Oracle注釋語法的數據類型。
·???????? --complete-insert,-c
使用包括列名的完整的INSERT語句。
·???????? --compress,-C
壓縮在客戶端和服務器之間發送的所有信息(如果二者均支持壓縮)。
·???????? --create-option
在CREATE TABLE語句中包括所有MySQL表選項。
·???????? ---database,-B
轉儲幾個數據庫。通常情況,**mysqldump**將命令行中的第1個名字參量看作數據庫名,后面的名看作表名。使用該選項,它將所有名字參量看作數據庫名。CREATE DATABASE IF NOT EXISTS *db_name*和USE *db_name*語句包含在每個新數據庫前的輸出中。
·???????? ---debug[=*debug_options*],-# [*debug_options*]
寫調試日志。*debug_options*字符串通常為'd:t:o,*file_name*'。
·???????? --default-character-set=*charset*
使用*charset*as默認字符集。參見[5.10.1節,“數據和排序用字符集”](# "5.10.1.?The Character Set Used for Data and Sorting")。如果沒有指定,**mysqldump**使用utf8。
·???????? --delayed-insert
使用INSERT DELAYED語句插入行。
·???????? --delete-master-logs
在主復制服務器上,完成轉儲操作后刪除二進制日志。該選項自動啟用--master-data。
·???????? --disable-keys,-K
對于每個表,用/*!40000 ALTER TABLE *tbl_name* DISABLE KEYS */;和/*!40000 ALTER TABLE *tbl_name* ENABLE KEYS */;語句引用INSERT語句。這樣可以更快地裝載轉儲文件,因為在插入所有行后創建索引。該選項只適合MyISAM表。
·???????? --extended-insert,-e
使用包括幾個VALUES列表的多行INSERT語法。這樣使轉儲文件更小,重載文件時可以加速插入。
·???????? --fields-terminated-by=...,--fields-enclosed-by=...,--fields-optionally-enclosed-by=...,--fields-escaped-by=...,--行-terminated-by=...
這些選項結合-T選項使用,與LOAD DATA INFILE的相應子句有相同的含義。參見[13.2.5節,“LOAD DATA INFILE語法”](# "13.2.5.?LOAD DATA INFILE Syntax")。
·???????? --first-slave,-x
不贊成使用,現在重新命名為--lock-all-tables。
·???????? --flush-logs,-F
開始轉儲前刷新MySQL服務器日志文件。該選項要求RELOAD權限。請注意如果結合--all--database(或-A)選項使用該選項,*根據每個轉儲的數據庫*刷新日志。例外情況是當使用--lock-all-tables或--master-data的時候:在這種情況下,日志只刷新一次,在所有 表被鎖定后刷新。如果你想要同時轉儲和刷新日志,應使用--flush-logs連同--lock-all-tables或--master-data。
·???????? --force,-f
在表轉儲過程中,即使出現SQL錯誤也繼續。
·???????? --host=*host_name*,-h *host_name*
從給定主機的MySQL服務器轉儲數據。默認主機是localhost。
·???????? --hex-blob
使用十六進制符號轉儲二進制字符串列(例如,'abc'變為0x616263)。影響到的列有BINARY、VARBINARY、BLOB。
·???????? --lock-all-tables,-x
所有數據庫中的所有表加鎖。在整體轉儲過程中通過全局讀鎖定來實現。該選項自動關閉--single-transaction和--lock-tables。
·???????? --lock-tables,-l
開始轉儲前鎖定所有表。用READ LOCAL鎖定表以允許并行插入MyISAM表。對于事務表例如InnoDB和BDB,--single-transaction是一個更好的選項,因為它不根本需要鎖定表。
請注意當轉儲多個數據庫時,--lock-tables分別為每個數據庫鎖定表。因此,該選項不能保證轉儲文件中的表在數據庫之間的邏輯一致性。不同數據庫表的轉儲狀態可以完全不同。
·???????? --master-data[=*value*]
該選項將二進制日志的位置和文件名寫入到輸出中。該選項要求有RELOAD權限,并且必須啟用二進制日志。如果該選項值等于1,位置和文件名被寫入CHANGE MASTER語句形式的轉儲輸出,如果你使用該SQL轉儲主服務器以設置從服務器,從服務器從主服務器二進制日志的正確位置開始。如果選項值等于2,CHANGE MASTER語句被寫成SQL注釋。如果*value*被省略,這是默認動作。
--master-data選項啟用--lock-all-tables,除非還指定--single-transaction(在這種情況下,只在剛開始轉儲時短時間獲得全局讀鎖定。又見--single-transaction。在任何一種情況下,日志相關動作發生在轉儲時。該選項自動關閉--lock-tables。
·???????? --no-create-db,-n
該選項禁用CREATE DATABASE /*!32312 IF NOT EXISTS*/ db_name語句,如果給出---database或--all--database選項,則包含到輸出中。
·???????? --no-create-info,-t
不寫重新創建每個轉儲表的CREATE TABLE語句。
·???????? --no-data,-d
不寫表的任何行信息。如果你只想轉儲表的結構這很有用。
·???????? --opt
該選項是速記;等同于指定 --add-drop-tables--add-locking --create-option --disable-keys--extended-insert --lock-tables --quick --set-charset。它可以給出很快的轉儲操作并產生一個可以很快裝入MySQL服務器的轉儲文件。*該選項默認開啟,但可以用**--skip-opt**禁用*。要想只禁用確信用-opt啟用的選項,使用--skip形式;例如,--skip-add-drop-tables或--skip-quick。
·???????? --password[=*password*],-p[*password*]
連接服務器時使用的密碼。如果你使用短選項形式(-p),*不能在選項和密碼之間有一個空格*。如果在命令行中,忽略了--password或-p選項后面的 密碼值,將提示你輸入一個。
·???????? --port=*port_num*,-P port_*num*
用于連接的TCP/IP端口號。
·???????? --protocol={TCP | SOCKET | PIPE | MEMORY}
使用的連接協議。
·???????? --quick,-q
該選項用于轉儲大的表。它強制**mysqldump**從服務器一次一行地檢索表中的行而不是檢索所有行并在輸出前將它緩存到內存中。
·???????? --quote-names,-Q
用‘`’字符引用數據庫、表和列名。如果服務器SQL模式包括ANSI_QUOTES選項,用‘"’字符引用名。默認啟用該選項。可以用--skip-quote-names禁用,但該選項應跟在其它選項后面,例如可以啟用--quote-names的--compatible。
·???????? --result-file=*file*,-r *file*
將輸出轉向給定的文件。該選項應用在Windows中,因為它禁止將新行‘\n’字符轉換為‘\r\n’回車、返回/新行序列。
·???????? --routines,-R
在轉儲的數據庫中轉儲存儲程序(函數和程序)。使用---routines產生的輸出包含CREATE PROCEDURE和CREATE FUNCTION語句以重新創建子程序。但是,這些語句不包括屬性,例如子程序定義者或創建和修改時間戳。這說明當重載子程序時,對它們進行創建時定義者應設置為重載用戶,時間戳等于重載時間。
如果你需要創建的子程序使用原來的定義者和時間戳屬性,不使用--routines。相反,使用一個具有mysql數據庫相應權限的MySQL賬戶直接轉儲和重載mysql.proc表的內容。
該選項在MySQL 5.1.2中添加進來。在此之前,存儲程序不轉儲。
·???????? --set-charset
將SET NAMES *default_character_set*加到輸出中。該選項默認啟用。要想禁用SET NAMES語句,使用--skip-set-charset。
·???????? --single-transaction
該選項從服務器轉儲數據之前發出一個BEGIN SQL語句。它只適用于事務表,例如InnoDB和BDB,因為然后它將在發出BEGIN而沒有阻塞任何應用程序時轉儲一致的數據庫狀態。
當使用該選項時,應記住只有InnoDB表能以一致的狀態被轉儲。例如,使用該選項時任何轉儲的MyISAM或HEAP表仍然可以更改狀態。
--single-transaction選項和--lock-tables選項是互斥的,因為LOCK TABLES會使任何掛起的事務隱含提交。
要想轉儲大的表,應結合--quick使用該選項。
·???????? --socket=*path*,-S *path*
當連接localhost(為默認主機)時使用的套接字文件。
·???????? --skip--comments
參見---comments選項的描述。
·???????? --tab=*path*,-T *path*
產生tab分割的數據文件。對于每個轉儲的表,**mysqldump**創建一個包含創建表的CREATE TABLE語句的*tbl_name*.sql文件,和一個包含其數據的*tbl_name*.txt文件。選項值為寫入文件的目錄。
默認情況,.txt數據文件的格式是在列值和每行后面的新行之間使用tab字符。可以使用--fields-*xxx*和--行--*xxx*選項明顯指定格式。
**注釋:**該選項只適用于**mysqldump**與**mysqld**服務器在同一臺機器上運行時。你必須具有FILE權限,并且服務器必須有在你指定的目錄中有寫文件的許可。
·???????? --tables
覆蓋---database或-B選項。選項后面的所有參量被看作表名。
·???????? --triggers
為每個轉儲的表轉儲觸發器。該選項默認啟用;用--skip-triggers禁用它。
·???????? --tz-utc
在轉儲文件中加入SET TIME_ZONE='+00:00'以便TIMESTAMP列可以在具有不同時區的服務器之間轉儲和重載。(不使用該選項,TIMESTAMP列在具有本地時區的源服務器和目的服務器之間轉儲和重載)。--tz-utc也可以保護由于夏令時帶來的更改。--tz-utc默認啟用。要想禁用它,使用--skip-tz-utc。該選項在MySQL 5.1.2中加入。
·???????? --user=*user_name*,-u *user_name*
連接服務器時使用的MySQL用戶名。
·???????? --verbose,-v
冗長模式。打印出程序操作的詳細信息。
·???????? --version,-V
顯示版本信息并退出。
·???????? --where='*where-condition*', -w '*where-condition*'
只轉儲給定的WHERE條件選擇的記錄。請注意如果條件包含命令解釋符專用空格或字符,一定要將條件引用起來。
例如:
~~~
"--where=user='jimf'"
~~~
~~~
"-wuserid>1"
~~~
~~~
"-wuserid<1"
~~~
·???????? --xml,-X
將轉儲輸出寫成XML。
還可以使用--var_name=value選項設置下面的變量:
·???????? max_allowed_packet
客戶端/服務器之間通信的緩存區的最大大小。最大為1GB。
·???????? net_buffer_length
客戶端/服務器之間通信的緩存區的初始大小。當創建多行插入語句時(如同使用選項--extended-insert或--opt),**mysqldump**創建長度達net_buffer_length的行。如果增加該變量,還應確保在MySQL服務器中的net_buffer_length變量至少這么大。
還可以使用--set-variable=*var_name*=*value*或-O *var_name*=*value*語法設置變量。然而,現在不贊成使用該語法。
**mysqldump**最常用于備份一個整個的數據庫:
~~~
shell> mysqldump --opt db_name > backup-file.sql
~~~
你可以這樣將轉儲文件讀回到服務器:
~~~
shell> mysql db_name < backup-file.sql
~~~
或者為:
~~~
shell> mysql -e "source /path-to--backup/backup-file.sql" db_name
~~~
**mysqldump**也可用于從一個MySQL服務器向另一個服務器復制數據時裝載數據庫:
~~~
shell> mysqldump --opt db_name | mysql --host=remote_host -C db_name
~~~
可以用一個命令轉儲幾個數據庫:
~~~
shell> mysqldump ---database db_name1 [db_name2 ...] > my_databases.sql
~~~
如果你想要轉儲所有數據庫,使用--all--database選項:
~~~
shell> mysqldump --all-databases > all_databases.sql
~~~
如果表保存在InnoDB存儲引擎中,mysqldump提供了一種聯機備份的途徑(參見下面的命令)。該備份只需要在開始轉儲時對所有表進行全局讀鎖定(使用FLUSH TABLES WITH READ LOCK)。獲得鎖定后,讀取二進制日志的相應內容并將鎖釋放。因此如果并且只有當發出FLUSH...時正執行一個長的更新語句,MySQL服務器才停止直到長語句結束,然后轉儲則釋放鎖。因此如果MySQL服務器只接收到短("短執行時間")的更新語句,即使有大量的語句,也不會注意到鎖期間。
~~~
shell> mysqldump --all-databases --single-transaction > all_databases.sql
~~~
對于點對點恢復(也稱為“前滾”,當你需要恢復舊的備份并重放該備份以后的更改時),循環二進制日志(參見[5.11.3節,“二進制日志”](# "5.11.3.?The Binary Log"))或至少知道轉儲對應的二進制日志內容很有用:
~~~
shell> mysqldump --all-databases --master-data=2 > all_databases.sql
~~~
~~~
或
~~~
~~~
shell> mysqldump --all-databases --flush-logs --master-data=2 > all_databases.sql
~~~
如果表保存在InnoDB存儲引擎中,同時使用--master-data和--single-transaction提供了一個很方便的方式來進行適合點對點恢復的聯機備份。
關于備份的詳細信息,參見[5.9.1節,“數據庫備份”](# "5.9.1.?Database Backups")。
### 8.9.?mysqlhotcopy:數據庫備份程序
**mysqlhotcopy是一個**Perl腳本,最初由Tim Bunce編寫并提供。它使用LOCK TABLES、FLUSH TABLES和cp或scp來快速備份數據庫。它是備份數據庫或單個表的最快的途徑,但它只能運行在數據庫目錄所在的機器上。**mysqlhotcopy**只用于備份MyISAM。它運行在Unix和NetWare中。
~~~
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/
~~~
**mysqlhotcopy**支持下面的選項:
·???????? ---help,-?
顯示幫助消息并退出。
·???????? --allowold
如果目標存在不放棄(加上一個_old后綴重新命名它)。
·???????? --checkpoint=*db_name.tbl_name*
在指定的*db_name.tbl_name*插入檢查點條目。
·???????? ---debug
啟用調試輸出。
·???????? --dryrun,-n
報告動作而不執行它們。
·???????? --flushlog
所有表鎖定后刷新日志。
·???????? --keepold
完成后不刪除以前(重新命名的)的目標。
·???????? -- method=*command*
復制方法(cp或scp)。
·???????? --noindices
備份中不包括全部索引文件。這樣使備份更小、更快。可以在以后用**myisamchk -rq**重新構建索引。
·???????? --password=*password*,-p* password*
當連接服務器時使用的密碼。請注意該選項的密碼值是不可選的,不象其它MySQL程序。
·???????? --port=*port_num*,-P port_*num*
當連接本地服務器時使用的TCP/IP端口號。
·???????? --quiet,-q
除了出現錯誤時保持沉默。
·???????? --regexp=*expr*
復制所有數據庫名匹配給出的正則表達式的數據庫。
·???????? --socket=*path*,-S *path*
用于連接的Unix套接字文件。
·???????? --suffix=*str*
所復制的數據庫名的后綴。
·???????? --tmpdir=*path*
臨時目錄(代替/tmp)。
·???????? --user=*user_name*,-u *user_name*
當連接服務器時使用的MySQL用戶名。
**mysqlhotcopy**從選項文件讀取[client]和[mysqlhotcopy]選項組。
要想執行**mysqlhotcopy**,你必須可以訪問備份的表文件,具有那些表的SELECT權限和RELOAD權限(以便能夠執行FLUSH TABLES)。
使用perldoc調用其它**mysqlhotcopy**文檔:
~~~
shell> perldoc mysqlhotcopy
~~~
### 8.10.?mysqlimport:數據導入程序
**mysqlimport**客戶端提供了LOAD DATA INFILEQL語句的一個命令行接口。**mysqlimport**的大多數選項直接對應LOAD DATA INFILE子句。參見[13.2.5節,“LOAD DATA INFILE語法”](# "13.2.5.?LOAD DATA INFILE Syntax")。
這樣調用**mysqlimport**:
~~~
shell> mysqlimport [options] db_name textfile1 [textfile2 ...]
~~~
對于在命令行中命名的每個文本文件,**mysqlimport**去掉文件名的擴展名并使用結果來確定將導入文件內容的表名。例如,文件 patient.txt、patient.text和patient均將導入表patient。
**mysqlimport**支持下面的選項:
·???????? ---help,-?
顯示幫助消息并退出。
·???????? --columns=*column_list*, -c *column_list*
該選項采用用逗號分隔的列名作為其值。列名的順序指示如何匹配數據文件列和表列。
·???????? --compress,-C
壓縮在客戶端和服務器之間發送的所有信息(如果二者均支持壓縮)。
·???????? ---debug[=*debug_options*],-# [*debug_options*]
寫調試日志。*debug_options*字符串通常是'd:t:o,*file_name*'。
·???????? --delete,-D
導入文本文件前清空表。
·???????? --fields-terminated-by=...,--fields-enclosed-by=...,--fields-optionally-enclosed-by=...,--fields-escaped-by=...,--lines-terminated-by=...
這些選項與LOAD DATA INFILE相應子句的含義相同。參見[13.2.5節,“LOAD DATA INFILE語法”](# "13.2.5.?LOAD DATA INFILE Syntax")。
·???????? --force,-f
忽視錯誤。例如,如果某個文本文件的表不存在,繼續處理其它文件。不使用--force,如果表不存在則**mysqlimport**退出。
·???????? --host=*host_name*,-h *host_name*
將數據導入給定主機上的MySQL服務器。默認主機是localhost。
·???????? --ignore,-i
參見--replace選項的描述。
·???????? --ignore-lines=*n*
忽視數據文件的前*n*行。
·???????? --local,-L
從本地客戶端讀入輸入文件。
·???????? --lock-tables,-l
處理文本文件前鎖定所有表以便寫入。這樣可以確保所有表在服務器上保持同步。
·???????? --password[=*password*],-p[*password*]
當連接服務器時使用的密碼。如果使用短選項形式(-p),選項和 密碼之間*不能*有空格。如果在命令行中--password或-p選項后面沒有 密碼值,則提示輸入一個密碼。
·???????? --port=*port_num*,-P port_*num*
用于連接的TCP/IP端口號。
·???????? --protocol={TCP | SOCKET | PIPE | MEMORY}
使用的連接協議。
·???????? --replace,-r
--replace和--ignore選項控制復制唯一鍵值已有記錄的輸入記錄的處理。如果指定--replace,新行替換有相同的唯一鍵值的已有行。如果指定--ignore,復制已有的唯一鍵值的輸入行被跳過。如果不指定這兩個選項,當發現一個復制鍵值時會出現一個錯誤,并且忽視文本文件的剩余部分。
·???????? --silent,-s
沉默模式。只有出現錯誤時才輸出。
·???????? --socket=*path*,-S *path*
當連接localhost時使用的套接字文件(為默認主機)。
·???????? --user=*user_name*,-u *user_name*
當連接服務器時MySQL使用的用戶名。
·???????? --verbose,-v
冗長模式。打印出程序操作的詳細信息。
·???????? --version,-V
顯示版本信息并退出。
這里是一個示例會話,顯示如何使用**mysqlimport**:
~~~
shell> mysql -e 'CREATE TABLE imptest(id INT, n VARCHAR(30))' test
~~~
~~~
shell> ed
~~~
~~~
a
~~~
~~~
100???? Max Sydow
~~~
~~~
101???? Count Dracula
~~~
~~~
.
~~~
~~~
w imptest.txt
~~~
~~~
32
~~~
~~~
q
~~~
~~~
shell> od -c imptest.txt
~~~
~~~
0000000?? 1?? 0?? 0? \t?? M?? a?? x??? ???S?? y?? d?? o?? w? \n?? 1?? 0
~~~
~~~
0000020?? 1? \t?? C?? o?? u?? n?? t?????? D?? r?? a?? c?? u?? l?? a? \n
~~~
~~~
0000040
~~~
~~~
shell> mysqlimport --local test imptest.txt
~~~
~~~
test.imptest: Records: 2? Deleted: 0? Skipped: 0? Warnings: 0
~~~
~~~
shell> mysql -e 'SELECT * FROM imptest' test
~~~
~~~
+------+---------------+
~~~
~~~
| id?? | n???????????? |
~~~
~~~
+------+---------------+
~~~
~~~
|? 100 | Max Sydow???? |
~~~
~~~
|? 101 | Count Dracula |
~~~
~~~
+------+---------------+
~~~
### 8.11.?mysqlshow-顯示數據庫、表和列信息
**mysqlshow**客戶可用來很快地查找存在哪些數據庫,數據庫中的表,表中的列或索引。
**mysqlshow**為一些SQL顯示語句提供了一個命令行界面。相同的信息可以通過直接使用那些語句獲得。例如,你可以從**mysql**客戶程序發出它們。參見[13.5.4節,“SHOW語法”](# "13.5.4.?SHOW Syntax")。
象這樣調用**mysqlshow**:
~~~
shell> mysqlshow[選項] [db_name [tbl_name [col_name]]]
~~~
·???????? 如果沒有給出數據庫,顯示所有匹配的數據庫。
·???????? 如果沒有給出表,顯示數據庫中所有匹配的表。
·???????? 如果沒有給出列,顯示表中所有匹配的列和列類型。
請注意,在MySQL的新版本中,你只能看到有部分權限的那些數據庫、表或者列。
如果最后的參數包含shell或SQL通用字符 (‘*’、‘?’、‘%’或者‘_’),只顯示那些名匹配通用字符的名字。如果一個數據庫名包含下劃線,應該使用一個反斜線(部分Unix shells需要雙反斜線)對它們進行轉義,以便得到一個正確的表或列的列表。‘*’和‘?’字符被轉換為SQL的‘%’和‘_’通用字符。你試圖用‘_’顯示一個表的列名時,這可能會造成一些混淆,因為在這種情況下 **mysqlshow**顯示與模式相匹配的表名。這很容易通過在命令行添加一個‘%’參量來解決。
**mysqlshow**支持下面的選項:
·???????? ---help,-?
顯示一個幫助消息并退出。
·???????? --character-sets-dir=*path*
字符集安裝目錄。參見[5.10.1節,“數據和排序用字符集”](# "5.10.1.?The Character Set Used for Data and Sorting")。
·???????? --compress,-C
壓縮所有的客戶和服務器之間發送的信息(如果它們都支持壓縮)。
·???????? ---debug[=*debug_options*],-# [*debug_options*]
寫調試日志。*debug_options*字符串通常是'd:t:o,*file_name*'。
·???????? --default-character-set=*charset*
使用*charset*為默認字符集。參見[5.10.1節,“數據和排序用字符集”](# "5.10.1.?The Character Set Used for Data and Sorting")。
·???????? --host=*host_name*,-h *host_name*
在給出的主機上連接 MySQL服務器。
·???????? --keys, -k
顯示表索引。
·???????? --password[=*password*],-p[*password*]
連接服務器時使用的密碼。如果你使用短選項形式(-p),*不能在選項和 密碼之間有一個空格*。如果在命令行中,你忽略了--password或-p選項后面的 密碼值,將提示你輸入一個。
·???????? --port=*port_num*, -P *port_num*
連接時使用的TCP/IP端口號。
·???????? --protocol={TCP | SOCKET | PIPE | MEMORY}
連接時使用的協議。
·???????? --show-table-type
顯示一列來指示表類型,與SHOW FULL TABLES語句顯示相同。
·???????? --socket=*path*,-S *path*
當連接localhost時使用的套接字文件(它時默認主機)。
·???????? --status, -i
顯示關于每個表的額外信息。
·???????? --user=*user_name*,-u *user_name*
連接服務器時使用的MySQL用戶名。
·???????? --verbose,-v
冗長模式。打印出程序操作的詳細信息。該選項可以多次使用以便增加信息總量。
·???????? --version,-V
顯示版本信息并退出。
### 8.12.?myisamlog:顯示MyISAM日志文件內容
**myisamlog**處理MyISAM日志文件內容。
象這樣調用**myisamlog**:
~~~
shell> myisamlog [options] [logfile-name [tbl_name] ...]
~~~
常用操作是更新(-u)。如果恢復完成(-r),所有寫和可能的更新以及刪除操作完成并且只統計錯誤。如果沒有給出日志文件名,使用myisam.log作為日志文件名。如果在命令行中指定了表名,只更新那些指定的表。
**myisamlog**理解下面的選項:
·???????? -?,-I
顯示一個幫助消息并退出。
·???????? -c *N*
只執行*N*個命令。
·???????? -f *N*
指定打開文件的最大數目。
·???????? -F *filepath**/*
TODO
·???????? -i
退出之前顯示詳細信息。
·???????? -o *offset*
指定起始偏移量。
·???????? -p *N*
從路徑中移除*N*個組件。
·???????? -r
恢復。
·???????? -R *record-pos-file record-pos*
指定記錄位置文件和記錄位置。
·???????? -u
更新。
·???????? -v
Verbose模式。產生更多輸出。該選項可以多次使用以便產生越來越多的輸出。
·???????? -w *write-file*
指定寫文件。
·???????? -V
顯示版本信息。
### 8.13.?perror:解釋錯誤代碼
對于大多數系統錯誤,除內部文本信息之外,MySQL還按下面的風格顯示的系統錯誤代碼:
message ... (errno: #)
message ... (Errcode: #)
通過檢查系統文檔或使用**perror**工具,可以檢查錯誤代碼的意義。
**perror**為系統錯誤代碼或存儲引擎(表處理)錯誤代碼打印其描述信息。
象這樣調用**perror**:
~~~
shell> perror [options] errorcode ...
~~~
例如:
~~~
shell> perror13 64
~~~
Error code? 13:? Permission denied
Error code? 64:? Machine is not on the network
**注釋:**要想顯示MySQL簇的錯誤代碼,用--ndb選項調用**perror**:
~~~
shell> perror --ndb errorcode
~~~
請注意,系統錯誤信息的含義可能與操作系統有關。在不同的操作系統中錯誤代碼的含義可能不同。
### 8.14.?replace:字符串替換實用工具
**replace**實用工具可以及時更改文件或標準輸入中的字符串。它首先使用有限狀態機來匹配長的字符串。該工具可以用來交換字符串。例如,下面的命令交換給定文件file1和file2中的a和b:
~~~
shell> replace a b b a -- file1 file2 ...
~~~
使用--選項來指示字符串-替換列表的結束位置和開始的文件名。
在命令行中的任何文件名被及時修改,因此在轉換之前,可能要對源文件進行備份。
如果在命令行中沒有指定文件名,**replace**讀取標準輸入并寫到標準輸出中。在這種情況下,不需要--選項。
**replace**程序用于**msql2mysql。**參見[25.9.1節,“msql2mysql:轉換mSQL程序以用于MySQL”](# "25.9.1.?msql2mysql — Convert mSQL Programs for Use with MySQL")。
**replace**支持下面的選項:
·???????? -?,-I
顯示一條幫助消息并退出。
·???????? -# *debug_options*
寫調試日志。*debug_options*字符串通常是'd:t:o,*file_name*'。
·???????? -s
沉默模式。打印出程序執行的少量信息。
·???????? -v
冗長模式。打印出程序執行的大量信息。
·???????? -V
顯示版本信息并退出。
### 8.15.?mysql_zap:殺死符合某一模式的進程
**mysql_zap**殺死匹配某一模式的進程。象這樣調用它:
~~~
shell> mysql_zap [-signal] [-?Ift] pattern
~~~
如果進程的**ps**命令的輸出行包含該模式,則認為其匹配。默認情況,**mysql_zap**對每個進程請求確認。響應y則殺死該進程,或者q退出 **mysql_zap**。對于其它響應,**mysql_zap**不試圖殺死進程。
如果給出-*signal*選項,它指定發送到每個進程的信號名或信號編號。否則,**mysql_zap**首先嘗試TERM(信號15)然后用KILL(信號9)。
**mysql_zap**理解下面的額外選項:
·???????? ---help,-?,-I
顯示一條幫助消息并退出。
·???????? -f
強制模式。**mysql_zap**視圖殺死每個匹配的進程而不需要確認。
·???????? -t
測試模式。顯示每個進程的信息但不殺死它。
這是MySQL參考手冊的翻譯版本,關于MySQL參考手冊,請訪問[dev.mysql.com](http://dev.mysql.com/doc/mysql/en)。 原始參考手冊為英文版,與英文版參考手冊相比,本翻譯版可能不是最新的。
- 目錄
- 前言
- 1. 一般信息
- 2. 安裝MySQL
- 3. 教程
- NoName
- 4. MySQL程序概述
- 5. 數據庫管理
- 6. MySQL中的復制
- 7. 優化
- 8. 客戶端和實用工具程序
- 9. 語言結構
- 10. 字符集支持
- 11. 列類型
- 12. 函數和操作符
- 13. SQL語句語法
- 14. 插件式存儲引擎體系結構
- 15. 存儲引擎和表類型
- 16. 編寫自定義存儲引擎
- 17. MySQL簇
- 18. 分區
- 19. MySQL中的空間擴展
- 20. 存儲程序和函數
- 21. 觸發程序
- 22. 視圖
- 23. INFORMATION_SCHEMA信息數據庫
- 24. 精度數學
- 25. API和庫
- 26. 連接器
- 27. 擴展MySQL
- A. 問題和常見錯誤
- B. 錯誤代碼和消息
- C. 感謝
- D. MySQL變更史
- E. 移植到其他系統
- F. 環境變量
- G. MySQL正則表達式
- H. MySQL中的限制
- I. 特性限制
- J. GNU通用公共許可
- K. MySQL FLOSS許可例外
- 索引