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会将语句字符串中的\r\n转换为\n,并将\0解释为语句终止符。 –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和反斜杠写为\n,\t,\0和\\。 –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=”http://www.w3.org/2001/XMLSchema-instance“>
<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]], \r [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, \t
禁用输出复制到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 \n’Today is’\n,\nCURDATE() 到’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 doesn’t 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上使用此选项来防止换行符“\n”字符被转换为“\r\n”回车/换行符序列。
- –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=”http://www.w3.org/2001/XMLSchema-instance“>
<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 Program dev.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。
–具体选项参数,可以参考:
https://dev.mysql.com/doc/refman/5.7/en/mysqlpump.html
mysqlpump 并行过程
mysqlpump可以使用并行性来实现并发处理。 您可以选择数据库之间的并发(同时转储多个数据库)和数据库内(同时从给定数据库转储多个对象)。
默认情况下,mysqlpump用两个线程设置一个队列。 您可以创建更多队列并控制分配给每个队列的线程数,包括默认队列:
- –default-parallelism = N指定用于每个队列的默认线程数。 在没有这个选项的情况下,N是2。
默认队列始终使用默认的线程数。 除非另有指定,否则其他队列使用默认的线程数。
设置一个处理队列用于转储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集群。
–详细参数参考:
https://dev.mysql.com/doc/refman/5.7/en/mysqlsh.html
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仅显示与该模式匹配的表名。 这很容易通过在命令行结尾上添加一个额外的%作为单独的参数来解决。
–详细参数参考:
https://dev.mysql.com/doc/refman/5.7/en/mysqlshow.html
4.5.9 mysqlslap — 加载仿真客户端
mysqlslap是一个诊断程序,旨在模拟MySQL服务器的客户端负载并报告每个阶段的时间。 它就像多个客户端正在访问服务器一样工作。
调用 mysqlslap 想这样:
shell> mysqlslap [options]
某些选项(如–create或–query)可用于指定包含SQL语句或包含语句的文件的字符串。 如果您指定了一个文件,默认情况下它必须每行包含一条语句。 (也就是说,隐式语句分隔符是换行符。)使用–delimiter选项指定不同的分隔符,使您可以指定跨多行的语句或将多个语句放在一行中。 您不能在文件中包含评论; mysqlslap不理解他们。
mysqlslap运行分三个阶段:
- 创建方案,表以及可选的任何存储程序或数据以用于测试。 该阶段使用单个客户端连接。
- 运行负载测试。 这个阶段可以使用许多客户端连接。
- 清理(如果指定,断开连接,删除表)。 该阶段使用单个客户端连接。
例如:
提供自己的创建和查询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=”;”
–详细参数参考: