### 第8章:客戶端和實用工具程序
有許多不同的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?
- 前言
- 1. 一般信息
- 2. 安裝MySQL
- 3. 教程
- 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許可例外
- 索引