第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="(\[email protected]\h) [\d]> "

·         使用選項文件

可以在MySQL選項文件中的[mysql]組設置提示,例如根目錄中的/etc/my.cnf.my.cnf文件。例如:

[mysql]
prompt=(\\[email protected]\\h) [\\d]>\\_

在該例子中,請注意反斜線是雙線。如果使用選項文件中的prompt選項來設置提示,當使用特殊提示選項時,建議使用雙反斜線。在允許的提示選項和選項文件中可識別的特殊轉義序列中有部分重疊。(這些序列列于4.3.2節,“使用選項文件”如果使用單反斜線,會遇到問題。例如,\s被解釋為空格而不是當前的秒值。下面的例子顯示了如何在選項文件中定義提示以包括當前的時間,格式為HH:MM:SS>

[mysql]
prompt="\\r:\\m:\\s> "

·         使用命令行選項

可以在mysql的命令行中設置--prompt選項。例如:

shell> mysql --prompt="(\[email protected]\h) [\d]> "
([email protected]) [database]>

·         交互式

你可以使用prompt(\R)命令交互地更改提示。例如:

mysql> prompt (\[email protected]\h) [\d]>\_
PROMPT set to '(\[email protected]\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: [email protected]
  mail_to: "Thimble Smith" <[email protected]>
      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 @[email protected]@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。 原始參考手冊為英文版,與英文版參考手冊相比,本翻譯版可能不是最新的。

广西11选五走势图彩经网