第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|
# 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 TABLEREPAIR TABLEANALYZE TABLEOPTIMIZE 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的預設行為:

mysqlrepair

預設選項為--repair

mysqlanalyze

預設選項為--analyze

mysqloptimize

預設選項為--optimize

mysqlcheck支援下面的選項:

·         ---help-

顯示幫助消息並退出。

·         --all--database-A

檢查所有資料庫中的所有資料表。與使用---database選項相同,在命令行中命名所有資料庫。

·         --all-in-1-1

不是為每個資料表發出一個語句,而是為命名資料庫中待處理的所有資料表的每個資料庫執行一個語句。

·         --analyze-a

分析資料表。

·         --auto-repair

如果某個被檢查的資料表破壞了,自動修復它。檢查完所有資料表後自動進行所有需要的修復。

·         --character-sets-dir=path

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

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

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

·         --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:資料庫備份程式」

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 TABLESUNLOCK TABLES語句引用每個資料表轉儲。重載轉儲檔案時插入得更快。參見7.2.16節,「INSERT語句的速度」

·         --all--database-A

轉儲所有資料庫中的所有資料表。與使用---database選項相同,在命令行中命名所有資料庫。

·         --allow-keywords

允許建立關鍵字列名。應在每個列名前面加上資料表名前綴。

·         ---comments[={0|1}]

如果設置為 0,禁止轉儲檔案中的其它訊息,例如程式版本、伺服器版本和主機。--skipcomments---comments=0的結果相同。 預設值為1,即包括額外訊息。

·         --compact

產生少量輸出。該選項禁用註釋並啟用--skip-add-drop-tables--no-set-names--skip-disable-keys--skip-add-locking選項。

·         --compatible=name

產生與其它資料庫系統或舊的MySQL伺服器更兼容的輸出。值可以為ansimysql323mysql40postgresqloraclemssqldb2maxdbno_key_optionsno_tables_options或者no_field_options。要使用幾個值,用逗號將它們隔開。這些值與設置伺服器SQL模式的相應選項有相同的含義。參見5.3.2節,「SQL伺服器模式」

該選項不能保證同其它伺服器之間的相容性。它只啟用那些目前能夠使轉儲輸出更兼容的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_nameUSE db_name語句包含在每個新資料庫前的輸出中。

·         ---debug[=debug_options]-# [debug_options]

寫調試日誌。debug_options字串通常為'd:t:o,file_name'

·         --default-character-set=charset

使用charsetas預設字元編碼。參見5.10.1節,「數據和排序用字元編碼」。如果沒有指定,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語法」

·         --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)。影響到的列有BINARYVARBINARYBLOB

·         --lock-all-tables-x

所有資料庫中的所有資料表加鎖。在整體轉儲過程中通過全局讀鎖定來實現。該選項自動關閉--single-transaction--lock-tables

·         --lock-tables-l

開始轉儲前鎖定所有資料表。用READ LOCAL鎖定資料表以允許並行插入MyISAM資料表。對於事務資料表例如InnoDBBDB--single-transaction是一個更好的選項,因為它不根本需要鎖定資料表。

請注意當轉儲多個資料庫時,--lock-tables分別為每個資料庫鎖定資料表。因此,該選項不能保證轉儲檔案中的資料表在資料庫之間的邏輯一致性。不同資料庫資料表的轉儲狀態可以完全不同。

·         --master-data[=value]

該選項將二進制日誌的位置和檔案名寫入到輸出中。該選項要求有RELOAD權限,並且必須啟用二進制日誌。如果該選項值等於1,位置和檔案名被寫入CHANGE MASTER語句形式的轉儲輸出,如果您使用該SQL轉儲主伺服器以設置從伺服器,從伺服器從主伺服器二進制日誌的正確位置開始。如果選項值等於2CHANGE 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 PROCEDURECREATE 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語句。它只適用於事務資料表,例如InnoDBBDB,因為然後它將在發出BEGIN而沒有阻塞任何應用程式時轉儲一致的資料庫狀態。

當使用該選項時,應記住只有InnoDB資料表能以一致的狀態被轉儲。例如,使用該選項時任何轉儲的MyISAMHEAP資料表仍然可以更改狀態。

--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選項明顯指定格式。

註釋:該選項只適用於mysqldumpmysqld伺服器在同一台機器上運行時。您必須具有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節,「二進制日誌」)或至少知道轉儲對應的二進制日誌內容很有用:

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

8.9. mysqlhotcopy:資料庫備份程式

mysqlhotcopy是一個Perl指令,最初由Tim Bunce編寫並提供。它使用LOCK TABLESFLUSH TABLEScpscp來快速備份資料庫。它是備份資料庫或單個資料表的最快的途徑,但它只能運行在資料庫目錄所在的機器上。mysqlhotcopy只用於備份MyISAM。它運行在UnixNetWare中。

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

複製方法(cpscp)

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

這樣使用mysqlimport

shell> mysqlimport [options] db_name textfile1 [textfile2 ...]

對於在命令行中命名的每個文本檔案,mysqlimport去掉檔案名的延伸名並使用結果來確定將導入檔案內容的資料表名。例如,檔案 patient.txtpatient.textpatient均將導入資料表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語法」

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

像這樣使用mysqlshow

shell> mysqlshow[選項] [db_name [tbl_name [col_name]]]

·         如果沒有給出資料庫,顯示所有匹配的資料庫。

·         如果沒有給出資料表,顯示資料庫中所有匹配的資料表。

·         如果沒有給出列,顯示資料表中所有匹配的列和列類型。

請注意,在MySQL的新版本中,您只能看到有部分權限的那些資料庫、資料表或者列。

如果最後的參數包含shellSQL通用字元 (*』、『?』、『%』或者『_),只顯示那些名匹配通用字元的名字。如果一個資料庫名包含下劃線,應該使用一個反斜線(部分Unix shells需要雙反斜線)對它們進行轉義,以便得到一個正確的資料表或列的列資料表。『*』和『?』字元被轉換為SQL的『%』和『_』通用字元。您試圖用『_』顯示一個資料表的列名時,這可能會造成一些混淆,因為在這種情況下 mysqlshow顯示與模式相匹配的資料表名。這很容易通過在命令行新增一個『%』參量來解決。

mysqlshow支援下面的選項:

·         ---help-

顯示一個幫助消息並退出。

·         --character-sets-dir=path

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

·         --compress-C

壓縮所有的客戶和伺服器之間發送的訊息(如果它們都支援壓縮)。

·         ---debug[=debug_options]-# [debug_options]

寫調試日誌。debug_options字串通常是'd:t:o,file_name'

·         --default-character-set=charset

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

·         --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實用工具可以及時更改檔案或標準輸入中的字串。它首先使用有限狀態機來匹配長的字串。該工具可以用來交換字串。例如,下面的命令交換給定檔案file1file2中的ab

shell> replace a b b a -- file1 file2 ...

使用--選項來指示字串-替換列資料表的結束位置和開始的檔案名。

在命令行中的任何檔案名被及時修改,因此在轉換之前,可能要對源檔案進行備份。

如果在命令行中沒有指定檔案名,replace讀取標準輸入並寫到標準輸出中。在這種情況下,不需要--選項。

replace程式用於msql2mysql參見25.9.1節,「msql2mysql:轉換mSQL程式以用於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。 原始參考手冊為英文版,與英文版參考手冊相比,本翻譯版可能不是最新的。