第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程式概述

8.1. 客戶端指令和實用工具概述

下面簡單列出了MySQL客戶端程式和實用工具:

·         myisampack

壓縮MyISAM資料表以產生更小的只讀資料表的一個工具。參見8.2節,「myisampack:生成壓縮、只讀MyISAM資料表」

·         mysql

交互式輸入SQL語句或從檔案以批處理模式執行它們的命令行工具。參見8.3節,「mysql:MySQL命令行工具」

·         mysqlaccess

檢查訪問主機名、帳號和資料庫組合的權限的指令。

·         mysqladmin

執行管理操作的客戶程式,例如建立或刪除資料庫,重載授權資料表,將資料表刷新到硬盤上,以及重新打開日誌檔案。mysqladmin還可以用來檢索版本、程序,以及伺服器的狀態訊息。參見8.5節,「mysqladmin:用於管理MySQL伺服器的客戶端」

·         mysqlbinlog

從二進制日誌讀取語句的工具。在二進制日誌檔案中包含的執行過的語句的日誌可用來幫助從崩潰中恢復。參見8.6節,「mysqlbinlog:用於處理二進制日誌檔案的實用工具」

·         mysqlcheck

檢查、修復、分析以及最佳化資料表的資料表維護客戶程式。參見8.7節,「mysqlcheck:資料表維護和維修程式」

·         mysqldump

MySQL資料庫轉儲到一個檔案(例如SQL語句或tab分隔符文本檔案)的客戶程式。增強版免費軟件首先由Igor Romanenko提供。參見8.8節,「mysqldump:資料庫備份程式」

·         mysqlhotcopy

當伺服器在運行時,快速備份MyISAMISAM資料表的工具。參見8.9節,「mysqlhotcopy:資料庫備份程式」

·         mysql import

使用LOAD DATA INFILE將文本檔案導入相關資料表的客戶程式。參見8.10節,「mysqlimport:數據導入程式」

·         mysqlshow

顯示資料庫、資料表、列以及索引相關訊息的客戶程式。參見8.11節,「mysqlshow:顯示資料庫、資料表和列訊息」

·         perror

顯示系統或MySQL錯誤代碼含義的工具。參見8.13節,「perror:解釋錯誤代碼」

·         replace

更改檔案中或標準輸入中的字串的實用工具。參見8.14節,「replace:字串替換實用工具」

MySQL AB還提供了大量GUI工具用於管理和MySQL伺服器的其它工作。相關基本訊息參見第4章:MySQL程式概述

每個MySQL程式有許多不同的選項。但每個MySQL程式均提供一個---help選項,可以用來全面描述程式不同的選項。例如,可以試試mysql---help

使用mysqlclient庫同伺服器進行通訊的MySQL客戶使用下面的環境變數:

MYSQL_UNIX_PORT

預設Unix套接字檔案;用於連接localhost

MYSQL_TCP_PORT

預設端口號;用於TCP/IP連接

MYSQL_PWD

預設密碼

MYSQL_DEBUG

調試過程中的調試跟蹤選項

TMPDIR

建立臨時資料表和檔案的目錄

使用MYSQL_PWD不安全。參見5.8.6節,「使您的密碼安全」

可以在選項檔案中或在命令行中指定選項來替換所有標準程式的預設選項值或指定的環境變數的值。參見4.3節,「指定程式選項」

8.2. myisampack:生成壓縮、只讀MyISAM資料表

myisampack工具可以壓縮MyISAM資料表.MYIsampack分別壓縮資料表中的每一列。通常,myisampack可以將數據檔案壓縮到40%-70%

當以後使用資料表時,解壓縮列需要的訊息被讀入內存。當訪問具體的記錄時性能會更好,因為您只需要解壓縮一個記錄。

MySQL使用mmap()對壓縮的資料表進行內存映射。如果mmap()不工作,MySQL返回到普通讀/寫檔案操作。

請注意:

·         如果用--skip-external-locking選項使用mysqld伺服器,如果在壓縮過程中資料表可能被更新,使用myisampack不是一個好注意。

·         資料表壓縮後,它變為只讀。這是故意的(例如當訪問CD上的壓縮的資料表時)。允許寫入到壓縮的資料表位於我們的TODO列資料表中,但優先級較低。

·         myisampack可以壓縮BLOBTEXT列。舊版本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存在則退出並提示錯誤。用--forcemyisampack則一定壓縮資料表。

·         -join=big_tbl_name-j big_tbl_name

將命令行中的所有資料表聯接為一個資料表big_tbl_name。將要連接的所有資料表必須有相等的結構(相同的列名和類型,相同的索引等等)

·         --pack length=len-p len

指定記錄長度儲存大小,以字節計。值應為12或者3myisampack保存所有長度指針為12或者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

不佔該類全字節範圍的整數列的數量;這些列被改為較小的類型。例如,如果所有值的範圍為從-128127BIGINT(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 endspacenot_always

不保存結尾空格並且對於所有的值不壓縮結尾空格。

o        no endspaceno 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使用新的資料表。

要想解壓縮一個壓縮的資料表,使用myisamchkisamchk--unpack選項。

8.3. mysql: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節,「數據和排序用字元編碼」

·         --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

使用charsetas作為預設字元編碼。參見5.10.1節,「數據和排序用字元編碼」

·         --execute=statement, -e statement

執行語句並退出。預設輸出格式與用--batch產生的相同。4.3.1節,「在命令行上使用選項」中提供了一些例子。

·         --force-f

即使出現一個SQL錯誤仍繼續。

·         --host=host_name-h host_name

連接給定主機上的MySQL伺服器。

·         --html-H

產生HTML輸出。

·         --ignore-space-i

忽視函數名後面的空格。其結果描述參見5.3.2節,「SQL伺服器模式」中的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命令」中詳細討論了輸出分頁。

·         --no-tee

不將輸出複製到檔案中。在8.3.2節,「mysql命令」中詳細討論了Tee檔案。

·         --one--database-O

忽視除了為命令行中命名的預設資料庫的語句。可以幫助跳過對二進制日誌中的其它資料庫的更新。

·         --pager[=command]

使用給出的命令來分頁查詢輸出。如果該命令被刪除,預設分頁器為PAGER環境變數的值。合法pagerslessmorecat [>filename]等等。該選項只在Unix中工作。不能以批處理模式工作。在8.3.2節,「mysql命令」中詳細討論了輸出分頁。

·         --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命令」中描述了提示中可以包含的具體順序。

·         --protocol={TCP | SOCKET | PIPE | MEMORY}

使用的連接協議。

·         --quick-q

不緩存每個查詢的結果,按照接收順序打印每一行。如果輸出被掛起,伺服器會慢下來。使用該選項,mysql不使用歷史檔案。

·         --raw-r

寫列的值而不轉義轉換。通常結合--batch選項使用。

·         --reconnect

如果與伺服器之間的連接中斷,自動嘗試重新連接。每次連接中斷後則嘗試一次重新連接。要想禁止重新連接,使用--skip-reconnect

·         --safe-updates--i-am-a-dummy-U

只允許那些使用鍵值指定行生效的UPDATEDELETE語句。如果已經在選項檔案中設置了該選項,可以用命令行中的--safe-updates覆蓋它。關於該選項的詳細訊息參見8.3.4節,「mysql技巧」

·         --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命令」中詳細討論了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-updatesSELECT語句的自動限制。(預設值是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的轉義符。

Editnopagerpagersystem命令只在Unix中工作。

status命令提供連接和使用的伺服器相關的部分訊息。如果用--safe-updates模式運行,status也打印影響查詢的MySQL變數的值。

要想記錄查詢及其輸出,應使用tee命令。屏幕上顯示的所有數據被追加到給定的檔案後面。這對於調試也很有用。可以用--tee選項在命令行中啟用該特性,或者用tee命令交互式啟用。可以用notee命令交互式禁用tee檔案。再次執行tee可以重新啟用日誌。前面的檔案使用時不帶任何參數。請注意執行完每個語句後tee可以將查詢結果刷新到一個檔案中,並且在mysql打印下一個提示前刷新。

--pager選項,可以用交互式模式使用Unix程式,例如lessmore或者其它類似的程式,來瀏覽或搜索查詢結果。如果未指定該選項的值,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將結果顯示在屏幕上。

還可以結合使用teepager函數。啟用一個tee檔案並將pager設置為less,能夠使用less 程式瀏覽結果,並且仍然可以同時將內容新增到一個檔案中。結合pager命令使用的Unix teemysql嵌入式tee命令的差別是即使沒有可用的Unix tee,嵌入式tee仍然可以工作。嵌入式tee還可以記錄在屏幕上輸出的內容,而結合pager命令使用的Unix tee不能記錄那麼多的內容。並且,可以從MySQL中交互式打開或關閉tee檔案日誌。當您想要將部分查詢記錄到一個檔案中時很有用,但其它不適合。

預設mysql>提示符可以重新配置。定義提示符的字串可以包含下面的特殊序列:

選項

描述

\v

伺服器版本

\d

當前的資料庫

\h

伺服器主機

\p

當前的TCP/IP端口或套接字檔案

\u

您的帳號

\U

您的全user_name@host_name帳號名

\\

\』反斜線字元

\n

新行字元

\t

Tab字元

\

空格(反斜線後面的空格)

\_

空格

\R

當前的時間,24-小時軍用時間(0-23)

\r

當前的時間,標準12-小時(1-12)

\m

當前時間的分鐘

\y

當前的年,兩位

\Y

當前的年,四位

\D

當前的日期

\s

當前時間的秒

\w

當前周的天,3字元格式(MonTue...)

\P

am/pm

\o

當前的月,數字格式

\O

當前的月,3字元格式(JanFeb...)

\c

隨發出的每個語句遞增的計數

\S

分號

\'

單引號

\"

雙引號

\』後面跟隨的其它字母則變為該字母。

如果不用任何參量指定提示命令,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節,「使用選項檔案」如果使用單反斜線,會遇到問題。例如,\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節,「在批處理模式下使用mysql」

8.3.4. 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語法」

SET語句有下面的效果:

·         不允許您執行UPDATEDELETE語句,除非在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,0001,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:用於檢查訪問權限的客戶端

mysqlaccessYves CarlierMySQL分發提供的一個診斷工具。它檢查訪問權限的主機名、帳號和資料庫組合。請注意 mysqlaccess檢查只使用userdbhost資料表的訪問。它不檢查在tables_privcolumns_privprocs_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可以為從03的一個整數。

·         --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中的密碼哈希處理」

·         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語法」

·         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節,「慢速查詢日誌」

·         Opens

伺服器已經打開的資料庫資料表的數量。

·         Flush tables

伺服器已經執行的flush ...refreshreload命令的數量。

·         Open tables

目前打開的資料表的數量。

·         Memory in use

mysqld代碼直接分配的內存數量。只有用--with--debug=full編譯了MySQL該值才顯示。

·         Maximum memory used

mysqld代碼直接分配的最大內存數量。只有用--with--debug=full編譯了MySQL該值才顯示。

如果當使用Unix套接字檔案連接本地伺服器時執行mysqladmin shutdownmysqladmin將等待直到伺服器的程序ID檔案被刪除,以確保伺服器正確停止。

mysqladmin支援下面的選項:

·         ---help-

顯示幫助消息並退出。

·         --character-sets-dir=path

字元編碼的安裝目錄。參見5.10.1節,「數據和排序用字元編碼」

·         --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

使用charsetas作為預設字元編碼。參見5.10.1節,「數據和排序用字元編碼」

·         --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節,「二進制日誌」中詳細討論了二進制日誌。

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的機器上的本地時區值格式應符合DATETIMETIMESTAMP數據類型。例如:

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節,「資料庫備份」)

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個日誌包含一個使用該臨時資料表的語句,則會造成問題。當第1mysql程序結束時,伺服器撤銷臨時資料表。當第2mysql程序想使用該資料表時,伺服器報告 「不知道該資料表」。

要想避免此類問題,使用一個連接來執行想要處理的所有二進制日誌中的內容。下面提供了一種方法:

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安全問題

警告: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|