MYSQL 客戶端程序

1.mysql -- MYSQL 命令行工具

mysql是一個簡單的SQL shell,具有輸入行編輯功能。 它支持互動式和非互動式使用。 交互使用時,查詢結果以ASCII表格格式顯示。 當以非交互方式使用(例如,作為過濾器)時,結果以製表符分隔格式顯示。 輸出格式可以使用命令選項進行更改。

如果由於內存不足導致大的結果集出現問題,請使用--quick選項。 這迫使mysql從伺服器一次一行地檢索結果,而不是在顯示結果集之前檢索整個結果集並緩衝在內存中。 這是通過使用客戶端/伺服器庫中的mysql_use_result()C API函數而不是mysql_store_result()返回結果集來完成的。

使用mysql很容易。 從命令解釋器的提示中調用它,如下所示:

shell> mysql db_name

或:

shell> mysql --user=user_name --password=your_password db_name

您可以像這樣在腳本文件(批處理文件)中執行SQL語句:

shell> mysql db_name < script.sql > output.tab

mysql支持以下選項,可以在命令行或選項文件的[mysql]和[client]組中指定。

  • --auto-rehash

啟用自動重新哈希。 此選項默認情況下處於啟用狀態,從而啟用資料庫,表和列名稱完成。 使用--disable-auto-rehash禁用重新哈希。 這會導致mysql啟動速度更快,但是如果要使用名稱完成,則必須發出rehash命令或其#快捷方式

要補全名稱,請輸入第一部分,然後按Tab鍵。 如果名字是明確的,那麼mysql就完成了。 否則,您可以再次按Tab鍵查看可能的名稱,這些名稱以您迄今輸入的內容開頭。 如果沒有默認資料庫,則不會發生補全。

--支持TAB補全

注意:

此功能需要一個與readline庫一起編譯的MySQL客戶端。通常,readline庫在Windows上不可用。

  • --auto-vertical-output

如果結果集對於當前窗口太寬而導致結果集被垂直顯示,否則使用正常的表格格式。 (這適用於以或G結尾的語句)

  • --batch, -B

使用選項卡作為列分隔符列印結果,每行放在一個新行中。 使用這個選項,mysql不會使用歷史文件。

批處理模式導致非表格輸出格式和特殊字元轉義。 通過使用原始模式可能會禁用轉義。 請參閱--raw選項的說明。

  • --binary-mode

此選項有助於處理可能包含BLOB值的mysqlbinlog輸出。 默認情況下,mysql會將語句字元串中的
轉換為
,並將解釋為語句終止符。 --binary-mode禁用這兩個功能。 它也禁用所有的mysql命令,除了非交互模式下的字符集和分隔符(用於輸入到mysql的輸入或使用源命令載入的)。

  • --bind-address=ip_address

在具有多個網路介面的計算機上,使用此選項來選擇連接到MySQL伺服器的介面。

  • --character-sets-dir=dir_name

安裝字符集的目錄

  • --column-names

在結果中寫入列名稱。

  • --column型信息

顯示結果集元數據。

  • --comments, -c

是否保留髮送到伺服器的語句中的注釋。 默認是--skip-comments(放棄注釋),使用--comments(保留注釋)啟用。

  • --compress, -C

壓縮客戶端和伺服器之間發送的所有信息(如果兩者都支持壓縮)。

  • --connect-expired-password

如果用於連接的帳戶具有過期的密碼,則向伺服器指示客戶端可以處理沙箱模式。 這對於mysql的非互動式調用非常有用,因為通常情況下,伺服器會斷開嘗試使用具有過期密碼的帳戶進行連接的非互動式客戶端。

  • --database=db_name, -D db_name

要使用的資料庫。 這主要用於選項文件。

  • --delimiter=str

設置語句分隔符。 默認值是分號(「;」)。

  • --disable-named-commands

禁用named命令。 僅使用*表單,或僅在以分號(「;」)結尾的行的開始處使用named 命令。 mysql默認啟用這個選項。 但是,即使使用此選項,長格式的命令仍然可以從第一行開始。

  • --enable-cleartext-plugin

啟用mysql_clear_password明文身份驗證插件。

  • --execute=statement, -e statement

執行語句並退出。 默認的輸出格式就像使用--batch生成的那樣。

  • --force, -f

繼續即使發生SQL錯誤。

  • --histignore

這些模式被添加到默認方案列表(「* IDENTIFIED *:* PASSWORD *」)中。 為此選項指定的值會影響寫入歷史記錄文件的語句的日誌記錄,如果給出了-syslog選項,則會影響到syslog。

  • --host=host_name, -h host_name

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

  • --html, -H

生成HTML輸出。

  • --ignore-spaces, -i

忽略函數名稱後面的空格。 這個效果在IGNORE_SPACE SQL模式的討論中有描述

  • --init-command=str

連接到伺服器後執行的SQL語句。 如果啟用了自動重新連接,則在重新連接發生後,語句會再次執行。

  • --line-numbers

寫錯誤的行號。 用--skip-line-numbers來禁用這個功能。

  • --local-infile[={0|1}]

啟用或禁用LOAD DATA INFILE的LOCAL功能。 沒有值時,選項啟用LOCAL。 該選項可以用--local-infile = 0或--local-infile = 1來顯式禁用或啟用LOCAL。 如果伺服器不支持,則啟用LOCAL不起作用。

  • --named-commands, -G

啟用命名的mysql命令。 長格式的命令是允許的,而不僅僅是短格式的命令。 例如quit和q都被識別。使用--skip-named-commands禁用命名命令

  • --no-auto-rehash, -A

這與--skip-auto-rehash具有相同的效果

  • --no-beep, -b

發生錯誤時不要發出嗶嗶聲。

  • --one-database, -o

除了那些默認資料庫是在命令行中命名的資料庫之外的語句,忽略這些語句。 這個選項是基本的,應該小心使用。 語句篩選僅基於USE語句。

最初,mysql在輸入中執行語句,因為在命令行上指定資料庫db_name相當於在輸入的開頭插入USE db_name。然後,對於遇到的每個USE語句,mysql將接受或拒絕以下語句,具體取決於命名資料庫是否是命令行上的語句。 聲明的內容並不重要。

假設調用mysql來處理這組語句:

DELETE FROM db2.t2;

USE db2;

DROP TABLE db1.t1;

CREATE TABLE db1.t1 (i INT);

USE db1;

INSERT INTO t1 (i) VALUES(1);

CREATE TABLE db2.t1 (j INT);

如果命令行是mysql --force --one-database db1,則mysql按如下方式處理輸入:

1.執行DELETE語句是因為默認資料庫是db1,即使該語句將名稱命名為不同資料庫中的表。

2.不執行DROP TABLE和CREATE TABLE語句,因為默認資料庫不是db1,即使這些語句在db1中命名為一個表。

3.執行INSERT和CREATE TABLE語句是因為默認資料庫是db1,即使CREATE TABLE語句在不同的資料庫中命名一個表。

--這個選項有點難用。

  • --pager[=command]

使用給定的命令進行分頁查詢輸出。 如果省略該命令,則默認是您的頁面是PAGER環境變數的值。 有效的頁面是less, more, cat [> filename],等等。 該選項僅適用於Unix,只能在交互模式下使用。 要禁用分頁,請使用--skippager。

  • --print-defaults

列印程序名稱以及從選項文件中獲取的所有選項。

  • --prompt=format_str

將提示設置為指定的格式。 默認是mysql>

  • --quick, -q

不緩存每個查詢結果,在它收到時列印每一行 。 如果輸出被暫停,這可能會降低伺服器的速度。 使用這個選項,mysql不會使用歷史文件。

  • --raw, -r

對於表格式的輸出,圍繞列的"boxing」能夠使一列值與另一列值區分開來。 對於非表格輸出(例如在批處理模式下生成或在給出--batch或--silent選項時),輸出中會轉義特殊字元,以便輕鬆識別它們。 換行符,製表符,NUL和反斜杠寫為
, ,和\。 --raw選項禁止這個字元轉義。

以下示例演示了表格與非表格輸出以及使用原始模式禁用轉義:

% mysql

mysql> SELECT CHAR(92);

+----------+

| CHAR(92) |

+----------+

| |

+----------+

% mysql -s

mysql> SELECT CHAR(92);

CHAR(92)

\

% mysql -s -r

mysql> SELECT CHAR(92);

CHAR(92)

  • --reconnect

如果與伺服器的連接丟失,請自動嘗試重新連接。 每次連接丟失時都會進行一次重新連接嘗試。 要禁止重新連接行為,請使用--skip-reconnect。

  • --safe-updates, --i-am-a-dummy, -U

僅允許使用鍵值指定要修改哪些行的UPDATE和DELETE語句。 如果您在選項文件中設置了此選項,則可以在命令行上使用--safe-updates覆蓋它

  • --show-warnings

如果有任何語句,會在每個語句後顯示警告。 該選項適用於互動式和批處理模式。

  • --sigint-ignore

忽略SIGINT信號(通常是鍵入Control + C的結果)。

  • --silent, -s

靜默模式。 生產更少的產出。 這個選項可以給出多次產生越來越少的輸出。

這個選項會導致非表格輸出格式和特殊字元的轉義。 通過使用原始模式可能會禁用轉義。 請參閱--raw選項的說明。

  • --skip-column-names, -N

不要在結果中寫列名。

  • --skip-line-numbers, -L

不要寫錯誤的行號。 當您想要比較包含錯誤消息的結果文件時很有用。

  • --table, -t

以表格格式顯示輸出。 這是互動式使用的默認設置,但可用於在批處理模式下生成表格輸出。

  • --tee=file_name

將輸出的副本追加到給定的文件。 該選項只能在交互模式下使用。

  • --unbuffered, -n

每次查詢後刷新緩衝區。

  • --vertical, -E

垂直列印查詢輸出行(每列值一行)。 沒有這個選項,你可以通過用G來終止它們來指定單個語句的垂直輸出。

  • --wait, -w

如果無法建立連接,請等待並重試,而不是中止。

  • --xml, -X

生成XML輸出。

<field name="column_name">NULL</field>

當--xml與mysql一起使用時的輸出與mysqldump --xml的輸出相匹配。

XML輸出也使用XML命名空間,如下所示:

shell> mysql --xml -uroot -e "SHOW VARIABLES LIKE version%"

<?xml version="1.0"?>

<resultset statement="SHOW VARIABLES LIKE version%" xmlns:xsi="w3.org/2001/XMLSchema-i">

<row>

<field name="Variable_name">version</field>

<field name="Value">5.0.40-debug</field>

</row>

<row>

<field name="Variable_name">version_comment</field>

<field name="Value">Source distribution</field>

</row>

<row>

<field name="Variable_name">version_compile_machine</field>

<field name="Value">i686</field>

</row>

<row>

<field name="Variable_name">version_compile_os</field>

<field name="Value">suse-linux-gnu</field>

</row>

</resultset>

(參考BUG #25946)

您也可以使用--var_name=value來設置以下變數:

  • connect_timeout

連接超時前的秒數。 (默認值是0.)

  • max_allowed_packet

客戶端/伺服器通信的最大緩衝區大小。 默認是16MB,最大是1GB。

  • max_join_size

使用--safe-updates時自動限制聯接中的行。 (默認值是1,000,000。)

  • net_buffer_length

TCP / IP和套接字通信的緩衝區大小。 (默認值是16KB。)

  • select_limit

使用--safe-updates時自動限制SELECT語句。 (默認值是1,000)

mysql 客戶端 命令:

如果使用--binary-mode選項調用mysql,則除了非交互模式下的字符集和分隔符外,所有mysql命令都被禁用(用於輸入到mysql或者使用source命令載入的輸入)。

每個命令都有長短兩種形式。 長形式不區分大小寫; 簡短的形式區分。 長表單可以跟一個可選的分號結束符,但是短格式不能。

不支持在多行/ * ... * /注釋中使用短格式的命令

  • help [arg], h [arg], ? [arg], ? [arg]

顯示列出可用mysql命令的幫助消息。

如果你給help命令提供了一個參數,mysql將它作為一個搜索字元串來訪問MySQL參考手冊

  • charset charset_name, C charset_name

更改默認字符集並發出SET NAMES語句。 這使得如果mysql在啟用了自動重新連接的情況下運行(不推薦),字符集在客戶端和伺服器上保持同步,因為指定的字符集用於重新連接。

  • clear, c

清除當前輸入。 如果您改變了執行您輸入的語句的想法,請使用它。

  • connect [db_name host_name]],
    [db_name host_name]]

重新連接到伺服器。 可以給出可選的資料庫名稱和主機名稱參數來指定預設資料庫或伺服器運行的主機。 如果省略,則使用當前值。

  • delimiter str, d str

更改mysql解釋為SQL語句之間的分隔符的字元串。 默認值是分號(「;」)。

分隔符字元串可以在分隔符命令行中指定為不帶引號或帶引號的參數。 可以用單引號(),雙引號(「)或反引號()來引用引號。要在帶引號的字元串中包含引號,可以用不同的引號引用字元串,也可以用反斜杠 (「」)字元,在引用字元串之外應該避免使用反斜杠,因為它是MySQL的轉義字元

除了引用的字元串之外,mysql將定界符字元串的實例解釋為語句定界符。 注意定義可能在其他詞語中出現的分隔符。 例如,如果將分隔符定義為X,則無法在語句中使用INDEX這個詞。 mysql將其解釋為INDE,後面跟著分隔符X.

當mysql識別的分隔符被設置為默認的「;」以外時,該字元的實例將被發送到伺服器而不需要解釋。 但是,伺服器本身仍將「;」解釋為語句分隔符,並相應地處理語句。 伺服器端的這種行為對於多語句執行起到了作用,並且用於解析存儲過程和函數體,觸發器和事件

  • edit,e

編輯當前的輸入語句。 mysql檢查EDITOR和VISUAL環境變數的值,以確定使用哪個編輯器。 如果兩個變數均未設置,則默認編輯器是vi。

編輯命令只適用於Unix

  • ego,G

將當前語句發送到伺服器執行,並使用垂直格式顯示結果。

  • exit,q

退出 mysql

  • go, g

發送當前語句到伺服器執行。

  • nopager, n

禁用輸出分頁。 請參閱pager的說明。

nopager命令只適用於Unix。

  • notee,

禁用輸出複製到tee文件。 請參閱tee的描述。

  • nowarning, w

每個語句後禁用顯示警告。

  • pager [command], P [command]

啟用輸出分頁。 通過在調用mysql時使用--pager選項,可以使用Unix程序(比如less,more或者其他類似的程序)以交互模式瀏覽或搜索查詢結果。 如果你沒有為該選項指定值,mysql會檢查PAGER環境變數的值,並設置該頁面。 傳呼機功能只能在交互模式下工作。

可以使用pager命令交互地啟用輸出分頁,並使用nopager禁用輸出分頁。 該命令採用可選參數; 如果給出,分頁程序就這樣設置。 如果沒有參數,則將pager設置為在命令行上設置的pager,如果未指定pager,則將該尋呼機設置為stdout

輸出分頁只能在Unix中使用,因為它使用了在Windows上不存在的popen()函數。 對於Windows,可以使用tee選項來保存查詢輸出。

  • print,p

列印當前輸入語句而不執行它。

  • prompt [str], R [str]

重新配置mysql提示符給定的字元串。 本節後面將介紹可在提示中使用的特殊字元序列。

如果你指定不帶參數的提示符命令,mysql會將提示符重置為默認值 mysql>.

  • rehash, #

在輸入語句時,重建完成資料庫,表和列名完成的散列。 (請參閱--auto-rehash選項的說明。)

  • resetconnection, x

重置連接以清除會話狀態。 這個命令是在MySQL 5.7.3中添加的。

重置連接具有類似於mysql_change_user() 或自動重新連接的效果,除非連接未關閉並重新打開,並且不會進行重新驗證。

此示例顯示resetconnection如何清除會話狀態中維護的值:

mysql> SELECT LAST_INSERT_ID(3);

+-------------------+

| LAST_INSERT_ID(3) |

+-------------------+

| 3 |

+-------------------+

mysql> SELECT LAST_INSERT_ID();

+------------------+

| LAST_INSERT_ID() |

+------------------+

| 3 |

+------------------+

mysql> resetconnection;

mysql> SELECT LAST_INSERT_ID();

+------------------+

| LAST_INSERT_ID() |

+------------------+

| 0 |

+------------------+

  • source file_name, . file_name

讀取指定的文件並執行其中包含的語句。 在Windows上,可以將路徑名稱分隔符指定為/或\。

  • status, s

提供有關連接和正在使用的伺服器的狀態信息。如果您正在以--safe-updates模式運行,狀態還會列印影響查詢的mysql變數的值。

  • system command, ! command

使用默認的命令解釋器執行給定的命令。

SYSTEM命令只適用於Unix

  • tee [file_name], T [file_name]

通過在調用mysql時使用--tee選項,可以記錄語句及其輸出。 屏幕上顯示的所有數據都會附加到給定的文件中。 這對於調試目的也是非常有用的。 在每個語句之後,mysql都會在文件列印出下一個提示之前將結果刷新到文件中.Tee功能只能在交互模式下使用。

您可以使用tee命令以交互方式啟用此功能。 如果沒有參數,則使用前一個文件。 tee文件可以用notee命令禁用。 再次執行tee重新啟用日誌記錄。

  • use db_name, u db_name

使用 db_name 作為默認資料庫

  • warnings, W

在每個語句之後啟用警告顯示(如果有的話)。

以下是關於pager命令的一些tips:

  • 您可以使用它來寫入一個文件,結果只能到文件:

mysql> pager cat > /tmp/log.txt

您還可以傳遞您要用作pager的程序的任何選項:

mysql> pager less -n -i -S

  • 在上例中,請注意-S選項。 您可能會發現瀏覽廣泛的查詢結果非常有用。 有時很難在屏幕上閱讀很寬的結果集。 -S選項較少可以使結果集更加可讀,因為您可以使用左箭頭和右箭頭鍵水平滾動它。 您也可以在較少的互動式下使用-S來打開和關閉橫向瀏覽模式。 有關更多信息,請閱讀較少的手冊頁面:
  • 如果輸出適合一個屏幕,則可以使用-F和-X選項,從而使其退出,這在不需要滾動時很方便:

mysql> pager less -n -i -S -F -X

  • 您可以指定非常複雜的pager命令來處理查詢輸出:

mysql> pager cat | tee /dr1/tmp/res.txt | tee /dr2/tmp/res2.txt | less -n -i -S

在本例中,命令會將查詢結果發送到/dr1和/dr2上安裝的兩個不同文件系統上的兩個不同目錄中的兩個文件,但仍然使用less顯示屏幕上的結果。

您也可以結合tee和pager功能。 啟用tee文件並將pager設置為less,並且您可以使用less程序瀏覽結果,並且同時將所有內容都附加到文件中。 使用pager命令的Unix tee和mysql builtin tee命令之間的區別在於,即使你沒有Unix tee,內置的tee也可以工作。 內置的tee還記錄了所有列印在屏幕上的信息,而與pager一起使用的Unix tee不會記錄太多。 另外,tee文件日誌記錄可以在mysql中交互地打開和關閉。 當您想要將某些查詢記錄到文件時,這非常有用,而不是其他的。

prompt命令重新配置默認的mysql>提示符。 用於定義提示符的字元串可以包含以下特殊序列。

你可以以下列方式設置提示:

  • 使用一個環境變數。 您可以將MYSQL_PS1環境變數設置為提示字元串。 例如:

shell> export MYSQL_PS1="(u@h) [d]>"

  • 使用命令行選項。 您可以在命令行上將--prompt選項設置為mysql。 例如:

shell> mysql --prompt="(u@h) [d]> "

(user@host) [database]>

  • 使用選項文件 您可以在任何MySQL選項文件的[mysql]組中設置提示選項,例如/etc/my.cnf或主目錄中的.my.cnf文件。 例如:

[mysql]

prompt=(\u@\h) [\d]>\_

在這個例子中,請注意反斜杠加倍。 如果使用選項文件中的提示選項設置提示,建議在使用特殊提示選項時加倍反斜杠。 在一系列允許的提示選項和在選項文件中識別的一組特殊轉義序列中有一些重疊。 (選項文件中的轉義序列規則在第4.2.6節「使用選項文件」中列出)。如果使用單個反斜杠,重疊可能會導致問題。 例如,s被解釋為一個空格而不是當前秒值。 以下示例顯示了如何在選項文件中定義提示以將當前時間包含在HH:MM:SS>格式中:

[mysql]

prompt="\r:\m:\s> "

  • 互動式設置提示。 您可以使用提示(或 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>

mysql Logging

對於每個啟用的日誌記錄目標,語句記錄如下所示:

  • 語句僅在互動式執行時記錄。語句是非互動式的,例如從文件或管道讀取時。 也可以通過使用--batch或--execute選項來禁止語句記錄。
  • 如果語句與「忽略」列表中的任何模式相匹配,語句將被忽略並不記錄。 這個列表稍後介紹。
  • mysql分別記錄每個無符號的,非空的語句行。
  • 如果一個無符號的語句跨越多行(不包括終止分隔符),mysql連接這些行以形成完整的語句,將換行符映射到空格,並記錄結果和分隔符。

因此,跨越多行的輸入語句可以被log兩次。 考慮這個輸入:

mysql> SELECT

-> Today is

-> ,

-> CURDATE()

-> ;

在這種情況下,mysql會在讀取它們時記錄"SELECT","Today is

",",","CURDATE()" 和";"行。 它還記錄了完整的語句,在映射SELECT
Today is

CURDATE() 到Today is,CURDATE(),再加上一個分隔符之後。 因此,這些行出現在記錄輸出中:

SELECT

Today is

,

CURDATE()

;

SELECT Today is , CURDATE();

mysql會忽略與「忽略」列表中任何模式匹配的記錄目的語句。 默認情況下,模式列表是「* IDENTIFIED *:* PASSWORD *」,忽略引用密碼的語句。 模式匹配不區分大小寫。 在模式中,兩個字元是特殊的:

?匹配任何單個字元

*匹配零個或多個字元的任何序列

要指定其他模式,請使用--histignore選項或設置MYSQL_HISTIGNORE環境變數。 (如果兩者都指定,則優先選項值。)該值應該是一個或多個模式的冒號分隔列表,這些模式會附加到默認模式列表中。

在命令行中指定的模式可能需要引用或轉義,以防止您的命令解釋器專門處理它們。 例如,除了引用密碼的語句之外,為了禁止UPDATE和DELETE語句的日誌記錄,像這樣調用mysql:

shell> mysql --histignore="*UPDATE*:*DELETE*"

控制歷史文件

.mysql_history文件應該使用限制性訪問模式進行保護,因為可能會寫入敏感信息,例如包含密碼的SQL語句的文本。

如果您不想維護歷史文件,請先刪除.mysql_history(如果存在)。 然後使用以下任一技術來防止再次創建它:

  • 將MYSQL_HISTFILE環境變數設置為/dev/null。 要使此設置在您每次登錄時生效,請將其置於您的某個shell的啟動文件中。
  • 創建.mysql_history作為/dev/null的符號鏈接; 這隻需要做一次:

shell> ln -s /dev/null $HOME/.mysql_history

syslog Logging 字元串

如果給出了--syslog選項,mysql會將互動式語句寫入系統日誌記錄工具。 消息日誌記錄具有以下特徵。

記錄發生在「信息」層面。 這對應於Unix/Linux系統日誌功能的syslog的LOG_INFO優先順序和Windows事件日誌的EVENTLOG_INFORMATION_TYPE。 請參閱您的系統文檔以配置您的記錄功能。

信息大小有 1024byte 的限制

消息由標識符MysqlClient後跟這些值組成:

  • SYSTEM

系統用戶名(登錄名)或 - 如果用戶未知。

  • MYSQL_USER

MySQL用戶名(使用--user選項指定)或 - -如果用戶未知。

  • CONNECTION_ID:

客戶端連接標識符。 這與會話中的CONNECTION_ID() 函數值相同。

  • DB_SERVER

伺服器主機或 -- 如果主機是未知的

  • DB

默認資料庫或 - -如果沒有資料庫被選擇。

  • QUERY

記錄聲明的文本。

以下是使用--syslog在Linux上生成的輸出示例。 此輸出格式化為可讀性; 每個記錄的消息實際上只佔一行。

Mar 7 12:39:25 myhost MysqlClient[20824]:

SYSTEM_USER:oscar, MYSQL_USER:my_oscar, CONNECTION_ID:23,

DB_SERVER:127.0.0.1, DB:--, QUERY:USE test;

Mar 7 12:39:28 myhost MysqlClient[20824]:

SYSTEM_USER:oscar, MYSQL_USER:my_oscar, CONNECTION_ID:23,

DB_SERVER:127.0.0.1, DB:test, QUERY:SHOW TABLES;

4.5.1.4 mysql 伺服器-端幫助

mysql> help search_string

如果你給help命令提供了一個參數,mysql將它作為一個搜索字元串來訪問MySQL參考手冊中的伺服器端幫助。

如果搜索字元串不匹配,則搜索失敗:

mysql> help me

Nothing found

Please try to run help contents for a list of all accessible topics

使用help contents查看幫助類別的列表:

mysql> help contents

You asked for help about help category: "Contents"

For more information, type help <item>, where <item> is one of the

following categories:

Account Management

Administration

Data Definition

Data Manipulation

Data Types

Functions

Functions and Modifiers for Use with GROUP BY

Geographic Features

Language Structure

Plugins

Storage Engines

Stored Routines

Table Maintenance

Transactions

Triggers

如果搜索字元串匹配多個項目,mysql會顯示一個匹配的主題列表:

mysql> help logs

Many help items for your request exist.

To make a more specific request, please type help <item>,

where <item> is one of the following topics:

SHOW

SHOW BINARY LOGS

SHOW ENGINE

SHOW LOGS

使用主題作為搜索字元串來查看該主題的幫助條目:

mysql> help show binary logs

Name: SHOW BINARY LOGS

Description:

Syntax:

SHOW BINARY LOGS

SHOW MASTER LOGS

Lists the binary log files on the server. This statement is used as

part of the procedure described in [purge-binary-logs], that shows how

to determine which logs can be purged.

mysql> SHOW BINARY LOGS;

+---------------+-----------+

| Log_name | File_size |

+---------------+-----------+

| binlog.000015 | 724935 |

| binlog.000016 | 733481 |

搜索字元串可以包含通配符「%」和「_」。 這些與LIKE運算符執行的模式匹配操作具有相同的含義。 例如,HELP rep%返回以rep開頭的主題列表:

mysql> HELP rep%

Many help items for your request exist.

To make a more specific request, please type help <item>,

where <item> is one of the following

topics:

REPAIR TABLE

REPEAT FUNCTION

REPEAT LOOP

REPLACE

REPLACE FUNCTION

從一個文本文件執行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 file_name

mysql> . file_name

有時您可能希望腳本向用戶顯示進度信息。 為此,您可以插入像這樣的語句:

SELECT <info_to_display> AS ;

顯示的語句輸出<info_to_display>。

您也可以使用--verbose選項調用mysql,這會導致在生成結果之前顯示每個語句。

mysql會忽略輸入文件開始處的Unicode位元組順序標記(BOM)字元。 以前,它讀取它們並將它們發送到伺服器,導致語法錯誤。 存在BOM不會導致mysql更改其默認字符集。 要做到這一點,請使用諸如--defaultcharacter-set=utf8之類的選項來調用mysql。

mysql tips

輸入行編輯:

mysql支持輸入行編輯,使您可以修改當前的輸入行或調用以前的輸入行。 例如,左箭頭鍵和右箭頭鍵在當前輸入行內水平移動,上下箭頭鍵在上一行輸入行中上下移動。 Backspace刪除游標前的字元,並在游標位置輸入新的字元。 要輸入該行,請按Enter鍵。

在Windows上,編輯鍵序列與控制台窗口中命令編輯所支持的相同。 在Unix上,鍵序列取決於用於構建mysql的輸入庫(例如,libedit或readline庫)。

使用 --safe-updates 選項:

對於初學者來說,一個有用的啟動選項是--safe-updates(或者--i-am-a-dummy,它具有相同的效果)。 這對於您可能發出DELETE FROM tbl_name語句但忘記WHERE子句的情況很有幫助。通常,這樣的語句會刪除表中的所有行。 使用--safeupdates,只能通過指定標識它們的鍵值來刪除行。 這有助於預防事故。

當您使用--safe-updates選項時,mysql在連接到MySQL伺服器時發出以下語句:

SET sql_safe_updates=1, sql_select_limit=1000, max_join_size=1000000;

SET語句會產生下列影響:

  • 除非您在WHERE子句中指定鍵約束或提供LIMIT子句(或提供兩者),否則不得執行UPDATE或DELETE語句。例如:

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子句。
  • 伺服器中止多表SELECT語句,可能需要檢查超過1,000,000行組合。

要指定與1,000和1,000,000不同的限制,可以使用--select_limit和--max_join_size選項覆蓋默認值:

shell> mysql --safe-updates --select_limit=500 --max_join_size=10000

禁用 mysql 自動-重連接

如果mysql客戶端在發送語句時失去與伺服器的連接,它立即自動嘗試重新連接一次到伺服器並再次發送語句。 但是,即使mysql成功重新連接,您的第一個連接也已經結束,您以前的會話對象和設置都將丟失:臨時表,自動提交模式以及用戶定義和會話變數。 此外,任何當前事務都會回滾。這種行為對您而言可能是危險的,如下例所示,伺服器在第一個和第二個語句之間關閉並重新啟動,但您不知道:

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客戶端。

2.mysqladmin --用於管理MySQL伺服器的客戶端

mysqladmin是執行管理操作的客戶端。 您可以使用它來檢查伺服器的配置和當前狀態,創建和刪除資料庫等等。

像這樣調用mysqladmin:

shell> mysqladmin [options] command [command-arg] [command [command-arg]] ...

mysqladmin支持以下命令。 其中一些命令在命令名後面有一個參數。

  • create db_name

創建一個名為db_name的新資料庫

  • debug

告訴伺服器將調試信息寫入錯誤日誌。 此信息的格式和內容可能會更改。

這包括有關事件調度程序的信息

  • drop db_name

刪除名為db_name的資料庫及其所有表。

  • extended-status

顯示伺服器狀態變數及其值。

  • flush-hosts

刷新主機緩存中的所有信息。

  • flush-logs [log_type ...]

刷新所有日誌

從MySQL 5.7.5開始,mysqladmin flush-logs命令允許指定可選的日誌類型,以指定要刷新的日誌。 在flush-logs命令之後,可以提供一個或多個以下日誌類型的空格分隔列表:binary,engine, error, general, relay, slow。 這些對應於可以為FLUSH LOGS SQL語句指定的日誌類型。

  • flush-privileges

重新載入授權表(與重新載入相同)。

  • flush-status

清除狀態變數。

  • flush-tables

刷新所有表

  • flush-threads

刷新線程緩存

  • kill id,id,...

殺死伺服器線程。 如果給出多個線程標識值,則列表中不能有空格。

  • old-password new-password

這與密碼命令類似,但使用舊的(4.1之前的)密碼散列格式存儲密碼。

  • password new-password

設置一個新的密碼。 這將密碼更改為您使用mysqladmin連接到伺服器的帳戶的新密碼。 因此,下次您使用同一個帳戶調用mysqladmin(或任何其他客戶端程序)時,您將需要指定新的密碼。

如果新密碼值包含命令解釋程序專用的空格或其他字元,則需要將其放在引號內。 在Windows上,確保使用雙引號而不是單引號; 單引號不會從密碼中除去,而是被解釋為密碼的一部分。 例如:

shell> mysqladmin password "my new password"

在MySQL 5.7中,密碼命令後可以省略新密碼。 在這種情況下,mysqladmin會提示輸入密碼值,這樣可以避免在命令行上指定密碼。 只有在密碼是mysqladmin命令行上的最後一個命令時,才應該省略密碼值。 否則,下一個參數被作為密碼。

警告:

如果伺服器是使用--skipgrant-tables選項啟動的,則不要使用此命令。 不會更改密碼。 即使您在同一命令行上使用flush-privileges的password命令來重新啟用授予表,因為在連接後發生刷新操作,情況也是如此。 但是,您可以使用mysqladmin flush-privileges重新啟用授權表,然後使用單獨的mysqladmin password命令更改密碼。

  • ping

檢查伺服器是否可用。 如果伺服器正在運行,mysqladmin的返回狀態為0,否則為1。 即使遇到拒絕訪問等錯誤,也是0,因為這意味著伺服器正在運行,但拒絕連接,這與伺服器沒有運行不同。

  • processlist

顯示活動伺服器線程的列表。 這就像SHOW PROCESSLIST語句的輸出一樣。 如果給出--verbose選項,則輸出與SHOW FULL 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秒的查詢數。

  • open

伺服器已打開的表的數量。

  • flush tables

伺服器執行的flush- *,refresh和reload命令的數量。

  • open tables

    當前正在打開的表的數量。

如果在使用Unix套接字文件連接到本地伺服器時執行mysqladmin shutdown,則mysqladmin會一直等到伺服器的進程ID文件被刪除,以確保伺服器已正常停止。

mysqladmin支持以下選項,可以在命令行或選項文件的[mysqladmin]和[client]組中指定。

  • --character-sets-dir=dir_name

安裝字符集的目錄

  • --compress, -C

壓縮客戶端和伺服器之間發送的所有信息(如果兩者都支持壓縮)

  • --count=N, -c N

如果給出--sleep選項,則重複執行的次數。

  • --debug [= debug_options], - #[debug_options]

編寫一個調試日誌。 典型的debug_options字元串是d:t:o,file_name。 預設值是d:t:o,/tmp/mysqladmin.trace。

  • --enable-cleartext-plugin

啟用mysql_clear_password明文身份驗證插件

  • --no-beep, -b

抑制默認發出的警告音,例如無法連接到伺服器等錯誤。

  • --relative, -r

與--sleep選項一起使用時,顯示當前值和以前的值之間的差異。 該選項僅適用於extended-status命令。

  • --slient,-s

如果無法建立到伺服器的連接,請靜靜地退出。

  • --sleep=delay, -i delay

重複執行命令,在兩者之間延遲睡眠。 --count選項決定迭代次數。 如果--count沒有給出,mysqladmin將無限期地執行命令直到中斷。

  • --vertical, -E

垂直列印輸出。 這與--relative類似,但垂直列印輸出。

  • --wait [= count],-w [count]

如果無法建立連接,請等待並重試,而不是中止。 如果給出了計數值,則表示重試的次數。 默認是一次。

您也可以使用--var_name = value來設置以下變數。

  • connect_timeout

連接超時前的最大秒數。 默認值是43200(12小時)。

  • shutdown_timeout

等待伺服器關閉的最大秒數。 默認值是3600(1小時)。

3.mysqlcheck -- 表維護程序

mysqlcheck客戶端執行表維護:它檢查,修復,優化或分析表。

每個表都被鎖定,因此在正在處理的其他會話中不可用,但對於檢查操作,僅使用READ鎖鎖定表

表維護操作可能是耗時的,特別是對於大型表格。 如果使用--databases或--alldatabases選項來處理一個或多個資料庫中的所有表,則對mysqlcheck的調用可能需要很長時間(對於mysql_upgrade也是如此,因為該程序調用mysqlcheck來檢查所有表並修復 他們如果需要。)

mysqlcheck在功能上與myisamchk類似,但工作方式不同。 主要的操作區別在於mysqld伺服器正在運行時必須使用mysqlcheck,而不使用myisamchk。 使用mysqlcheck的好處是,您不必停止伺服器來執行表維護。

mysqlcheck以便捷的方式為用戶使用SQL語句CHECK TABLE,REPAIR TABLE,ANALYZE TABLE和OPTIMIZE TABLE。 它確定要執行的操作使用哪些語句,然後將語句發送到伺服器以執行。

MyISAM存儲引擎支持全部四個維護操作,因此可以使用mysqlcheck在MyISAM表上執行任何操作。 其他存儲引擎不一定支持所有操作。 在這種情況下,會顯示錯誤消息。 例如,如果test.t是一個MEMORY表,試圖檢查它會產生這樣的結果:

shell> mysqlcheck test t

test.t

note : The storage engine for the table doesnt support check

例如,InnoDB表格就是這種情況,可以使用CHECK TABLE進行檢查,但不能用REPAIR TABLE進行修復。

注意:

在執行表修復操作之前,最好先對錶進行備份;在某些情況下,操作可能會導致數據丟失。可能的原因包括但不限於文件系統錯誤。

有三種通用的方法來調用mysqlcheck:

shell> mysqlcheck [options] db_name [tbl_name ...]

shell> mysqlcheck [options] --databases db_name ...

shell> mysqlcheck [options] --all-databases

如果您沒有命名db_name後面的任何錶,或者如果使用--databases或--all-databases選項,則將檢查整個資料庫

與其他客戶端程序相比,mysqlcheck有一個特殊的功能。 檢查表(--check)的默認行為可以通過重命名二進位文件來改變。 如果你想擁有一個默認修復表的工具,你只需要創建一個名為mysqlrepair的mysqlcheck的副本,或者創建一個名為mysqlrepair的mysqlcheck的符號鏈接。 如果你調用mysqlrepair,它會修復表。

下表中顯示的名稱可用於更改mysqlcheck的默認行為。

mysqlrepair 默認選項是--repair

mysqlanalyze 默認選項是--analyze

mysqloptimize 默認選項是--optimize

mysqlcheck支持以下選項,可以在命令行或選項文件的[mysqlcheck]和[client]組中指定。

  • --all-databases ,-A

檢查所有資料庫中的所有表。 這與使用--databases選項並在命令行上指定所有資料庫相同,只是不會轉儲INFORMATION_SCHEMA和performace_schema資料庫。 可以通過使用--databases選項明確地命名它們來轉儲它們。

  • --all-in-1, -1

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

  • --analyze, -a

分析這個表

  • --auto-repair

如果檢查表損壞,自動修復它。 所有必要的維修都在所有表格被檢查完成之後完成。

  • --bind-address=ip_address

在具有多個網路介面的計算機上,使用此選項來選擇連接到MySQL伺服器的介面。

  • --character-sets-dir=dir_name

安裝字符集的目錄。

  • --check, -c

檢查表格是否有錯誤。 這是默認操作。

  • --check-only-changed, -C

只檢查自上次檢查後已更改或尚未正確關閉的表格。

  • --check-upgrade, -g

使用FOR UPGRADE選項調用CHECK TABLE以檢查表與當前版本的伺服器不兼容。 該選項自動啟用--fix-db-names和--fix-tablenames選項。

  • --compress

壓縮客戶端和伺服器之間發送的所有信息(如果兩者都支持壓縮)。

  • --database,-B

處理命名資料庫中的所有表。 通常,mysqlcheck將命令行中的名字參數視為資料庫名稱,以及任何以下名稱作為表名稱。 使用此選項,它將所有名稱參數視為資料庫名稱。

此選項可用於轉儲INFORMATION_SCHEMA和performace_schema資料庫,即使使用-all-databases選項,通常也不會轉儲這些資料庫。 (也可以使用--skip-locktables選項。)

  • --extended, -e

如果您使用此選項來檢查表格,它確保它們是100%一致的但需要很長時間。

如果您使用此選項來修復表,它將運行一個擴展的修復,不僅可能需要很長時間才能執行,還可能產生大量的垃圾行!

  • --fast,-F

只檢查沒有正確關閉的表格

  • --fix-db-names

將資料庫名稱轉換為5.1格式。 只有包含特殊字元的資料庫名稱會受到影響。

這個選項在MySQL 5.7.6中不推薦使用,並且會在未來版本的MySQL中被刪除。 如果有必要轉換MySQL 5.0資料庫或表名,解決方法是在升級到更新版本之前將MySQL 5.0安裝升級到MySQL 5.1。

  • --fix-table-name

將表格名稱轉換為5.1格式。 只有包含特殊字元的表名會受到影響。 這個選項也適用於視圖。

這個選項在MySQL 5.7.6中不推薦使用,並且會在未來版本的MySQL中被刪除。 如果有必要轉換MySQL 5.0資料庫或表名,解決方法是在升級到更新版本之前將MySQL 5.0安裝升級到MySQL 5.1。

  • --force,-f

繼續即使發生SQL錯誤。

  • --host=host_name, -h host_name

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

  • --medium-check, -m

做一個比--extended操作快的檢查。 這隻能找到所有錯誤的99.99%,在大多數情況下應該足夠好。

  • --no-defaults

不要讀取任何選項文件。 如果由於從選項文件中讀取未知選項而導致程序啟動失敗,可以使用no-defaults來防止它們被讀取

例外是.mylogin.cnf文件(如果存在)在所有情況下都被讀取。 即使在使用--no-defaults的情況下,這也允許以比命令行更安全的方式指定密碼。

  • --optimize, -o

優化表。

  • --quick,-q

如果您使用此選項檢查表,則會阻止檢查掃描行以檢查不正確的鏈接。 這是最快的檢查方法。

如果您使用此選項修復表,它只會嘗試修復索引樹。這是最快的修復方法。

  • --repair,-r

執行修復,可以修復除了唯一的唯一鍵以外的其他任何東西。

  • --silent,-s、

靜默模式,只列印錯誤消息

  • --skip-database=db_name

不要在mysqlcheck執行的操作中包含指定的資料庫(區分大小寫)。

  • --tables

覆蓋 - -database或-B選項。 選項後的所有名稱參數都被視為表名。

  • --use-frm

對於MyISAM表上的修復操作,從.frm文件獲取表結構,以便即使.MYI標頭損壞,也可以修復該表。

  • --write-binlog

這個選項是默認啟用的,所以mysqlcheck生成的ANALYZE TABLE,OPTIMIZE TABLE和REPAIR TABLE語句被寫入二進位日誌。 使用--skip-write-binlog將NO_WRITE_TO_BINLOG添加到語句中,以便它們不被記錄。 如果這些語句不應發送到複製從伺服器,或者在使用二進位日誌從備份進行恢復時運行,請使用--skip-write-binlog。

4.mysqldump --一個資料庫備份程序

mysqldump客戶端實用程序執行邏輯備份,生成一組SQL語句,可以執行該語句來重現原始資料庫對象定義和表數據。 它轉儲一個或多個MySQL資料庫以備份或傳輸到另一個SQL伺服器。 mysqldump命令還可以以CSV,其他分隔文本或XML格式生成輸出。

如果不使用--single-transaction選項,mysqldump至少需要轉儲表的SELECT許可權,SHOW VIEW 來視圖,轉儲觸發器的TRIGGER以及LOCK TABLES許可權。某些選項可能需要其他許可權,如選項說明中所述。

要重新載入轉儲文件,您必須具有執行其所包含語句所需的許可權,例如,由這些語句創建的對象的相應CREATE許可權。

mysqldump輸出可以包含更改資料庫排序規則的ALTER DATABASE語句。 轉儲存儲的程序以保留字元編碼時可以使用這些字元。 要重新載入包含這些語句的轉儲文件,需要受影響的資料庫的ALTER許可權。

注意:

在Windows上使用PowerShell進行的具有輸出重定向的轉儲將創建一個具有UTF-16編碼的文件:

shell> mysqldump [options] > dump.sql

但是,UTF-16不允許用作連接字符集,因此轉儲文件將無法正確載入。 要解決此問題,請使用--result-file選項,該選項以ASCII格式創建輸出:

shell> mysqldump [options] --result-file=dump.sql

性能和可伸縮性注意事項

mysqldump的優點包括在恢復之前查看甚至編輯輸出的便利性和靈活性。 您可以克隆資料庫以進行開發和DBA工作,或者對現有資料庫進行輕微的變化以進行測試。 它不是作為備份大量數據的快速或可擴展的解決方案。 對於較大的數據大小,即使備份步驟需要一段合理的時間,恢複數據的速度也會很慢,因為重放SQL語句涉及用於插入的磁碟I/O,索引創建等等。

對於大規模備份和還原,物理備份更適合將數據文件以原始格式複製,以便快速恢復:

  • 如果您的表主要是InnoDB表,或者您有InnoDB和MyISAM表的組合,請考慮使用MySQL企業備份產品的mysqlbackup命令。 (作為企業訂閱的一部分提供)。它為InnoDB備份提供了最佳的性能,同時最小的中斷; 它也可以從MyISAM和其他存儲引擎備份表; 它提供了許多方便的選項來適應不同的備份方案。

mysqldump可以逐行檢索和轉儲表內容,也可以從表中檢索整個內容,並在轉儲之前將其緩存在內存中。 如果您正在傾銷大型表格,內存中的緩衝可能會成為問題。 要逐行轉儲表,請使用--quick選項(或--opt,它啟用--quick)。

--opt選項(因此--quick)默認啟用,所以要啟用內存緩衝,請使用--skip-quick。

如果您正在使用最新版本的mysqldump來生成要重新載入到非常舊的MySQL伺服器的轉儲,請使用--skip-opt選項而不是--opt或--extended-insert選項。

如果您正在使用最新版本的mysqldump來生成要重新載入到非常舊的MySQL伺服器的轉儲,請使用--skip-opt選項而不是--opt或--extended-insert選項。

有關mysqldump的其他信息

調用語法

通常有三種使用mysqldump的方法 - 為了轉儲一組一個或多個表,一組一個或多個完整的資料庫或整個MySQL伺服器,如下所示:

shell> mysqldump [options] db_name [tbl_name ...]

shell> mysqldump [options] --databases db_name ...

shell> mysqldump [options] --all-databases

要轉儲整個資料庫,請不要命名db_name之後的任何錶,或者使用--databases或--all-databases選項。

要查看您的mysqldump版本支持的選項列表,請發出命令mysqldump --help。

選項語法 - 按字母順序匯總

mysqldump支持以下選項,可以在命令行或選項文件的[mysqldump]和[client]組中指定。

mysqldump命令登錄到MySQL伺服器來提取信息。 以下選項指定如何連接到MySQL伺服器,可以在同一台機器上,也可以在遠程系統上。

--重複功能的選項 不再贅述

您還可以使用--var_name = value語法來設置以下變數:

  • max_allowed_packet

客戶端/伺服器通信的最大緩衝區大小。 默認是24MB,最大是1GB。

  • net_buffer_length

客戶端/伺服器通信的緩衝區的初始大小。 創建多行INSERT語句時(與--extended-insert或--opt選項一樣),mysqldump創建長達net_buffer_length個位元組的行。 如果你增加這個變數,確保MySQL伺服器的net_buffer_length系統變數的值至少有這麼大。

選項 - 文件選項

這些選項用於控制要讀取的選項文件。

  • --defaults-extra-file=file_name

在全局選項文件之後讀取此選項文件,但在用戶選項文件之前(在Unix上)。 如果文件不存在或無法訪問,則會發生錯誤。如果作為相對路徑名而非完整路徑名給出,則相對於當前目錄解釋文件名。

  • --defaults-file=file_name

只使用給定的選項文件。 如果文件不存在或無法訪問,則會發生錯誤。如果作為相對路徑名而非完整路徑名給出,則相對於當前目錄解釋文件名。

  • --no-defaults

不要讀取任何選項文件。 如果由於從選項文件中讀取未知選項而導致程序啟動失敗,可以使用--no-defaults來防止它們被讀取。

例外是.mylogin.cnf文件(如果存在)在所有情況下都被讀取。 即使在使用--no-defaults的情況下,這也允許以比命令行更安全的方式指定密碼。 (.mylogin.cnf由mysql_config_editor實用程序創建。

DDL 選項

mysqldump的使用場景包括設置一個全新的MySQL實例(包括資料庫表),並用現有的資料庫和表替換現有實例中的數據。 通過以下選項,可以指定在還原轉儲時通過在轉儲文件中編碼各種DDL語句來拆除和設置哪些內容。

  • --add-drop-database

在每個CREATE DATABASE語句前寫一個DROP DATABASE語句。 此選項通常與--all-databases或--databases選項結合使用,因為除非指定了其中一個選項,否則不會寫入CREATE DATABASE語句。

  • --add-drop-table

在每個CREATE TABLE語句之前寫一個DROP TABLE語句。

  • --all-tablespaces, -Y

向錶轉儲添加創建NDB表使用的任何錶空間所需的所有SQL語句。 這些信息不包括在mysqldump的輸出中。 這個選項目前僅與MySQL Cluster表相關,MySQL表不支持MySQL 5.7。

  • --no-create-db, -n

如果給出--databases或--all-databases選項,則禁止輸出中包含的CREATE DATABASE語句。

注意:

此選項不排除從mysqldump輸出創建日誌文件組或表空間的語句; 但是,您可以使用--no-tablespaces選項來達到此目的。

  • --no-tablespaces, -y

該選項禁止mysqldump輸出中的所有CREATE LOGFILE GROUP和CREATE TABLESPACE語句。

  • --replace

編寫REPLACE語句而不是INSERT語句。

Debug選項

以下選項可以列印調試信息,將轉儲文件中的調試信息進行編碼,或者不管潛在的問題如何執行轉儲操作。

  • --allow-keywords

允許創建作為關鍵字的列名稱。 這通過在每個列名前加上表名來工作。

  • --comments, -i

在轉儲文件中寫入附加信息,如程序版本,伺服器版本和主機。 該選項默認啟用。 要禁止這些附加信息,請使用--skip-comments。

  • --dump-date

如果給出了--comments選項,mysqldump在下面的表單的轉儲結尾處產生一個注釋:

-- Dump completed on DATE

但是,日期會導致在不同時間採集的轉儲文件看起來不同,即使數據是相同的。 --dump-date和--skip-dump-date控制項是否將日期添加到注釋中。 預設值是--dump-date(在注釋中包含日期)。 --skip-dump-date禁止日期列印。

  • --force,-f

忽略所有錯誤; 即使在錶轉儲過程中發生SQL錯誤也會繼續。

此選項的一個用途是使mysqldump繼續執行,即使它遇到無效的視圖,因為定義引用了已經被刪除的表。 沒有--force,mysqldump退出並顯示錯誤信息。 使用--force,mysqldump列印錯誤消息,但是它也將包含視圖定義的SQL注釋寫入轉儲輸出並繼續執行。

如果還指定了--ignore-error選項來忽略特定的錯誤,則--force優先。

  • --log-error=file_name

通過將警告和錯誤附加到指定的文件來記錄警告和錯誤。 默認是不做記錄。

  • --skip-comments

請參閱--comments選項的說明。

複製選項

mysqldump命令經常用於在複製配置中的從伺服器上創建空實例或包含數據的實例。 以下選項適用於在複製主伺服器和從伺服器上轉儲和恢複數據。

  • --apply-slave-statements

對於使用--dump-slave選項生成的從屬轉儲,請在CHANGE MASTER TO語句之前添加STOP SLAVE語句,並在輸出結尾處添加START SLAVE語句。

  • --delete-master-logs

在主複製伺服器上,執行轉儲操作後,通過向伺服器發送PURGE BINARY LOGS語句來刪除二進位日誌。此選項會自動啟用--master-data。

  • --dump-slave[=value]

此選項與--master-data類似,不同之處在於它用於轉儲複製salve伺服器以生成轉儲文件,該轉儲文件可用於將另一台伺服器設置為與轉儲伺服器具有相同主伺服器的從伺服器。 它會導致轉儲輸出包含一個CHANGE MASTER TO語句,該語句指示被轉儲的從屬主文件的二進位日誌坐標(文件名和位置)。CHANGE MASTER TO語句從SHOW SLAVE STATUS輸出讀 Relay_Master_Log_File和Exec_Master_Log_Pos的值,並分別將它們用於MASTER_LOG_FILE和MASTER_LOG_POS。 這些是主機應從其開始複製的主伺服器坐標。

注意:

來自中繼日誌的已經執行的事務序列中的不一致可能導致錯誤的位置被使用。

--dump-slave將使用主伺服器的坐標而不是轉儲伺服器的坐標,就像--master-data選項所做的那樣。 此外,指定此選項會導致--master-data選項被覆蓋(如果使用),並被有效地忽略。

警告:

如果將要應用轉儲的伺服器使用gtid_mode = ON和MASTER_AUTOPOSITION = 1,則不應使用此選項。

選項值的處理方式與--master-data相同(設置為no或1會導致將CHANGE MASTER TO語句寫入轉儲,設置2會導致語句被寫入但被SQL注釋封裝) 在啟用或禁用其他選項以及如何處理鎖定方面,與--master-data具有相同的效果。

此選項會導致mysqldump在轉儲之前停止從屬SQL線程,並在之後重新啟動。

結合使用--dump-slave,也可以使用--apply-slave-statements和--include-masterhost-port選項。

  • --include-master-host-port

對於使用--dump-slave選項生成的從站轉儲中的CHANGE MASTER TO語句,請添加MASTER_HOST和MASTER_PORT選項以指定從站主站的主機名和TCP/IP埠號。

  • --master-data[=value]

使用此選項轉儲主複製伺服器以生成可用於將另一台伺服器設置為主伺服器的轉儲文件。 它會導致轉儲輸出包含CHANGE MASTER TO語句,該語句指示轉儲的伺服器的二進位日誌坐標(文件名和位置)。 這些是主站伺服器的坐標,在將轉儲文件載入到從站後,從站應該從該站點開始複製。

如果選項值為2,則CHANGE MASTER TO語句將被寫為SQL注釋,因此僅供參考。 轉儲文件重新載入時不起作用。 如果選項值為1,則語句不會寫為注釋,並且在重新載入轉儲文件時生效。 如果未指定選項值,則默認值為1。

此選項需要RELOAD許可權,並且必須啟用二進位日誌。

--master-data選項會自動關閉--lock-tables。 它也打開了--lockall-tables,除非--single-transaction也被指定,在這種情況下,在轉儲開始的時候只有短時間獲得全局讀鎖(參見--singletransaction的描述) 。在所有情況下,日誌上的任何操作都會在轉儲的確切時刻發生。

也可以通過使用--dump-slave選項來卸載master的現有slave來設置一個slave,如果同時使用了這兩個選項,它將覆蓋--master-data並使其被忽略。

  • --set-gtid-purged=value

此選項通過指示是否將SET @@global.gtid_purged語句添加到輸出來控制寫入轉儲文件的全局事務ID(GTID)信息。 此選項也可能會導致將語句寫入輸出,以便在重新載入轉儲文件時禁用二進位日誌記錄。

下表顯示了允許的選項值。 默認值是AUTO。

OFF 不向輸出添加SET語句。

ON 將SET語句添加到輸出。 如果伺服器上未啟用GTID,則會發生錯誤

AUTO 如果在伺服器上啟用了GTID,則將SET語句添加到輸出。

轉儲文件重新載入時,--set-gtid-purged選項對二進位日誌記錄具有以下作用:

?--set-gtid-purged=OFF:SET @@ SESSION.SQL_LOG_BIN = 0; 沒有被添加到輸出。

?--set-gtid-purged=ON:SET @@ SESSION.SQL_LOG_BIN = 0; 被添加到輸出。

?--set-gtid-purged=AUTO:SET @@ SESSION.SQL_LOG_BIN = 0; 被添加到輸出,如果GTIDs

在您正在備份的伺服器上啟用(即,如果AUTO評估為ON)。

格式化選項

以下選項指定如何表示轉儲文件中的整個轉儲文件或某些類型的數據。它們還控制是否將某些可選信息寫入轉儲文件。

  • --compact

產生更緊湊的輸出。 該選項啟用--skip-add-drop-table,--skip-addlocks,--skip-comments,--skip-disable-keys和--skip-set-charset選項。

  • --compatible=name

生成與其他資料庫系統或舊版MySQL伺服器更兼容的輸出。 name的值可以是ansi,mysql323,mysql40,postgresql,oracle,mssql,db2,maxdb,no_key_options,no_table_options或no_field_options。 要使用多個值,請用逗號分隔它們。 這些值與設置伺服器SQL模式的相應選項具有相同的含義。

該選項不保證與其他伺服器的兼容性。 它僅啟用當前可用於使轉儲輸出更兼容的SQL模式值。 例如,--compatible = oracle不會將數據類型映射到Oracle類型或使用Oracle注釋語法。

該選項需要4.1.0或更高版本的伺服器版本。 對於較舊的伺服器,它什麼都不做。

  • --complete-insert, -c

使用包含列名稱的完整INSERT語句。

  • --create-options

在CREATE TABLE語句中包含所有MySQL特定的表選項。

  • --fields-terminated-by=..., --fields-enclosed-by=..., --fields-optionallyenclosed-by=..., --fields-escaped-by=...

這些選項與--tab選項一起使用,具有與LOAD DATA INFILE的相應FIELDS子句相同的含義。

  • --hex-blob

使用十六進位符號轉儲二進位列(例如,「abc」變為0x616263)。 受影響的數據類型是BINARY,VARBINARY,BLOB類型和BIT。

  • --lines-terminated-by=...

此選項與--tab選項一起使用,與LOAD DATA INFILE的相應LINES子句具有相同的含義。

  • --quote-names, -Q

引用「`」字元中的標識符(如資料庫,表和列名稱)。 如果啟用了ANSI_QUOTES SQL模式,標識符將在"""字元中引用,默認情況下啟用該選項,可以使用--skip-quote-names來禁用該選項,但是應該在任何選項 兼容,可能會啟用--quote名稱。

  • --result-file=file_name, -r file_name

直接輸出到指定的文件。 即使生成轉儲時發生錯誤,也會創建結果文件並覆蓋其之前的內容。

應該在Windows上使用此選項來防止換行符「
」字元被轉換為「
」回車/換行符序列。

  • --tab=dir_name, -T dir_name

生成製表符分隔的文本格式的數據文件。 對於每個轉儲表,mysqldump創建一個tbl_name.sql文件,其中包含創建該表的CREATE TABLE語句,伺服器將寫入一個包含其數據的tbl_name.txt文件。 選項值是寫入文件的目錄。

注意:

只有當mysqldump在與mysqld伺服器相同的機器上運行時,才應使用此選項。 您必須具有FILE許可權,並且伺服器必須有權在您指定的目錄中寫入文件。

默認情況下,.txt數據文件使用列值和每行末尾的換行符之間的製表符來格式化。 可以使用--fields-xxx和--linesterminated-by選項明確指定格式。

列值被轉換為由--default-character-set選項指定的字符集。

  • --tz-utc

此選項使TIMESTAMP列在不同時區的伺服器之間轉儲和重新載入。 mysqldump將其連接時區設置為UTC,並將SET TIME_ZONE =+ 00:00添加到轉儲文件。 如果沒有此選項,TIMESTAMP列將在源伺服器和目標伺服器本地的時區中轉儲並重新載入,如果伺服器位於不同的時區,則可能導致值發生更改。 --tz-utc還可以防止由於夏令時導致的更改。 --tz-utc是默認啟用的。 要禁用它,請使用--skip-tz-utc。

  • --xml,-X

將轉儲輸出寫成格式良好的XML。

NULL,「NULL」和空值:對於名為column_name的列,NULL值,空字元串和字元串值「NULL」在由此選項生成的輸出中相互區分,如下所示。

來自mysqldump的XML輸出包括XML名稱空間,如下所示:

shell> mysqldump --xml -u root world City

<?xml version="1.0"?>

<mysqldump xmlns:xsi="w3.org/2001/XMLSchema-i">

<database name="world">

<table_structure name="City">

<field Field="ID" Type="int(11)" Null="NO" Key="PRI" Extra="auto_increment" />

<field Field="Name" Type="char(35)" Null="NO" Key="" Default="" Extra="" />

<field Field="CountryCode" Type="char(3)" Null="NO" Key="" Default="" Extra="" />

<field Field="District" Type="char(20)" Null="NO" Key="" Default="" Extra="" />

<field Field="Population" Type="int(11)" Null="NO" Key="" Default="0" Extra="" />

<key Table="City" Non_unique="0" Key_name="PRIMARY" Seq_in_index="1" Column_name="ID"

Collation="A" Cardinality="4079" Null="" Index_type="BTREE" Comment="" />

<options Name="City" Engine="MyISAM" Version="10" Row_format="Fixed" Rows="4079"

Avg_row_length="67" Data_length="273293" Max_data_length="18858823439613951"

Index_length="43008" Data_free="0" Auto_increment="4080"

Create_time="2007-03-31 01:47:01" Update_time="2007-03-31 01:47:02"

Collation="latin1_swedish_ci" Create_options="" Comment="" />

</table_structure>

<table_data name="City">

<row>

<field name="ID">1</field>

<field name="Name">Kabul</field>

<field name="CountryCode">AFG</field>

<field name="District">Kabol</field>

<field name="Population">1780000</field>

</row>

...

<row>

<field name="ID">4079</field>

<field name="Name">Rafah</field>

<field name="CountryCode">PSE</field>

<field name="District">Rafah</field>

<field name="Population">92020</field>

</row>

</table_data>

</database>

</mysqldump>

過濾選項:

以下選項控制將哪種模式對象寫入轉儲文件:按類別(如觸發器或事件) 通過名稱,例如,選擇要轉儲的資料庫和表; 或者甚至使用WHERE子句從表數據中過濾行。

  • --all-databases, -A

轉儲所有資料庫中的所有表。 這與使用--databases選項並命名命令行上的所有資料庫相同。

  • --databases, -B

轉儲幾個資料庫。 通常,mysqldump將命令行上的名字參數視為資料庫名稱,後面的名稱作為表名稱。 使用此選項,它將所有名稱參數視為資料庫名稱.CREATE DATABASE和USE語句包含在每個新資料庫之前的輸出中。

  • --events, -E

在輸出中包含轉儲的資料庫的事件調度程序事件。 該選項需要這些資料庫的EVENT許可權。

使用--events生成的輸出包含CREATE EVENT語句來創建事件。但是,這些語句不包括事件創建和修改時間戳等屬性,所以當事件重新載入時,它們的創建時間戳等於重載 時間。

如果您需要使用原始時間戳屬性創建事件,則不要使用--events。而是使用具有mysql資料庫相應許可權的MySQL帳戶直接轉儲並重新載入mysql.event表的內容。

  • --ignore-error=error[,error]...

忽略指定的錯誤。 選項值是以逗號分隔的錯誤編號列表,指定在執行mysqldump期間要忽略的錯誤。 如果還給出--force選項忽略所有錯誤,--force優先。

這個選項是在MySQL 5.7.1中添加的。

  • --ignore-table=db_name.tbl_name

不要轉儲給定的表,它必須使用資料庫和表名來指定。 要忽略多個表,請多次使用此選項。 這個選項也可以用來忽略視圖。

  • --no-data, -d

不要寫任何錶行信息(即不轉儲表內容)。如果要只轉儲表的CREATE TABLE語句(例如,通過載入轉儲來創建表的空副本 文件)。

  • --routines, -R

在輸出中包含轉儲資料庫的存儲常式(過程和函數)。 使用這個選項需要mysql.proc表的SELECT許可權。

使用 --routines生成的輸出包含CREATE PROCEDURE和CREATE FUNCTION語句來創建常式。 但是,這些語句不包括諸如常式創建和修改時間戳之類的屬性,所以當常式重新載入時,它們的創建時間戳等於重新載入時間

如果需要使用原始時間戳記屬性創建常式,請不要使用 - 常式。相反,使用具有mysql資料庫相應許可權的MySQL帳戶,直接轉儲並重新載入mysql.proc表的內容。

  • --tables

覆蓋 --database或-B選項。 mysqldump將選項後面的所有名稱參數視為表名。

  • --triggers

在輸出中包含每個轉儲表的觸發器。 這個選項是默認啟用的; 用--skip-triggers禁用它。

在MySQL 5.7.2之前,一個表不能有多個具有相同觸發事件組合(INSERT,UPDATE,DELETE)和動作時間(BEFORE,AFTER)的觸發器。 MySQL 5.7.2解除了這個限制,允許多個觸發器。 mysqldump以激活順序轉儲觸發器,以便在重新載入轉儲文件時,以相同的激活順序創建觸發器。但是,如果mysqldump轉儲文件包含具有相同觸發事件和操作時間的表的多個觸發器,則會發生錯誤 嘗試將轉儲文件載入到不支持多個觸發器的舊伺服器。

  • --where=where_condition, -w where_condition

僅轉儲給定的WHERE條件所選的行。 如果條件中包含空格或其他字元(對於命令解釋程序來說是特殊的),則必須引用該條件。

性能選項:

以下選項與恢復操作的性能最為相關。 對於大型數據集,恢復操作(處理轉儲文件中的INSERT語句)是最耗時的部分。 在急需恢複數據時,提前計劃和測試該階段的性能。 對於以小時計量的還原時間,您可能更喜歡備用和還原解決方案,例如用於InnoDB的MySQL Enterprise Backup和混合使用的資料庫。

  • --disable-keys, -K

對於每個表,使用/ *!圍繞INSERT語句40000 ALTER TABLE tbl_name DISABLE KEYS * /; 和/ *!40000 ALTER TABLE tbl_name ENABLE KEYS * /;聲明。 這使得載入轉儲文件的速度更快,因為索引是在插入所有行之後創建的。 此選項僅對MyISAM表的非唯一索引有效。

  • --extended-insert, -e

使用包含多個VALUES列表的多行語法編寫INSERT語句。 這會導致更小的轉儲文件,並在重新載入文件時加快插入速度。

  • --insert-ignore

編寫INSERT IGNORE語句而不是INSERT語句。

  • --opt

默認情況下啟用此選項是--add-drop-table --add-locks

--create-options --disable-keys --extended-insert --lock-tables --quick --setcharset

組合的縮寫 它提供了一個快速的轉儲操作,並生成一個可以快速重新載入到MySQL伺服器的轉儲文件。

由於默認情況下啟用了--opt選項,因此只能指定其相反的選項,而使用--skip-opt關閉幾個默認設置。 有關選擇性啟用或禁用受--opt影響的選項子集的信息,請參閱mysqldump選項組的討論。

  • --quick,-q

此選項對於轉儲大型表格非常有用。 它迫使mysqldump每次從一行伺服器中檢索表的行,而不是在寫出之前檢索整個行集並將其緩存在內存中。

  • --skip-opt

請參閱--opt選項的說明。

事物 選項

以下選項會對轉儲操作的性能與導出數據的可靠性和一致性進行權衡。

  • --add-locks

用LOCK TABLES和UNLOCK TABLES語句環繞每個錶轉儲。 這將導致轉儲文件重新載入時更快的插入

  • --flush-logs, -F

在開始轉儲之前刷新MySQL伺服器日誌文件。 此選項需要RELOAD許可權。如果將此選項與--all-databases選項結合使用,則會為每個轉儲的資料庫刷新日誌。 使用--lock-all-tables,--master-data或者-single-transaction時例外:在這種情況下,日誌只刷新一次,對應於所有表被鎖定的時刻。 如果您希望轉儲和日誌刷新恰好在同一時刻發生,則應同時使用--flush-logs和--lock-all-tables,--master-data或--singletransaction。

  • --flush-privileges

轉儲mysql資料庫後,將FLUSH PRIVILEGES語句添加到轉儲輸出。 這個選項應該在轉儲包含mysql資料庫和依賴於mysql資料庫中的數據的任何其他資料庫進行正確的還原時使用。

注意:

對於從舊版本升級到MySQL 5.7.2或更高版本,請勿使用--flush-privileges。

  • --lock-all-tables, -x

鎖定所有資料庫的所有表。 這是通過獲取整個轉儲期間的全局讀鎖來實現的。 該選項自動關閉--single-transaction and --lock-tables.

  • --lock-tables, -l

對於每個轉儲的資料庫,在轉儲它們之前鎖定要轉儲的所有表。使用READ LOCAL鎖定表以允許在MyISAM表中同時插入。 對於諸如InnoDB之類的事務表,--single-transaction比-lock-tables更好,因為它根本不需要鎖表。

因為--lock-tables分別為每個資料庫鎖定表,所以此選項不保證轉儲文件中的表在邏輯上在資料庫之間一致。 不同資料庫中的表可能以完全不同的狀態傾倒。

某些選項(如--opt)會自動啟用 --lock-tables。 如果要覆蓋此選項,請使用選項列表末尾的 --skip-lock-tables。

  • --no-autocommit

將SET autocommit = 0和COMMIT語句中的每個轉儲表的INSERT語句括起來。

  • --order-by-primary

如果存在這樣的索引,那麼轉儲每個表的行,按照它的主鍵排序,或者按照它的第一個唯一索引排序。當將一個MyISAM錶轉儲到InnoDB表中時,這非常有用,但是使轉儲操作花費相當長的時間。

  • --shared-memory-base-name=name

在Windows上,使用共享內存名稱,用於使用共享內存連接到本地伺服器。 默認值是MYSQL。 共享內存名稱區分大小寫。

必須使用--shared-memory選項啟動伺服器以啟用共享內存連接。

  • --single-transaction

此選項將事務隔離模式設置為REPEATABLE READ,並在轉儲數據之前將START TRANSACTION SQL語句發送到伺服器。 它僅適用於諸如InnoDB之類的事務表,因為那樣在發出START TRANSACTION時不會阻塞任何應用程序就會轉儲資料庫的一致性狀態。

使用這個選項時,你應該記住,只有InnoDB表被轉儲為一致的狀態。 例如,在使用此選項時轉儲的任何MyISAM或MEMORY表可能仍然會改變狀態。

當--single-transaction轉儲正在進行時,為了確保一個有效的轉儲文件(正確的表內容和二進位日誌坐標),沒有其他連接應該使用以下語句:ALTER TABLE,CREATE TABLE,DROP TABLE,RENAME TABLE,TRUNCATE 表.一致的讀取不是與這些語句分離的,所以在轉儲的表上使用它們會導致由mysqldump執行的SELECT檢索表內容以獲取不正確的內容或失敗。

--single-transaction選項和--lock-tables選項是相互排斥的,因為LOCK TABLES會導致任何掛起的事務被隱式提交。

要轉儲大型表,請將--single-transaction選項與--quick選項結合使用。

選項組

  • --opt選項打開幾個一起工作的設置來執行快速轉儲操作。 所有這些設置都是默認打開的,因為--opt默認是打開的。 因此,您很少指定--opt。相反,您可以通過指定--skip-opt將這些設置作為一個組關閉,可以通過在命令行中稍後指定相關選項來重新啟用某些設置。
  • --compact選項會關閉幾個設置,以控制可選語句和注釋是否出現在輸出中。 再次,您可以使用其他選項重新啟用某些設置,或者使用--skip-compact窗體打開所有設置。

當您選擇性地啟用或禁用組選項的效果時,順序非常重要,因為選項首先被處理。 例如,--disable-keys --lock-tables --skip-opt不會有預期的效果; 它本身與--skip-opt相同。

例子:

要對整個資料庫進行備份:

shell> mysqldump db_name > backup-file.sql

將轉儲文件載入回伺服器:

shell> mysql db_name < backup-file.sql

重新載入轉儲文件的另一種方法:

shell> mysql -e "source /path-to-backup/backup-file.sql" db_name

通過將數據從一台MySQL伺服器複製到另一台伺服器,mysqldump對填充資料庫也非常有用:

shell> mysqldump --opt db_name | mysql --host=remote_host -C db_name

您可以使用一個命令來轉儲多個資料庫:

shell> mysqldump --databases db_name1 [db_name2 ...] > my_databases.sql

要轉儲所有資料庫,請使用--all-databases選項:

shell> mysqldump --all-databases > all_databases.sql

對於InnoDB表,mysqldump提供了一種在線備份方式:

shell> mysqldump --all-databases --master-data --single-transaction > all_databases.sql

此備份在轉儲的開始處獲取所有表上的全局讀鎖(使用FLUSH TABLES WITH READ LOCK)。 只要這個鎖被獲取,二進位日誌坐標被讀取。一旦獲得這個鎖,就讀取二進位日誌坐標並釋放鎖。 如果在發出FLUSH語句時長時間更新語句正在運行,那麼MySQL伺服器可能會被暫停,直到這些語句完成。 之後,轉儲變為鎖定狀態,不會干擾讀取和寫入表格。 如果MySQL伺服器收到的更新語句很短(就執行時間而言),即使進行了許多更新,初始鎖定期也不應該引起注意。

對於時間點恢復(也稱為「前滾」,當您需要恢復舊備份並重播自備份以來發生的更改時),旋轉二進位日誌通常很有用(見第5.2節)。 4,「二進位日誌」)或者至少知道轉儲對應的二進位日誌坐標:

shell> mysqldump --all-databases --master-data=2 > all_databases.sql

OR

shell> mysqldump --all-databases --flush-logs --master-data=2 > all_databases.sql

可以同時使用--master-data和--single-transaction選項,如果表使用InnoDB存儲引擎進行存儲,則提供了一種方便的方法,使在線備份適合在時間點恢復之前使用。

  • 要選擇除了某些功能之外的--opt的效果,請為每個功能使用--skip選項。 要禁用擴展插入和內存緩衝,請使用--opt --skip-extended-insert --skipquick(實際上,--skip-extended-insert --skip-quick已經足夠,因為默認情況下是--opt)。
  • 要反轉 --opt 除索引禁用和表鎖定之外的所有功能,請使用--skip-opt --disable-keys --lock-tables。

限制

mysqldump默認情況下不會轉儲INFORMATION_SCHEMA,performance_schema或(從MySQL 5.7.8開始)sys模式。 要轉儲其中的任何一個,請在命令行中明確指定它們。 你也可以用--databases選項來命名它們。 對於INFORMATION_SCHEMA和performance_schema,也可以使用--skip-lock-tables選項。

不建議從使用mysqldump創建的轉儲恢復到啟用了GTID的MySQL 5.6.9或更早版本的伺服器。

mysqldump包含用於重新創建mysql資料庫轉儲的general_log和slow_query_log表的語句。 日誌表內容不會被轉儲。

4.5.5 mysqlimport 資料庫導入程序

mysqlimport客戶端為LOAD DATA INFILE SQL語句提供了一個命令行界面。 mysqlimport的大多數選項直接對應於LOAD DATA INFILE語法的子句。

像這樣調用 mysqlimport

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

對於在命令行上命名的每個文本文件,mysqlimport將從文件名剝離任何擴展名,並使用結果來確定導入文件內容的表的名稱。 例如,名為patient.txt,patient.text和patient的文件都將被導入到名為patient的表中。

mysqlimport支持以下選項,可以在命令行或選項文件的[mysqlimport]和[client]組中指定。

詳細的參數使用略:

參考

4.5.5 mysqlimport - A Data Import Programdev.mysql.com

4.5.6 mysqlpump 資料庫備份程序

mysqlpump客戶端實用程序執行邏輯備份,生成一組可執行的SQL語句以重現原始資料庫對象定義和表數據。 它會轉儲一個或多個MySQL資料庫以備份或傳輸到另一台SQL伺服器。

mysqlpump的特性包括:

  • 並行處理資料庫和資料庫中的對象,以加速轉儲過程
  • 更好地控制轉儲哪些資料庫和資料庫對象(表,存儲程序,用戶帳戶)
  • 將用戶帳戶轉儲為帳戶管理語句(CREATE USER,GRANT)而不是插入到mysql系統資料庫中
  • 能夠創建壓縮輸出
  • 進度指標(值是估計值)
  • 對於轉儲文件重新載入,通過在插入行之後添加索引來為InnoDB表創建更快的二級索引

注意:

mysqlpump被添加到MySQL 5.7.8中。 它使用最新的MySQL特性,因此假定至少與mysqlpump本身一樣版本的伺服器。

如果不使用--single-transaction選項,mysqlpump至少需要轉儲表的SELECT許可權,轉儲視圖的SHOW VIEW,轉儲觸發器的TRIGGER和LOCK TABLES。 轉儲用戶定義需要mysql系統資料庫上的SELECT許可權。 某些選項可能需要其他許可權,如選項說明中所述。

要重新載入轉儲文件,您必須具有執行其包含的語句所需的特權,例如由這些語句創建的對象的適當CREATE特權。

注意:

在Windows上使用PowerShell進行的具有輸出重定向的轉儲會創建一個具有UTF-16編碼的文件:

shell> mysqlpump [options] > dump.sql

但是,UTF-16不允許作為連接字符集(請參見第10.4節「連接字符集和歸類」),因此轉儲文件將無法正確載入。 要解決此問題,請使用--result-file選項,該選項以ASCII格式創建輸出:

shell> mysqlpump [options] --result-file=dump.sql

mysqlpump 調用 語法

默認情況下,mysqlpump轉儲所有資料庫(在mysqlpump限制中記錄了某些例外情況)。 要明確指定此行為,請使用--all-databases選項:

shell> mysqlpump --all-databases

要轉儲單個資料庫或該資料庫中的某些表,請在命令行上命名資料庫,並選擇後跟表名:

shell> mysqlpump db_name

shell> mysqlpump db_name tbl_name1 tbl_name2 ...

要將所有名稱參數視為資料庫名稱,請使用--databases選項:

shell> mysqlpump --databases db_name1 db_name2 ...

默認情況下,即使轉儲包含授權表的mysql系統資料庫,mysqlpump也不會轉儲用戶定義。 要以CREATE USER和GRANT語句的形式將授權表內容轉儲為邏輯定義,請使用--users選項並禁止所有資料庫轉儲:

shell> mysqlpump --exclude-databases=% --users

在前面的命令中,%是一個匹配--exclude-databases選項的所有資料庫名稱的通配符。

mysqlpump支持包含或排除資料庫,表,存儲程序和用戶定義的幾個選項。

要重新載入轉儲文件,請執行它包含的語句。 例如,使用mysql客戶端:

shell> mysqlpump [options] > dump.sql

shell> mysql < dump.sql

要查看mysqlpump支持的選項列表,請發出命令mysqlpump --help。

--具體選項參數,可以參考:

dev.mysql.com/doc/refma

mysqlpump 並行過程

mysqlpump可以使用並行性來實現並發處理。 您可以選擇資料庫之間的並發(同時轉儲多個資料庫)和資料庫內(同時從給定資料庫轉儲多個對象)。

默認情況下,mysqlpump用兩個線程設置一個隊列。 您可以創建更多隊列並控制分配給每個隊列的線程數,包括默認隊列:

  • --default-parallelism = N指定用於每個隊列的默認線程數。 在沒有這個選項的情況下,N是2。

默認隊列始終使用默認的線程數。 除非另有指定,否則其他隊列使用默認的線程數。

  • --parallel-schemas=[N:]db_list

設置一個處理隊列用於轉儲db_list中指定的資料庫,並可選擇指定隊列使用多少個線程。 db_list是逗號分隔的資料庫名稱列表。 如果選項參數以N:開頭,則隊列使用N個線程。 否則,--default-parallelism選項確定隊列線程的數量。

--parallel-schemas選項的多個實例創建多個隊列。

mysqlpump使用默認隊列處理任何未使用--parallel-schemas選項顯式指定的資料庫,並在命令選項選擇它們時轉儲用戶定義。

通常,對於多個隊列,mysqlpump使用隊列處理的資料庫集之間的並行性來同時轉儲多個資料庫。 對於使用多個線程的隊列,mysqlpump使用資料庫內的並行性來同時從給定資料庫中轉儲多個對象。 可能會發生異常; 例如,mysqlpump可能會在從伺服器獲取資料庫中的對象列表時阻塞隊列。

如果啟用並行性,則可能會交錯處理來自不同資料庫的輸出。 例如,並行轉儲的多個表中的INSERT語句可以交錯使用; 這些語句不是以任何特定順序書寫的。 這不會影響重新載入,因為輸出語句使用資料庫名稱限定對象名稱,或根據需要在USE語句之前。

並行度的粒度是單個資料庫對象。 例如,不能使用多個線程並行轉儲單個表。

例子:

shell> mysqlpump --parallel-schemas=db1,db2 --parallel-schemas=db3

mysqlpump設置一個隊列來處理db1和db2,另一個隊列處理db3,以及一個默認隊列來處理所有其他資料庫。 所有隊列使用兩個線程。

shell> mysqlpump --parallel-schemas=db1,db2 --parallel-schemas=db3 --default-parallelism=4

除了所有隊列使用四個線程之外,這與前面的示例相同。

shell> mysqlpump --parallel-schemas=5:db1,db2 --parallel-schemas=3:db3

db1和db2的隊列使用五個線程,db3的隊列使用三個線程,而默認隊列使用兩個線程的默認隊列。

作為特殊情況,使用--default-parallelism = 0和no -parallel-schemas選項,mysqlpump作為單線程進程運行並且不創建隊列。

注意:

在MySQL 5.7.11之前,使用--single-transaction選項與並行性是互斥的。 要使用--single-transaction,通過將--default-parallelism設置為0而不使用--parallel-schemas的任何實例來禁用並行:

Shell> mysqlpump --single-transaction --default-parallelism=0

mysqlpump 限制條件

mysqlpump默認不轉儲INFORMATION_SCHEMA,performance_schema,ndbinfo或sys模式。 要轉儲其中的任何一個,請在命令行上明確指定它們。 您也可以使用--databases或--include-databases選項來命名它們。

mysqlpump使用CREATE USER和GRANT語句以邏輯形式轉儲用戶帳戶(例如,當您使用--include-users或--users選項時)。 因此,mysql系統資料庫的轉儲默認不包含包含用戶定義的授權表:user,db,tables_priv,columns_priv,procs_priv或proxies_priv。 要轉儲任何授權表,請命名後跟表名的mysql資料庫:

shell> mysqlpump mysql user db ...

4.5.7 mysqlsh --MYSQL shell

MySQL Shell是MySQL的高級命令行客戶端和代碼編輯器。 除SQL外,MySQL Shell還為JavaScript和Python提供腳本功能。 當MySQL Shell通過X協議連接到MySQL伺服器時,X DevAPI可用於處理關係數據和文檔數據。 MySQL Shell包含AdminAPI,使您可以使用InnoDB集群。

--詳細參數參考:

dev.mysql.com/doc/refma

4.5.8 mysqlshow --顯示資料庫,表,欄位信息

mysqlshow客戶端可用於快速查看存在哪些資料庫,它們的表或表的列或索引。

mysqlshow為幾個SQL SHOW語句提供了一個命令行界面。 通過直接使用這些語句可以獲得相同的信息。 例如,你可以從mysql客戶端程序發出它們。

如下 調用 mysqlshow:

shell> mysqlshow [options] [db_name [tbl_name [col_name]]]

  • 如果沒有給出資料庫,則顯示資料庫名稱列表。
  • 如果沒有給出表,則顯示資料庫中的所有匹配表格。
  • 如果未給出列,則會顯示錶中的所有匹配列和列類型。

輸出僅顯示您擁有某些許可權的那些資料庫,表或列的名稱。

如果最後一個參數包含shell或SQL通配符(*,?,%或_),則只顯示通配符匹配的名稱。 如果資料庫名稱包含任何下劃線,則應使用反斜線(某些Unix shell需要兩個)來轉義這些內容以獲取適當的表或列的列表。 *和? 字元被轉換為SQL%和_通配符。 這可能會導致一些混淆,因為在這種情況下,mysqlshow僅顯示與該模式匹配的表名。 這很容易通過在命令行結尾上添加一個額外的%作為單獨的參數來解決。

--詳細參數參考:

dev.mysql.com/doc/refma

4.5.9 mysqlslap -- 載入模擬客戶端

mysqlslap是一個診斷程序,旨在模擬MySQL伺服器的客戶端負載並報告每個階段的時間。 它就像多個客戶端正在訪問伺服器一樣工作。

調用 mysqlslap 想這樣:

shell> mysqlslap [options]

某些選項(如--create或--query)可用於指定包含SQL語句或包含語句的文件的字元串。 如果您指定了一個文件,默認情況下它必須每行包含一條語句。 (也就是說,隱式語句分隔符是換行符。)使用--delimiter選項指定不同的分隔符,使您可以指定跨多行的語句或將多個語句放在一行中。 您不能在文件中包含評論; mysqlslap不理解他們。

mysqlslap運行分三個階段:

  1. 創建方案,表以及可選的任何存儲程序或數據以用於測試。 該階段使用單個客戶端連接。
  2. 運行負載測試。 這個階段可以使用許多客戶端連接。
  3. 清理(如果指定,斷開連接,刪除表)。 該階段使用單個客戶端連接。

例如:

提供自己的創建和查詢SQL語句,可以有50個客戶端查詢和每個客戶端200個select(在一行上輸入命令):

mysqlslap --delimiter=";" --create="CREATE TABLE a (b int);INSERT INTO a VALUES (23)" --query="SELECT * FROM a" --concurrency=50 --iterations=200

讓mysqlslap用兩個INT列和三個VARCHAR列構建查詢SQL語句。 使用五個客戶端,每個查詢20次。 不要創建表或插入數據(即使用先前測試的方案和數據):

mysqlslap --concurrency=5 --iterations=20 --number-int-cols=2 --number-char-cols=3 --auto-generate-sql

告訴程序從指定的文件中載入創建,插入和查詢SQL語句,其中create.sql文件具有多個由;分隔的表創建語句 和由;分隔的多個插入語句。 --query文件將有多個由;分隔的查詢。 運行所有載入語句,然後使用五個客戶端(每個五次)在查詢文件中運行所有查詢:

mysqlslap --concurrency=5 --iterations=5 --query=query.sql --create=create.sql --delimiter=";"

--詳細參數參考:

dev.mysql.com/doc/refma


推薦閱讀:

TAG:MySQL | MySQL入門 | MySQL必知必會書籍 |