MySQL中文参考手册---12 MySQL实用程序
12.1 各种MySQL程序概述
所有使用mysqlclient客户库与服务器通信的MySQL客户使用下列环境变量:
名字 | 说明 |
MYSQL_UNIX_PORT | 缺省套接字;用于连接localhost |
MYSQL_TCP_PORT | 缺省 TCP/IP 端口 |
MYSQL_PWD | 缺省口令 |
MYSQL_DEBUG | 调试时调试-踪迹选项 |
TMPDIR | 临时表/文件被创建的目录 |
使用MYSQL_PWD是不安全的。见6.3 与MySQL服务器连接。
“mysql”客户使用MYSQL_HISTFILE环境变量中命名的文件来保存命令行历史,历史文件的缺省值是“$HOME/.mysql_history”,这里$HOME是HOME环境变量的值。
所有MySQL程序取许多不同的选项,然而,每个MySQL程序提供一个--help选项,你可以使用它得到程序不同选项的完整描述。例如,试一试mysql --help。
你能用一个选项文件覆盖所有的标准客户程序的缺省选项。见4.15.4 选择文件。
下表简单地描述MySQL程序:
- myisamchk
- 描述、检查、优化和修复MySQL表的使用程序。因为myisamchk有许多功能,它在其自己的章节中描述。见13 维护MySQL安装。
- make_binary_release
- 制作一个编译MySQL的一个二进制的版本。这能用FTP传送到在ftp.tcx.se网站的“/pub/mysql/Incoming”以方便其它MySQL用户。
- msql2mysql
- 一个外壳脚本,转换mSQL程序到MySQL。它不能处理所有的情况,但是当转换时,它给出一个好起点。
- mysql
- mysql是一个简单的SQL外壳(具有GNU readline 能力),它支持交互式和非交互式使用。当交互地使用时,查询结果以ASCII表的格式被表示。当非交互地使用时(例如,作为一个过滤器),结果是以定位符分隔的格式表示。(输出格式可以使用命令行选项改变)你可以简单地象这样运行脚本:
shell> mysql database < script.sql > output.tab
如果你在客户中由于内存不足造成问题,使用--quick选项!这迫使mysql使用mysql_use_result()而非mysql_store_result()来检索结果集合。
- mysqlaccess
- 一个脚本,检查对主机、用户和数据库组合的存取权限。
- mysqladmin
- 执行管理操作的实用程序,例如创建或抛弃数据库,再装载授权表,清洗表到磁盘中和再打开日志文件。mysqladmin也可以被用来从服务器检索版本,进程和状态信息。见12.2 管理一个 MySQL 服务器。
- mysqlbug
- MySQL错误报告脚本。当填写一份错误报告到MySQL邮件列表时,应该总是使用该脚本。
- mysqld
- SQL守护进程。它应该一直在运行。
- mysqldump
- 以SQL语句或定位符分隔的文本文件将一个MySQL数据库倾倒一个文件中。这是最早由Igor Romanenko编写的自由软件的增强版本。见12.3 从MySQL数据库和表倾倒结构和数据。
- mysqlimport
- 使用LOAD DATA INFILE将文本文件倒入其各自的表中。见12.4 从文本文件导入数据。
- mysqlshow
- 显示数据库,表,列和索引的信息。
- mysql_install_db
- 以缺省权限创建MySQL授权表。这通常仅被执行一次。就是在系统上第一次安装MySQL时。
- replace
- 一个实用程序,由msql2mysql使用,但是有更一般的适用性。replace改变文件中或标准输入上的字符串。使用一台有限状态机首先匹配更长的字符串,能被用来交换字符串。例如,这个命令在给定的文件中交换a和b:
shell> replace a b b a -- file1 file2 ...
- safe_mysqld
- 一个脚本,用某些更安全的特征启动mysqld守护进程,例如当一个错误发生时,重启服务器并且记载运行时刻信息到一个日志文件中。
12.2 管理一个MySQL服务器
用于执行管理性操作。语法是:
shell> mysqladmin [OPTIONS] command [command-option] command ...
通过执行mysqladmin --help,你可以得到你mysqladmin的版本所支持的一个选项列表。
目前mysqladmin支持下列命令:
create databasename | 创建一个新数据库 |
drop databasename | 删除一个数据库及其所有表 |
extended-status | 给出服务器的一个扩展状态消息 |
flush-hosts | 洗掉所有缓存的主机 |
flush-logs | 洗掉所有日志 |
flush-tables | 洗掉所有表 |
flush-privileges | 再次装载授权表(同reload) |
kill id,id,... | 杀死mysql线程 |
password | 新口令,将老口令改为新口令 |
ping | 检查mysqld是否活着 |
processlist | 显示服务其中活跃线程列表 |
reload | 重载授权表 |
refresh | 洗掉所有表并关闭和打开日志文件 |
shutdown | 关掉服务器 |
status | 给出服务器的简短状态消息 |
variables | 打印出可用变量 |
version | 得到服务器的版本信息 |
所有命令可以被缩短为其唯一的前缀。例如:
shell> mysqladmin proc stat+----+-------+-----------+----+-------------+------+-------+------+ Id User Host db Command Time State Info +----+-------+-----------+----+-------------+------+-------+------+ 6 monty localhost Processlist 0 +----+-------+-----------+----+-------------+------+-------+------+Uptime: 10077 Threads: 1 Questions: 9 Slow queries: 0 Opens: 6 Flush tables: 1 Open tables: 2 Memory in use: 1092K Max memory used: 1116K
mysqladmin status命令结果有下述列:
Uptime | MySQL服务器已经运行的秒数 |
Threads | 活跃线程(客户)的数量 |
Questions | 从mysqld启动起来自客户问题的数量 |
Slow queries | 已经超过long_query_time秒的查询数量 |
Opens | mysqld已经打开了多少表 |
Flush tables | flush ..., refresh和reload命令数量 |
Open tables | 现在被打开的表数量 |
Memory in use | 由mysqld代码直接分配的内存(只有在MySQL用--with-debug编译时可用) |
Max memory used | 由mysqld代码直接分配的最大内存(只有在MySQL用--with-debug编译时可用) |
12.3 从MySQL数据库和表中倒出结构和数据
实用程序,为备份或为把数据转移到另外的SQL服务器上倾倒一个数据库或许多数据库。倾倒将包含 创建表或充实表的SQL语句。
shell> mysqldump [OPTIONS] database [tables]
如果你不给定任何表,整个数据库将被倾倒。
通过执行mysqldump --help,你能得到你mysqldump的版本支持的选项表。
注意,如果你运行mysqldump没有--quick或--opt选项,mysqldump将在倾倒结果前装载整个结果集到内存中,如果你正在倾倒一个大的数据库,这将可能是一个问题。
mysqldump支持下列选项:
- --add-locks
- 在每个表倾倒之前增加LOCK TABLES并且之后UNLOCK TABLE。(为了使得更快地插入到MySQL)。
- --add-drop-table
- 在每个create语句之前增加一个drop table。
- --allow-keywords
- 允许创建是关键词的列名字。这由表名前缀于每个列名做到。
- -c, --complete-insert
- 使用完整的insert语句(用列名字)。
- -C, --compress
- 如果客户和服务器均支持压缩,压缩两者间所有的信息。
- --delayed
- 用INSERT DELAYED命令插入行。
- -e, --extended-insert
- 使用全新多行INSERT语法。(给出更紧缩并且更快的插入语句)
- -#, --debug[=option_string]
- 跟踪程序的使用(为了调试)。
- --help
- 显示一条帮助消息并且退出。
- --fields-terminated-by=...
- --fields-enclosed-by=...
- --fields-optionally-enclosed-by=...
- --fields-escaped-by=...
- --fields-terminated-by=...
- 这些选择与-T选择一起使用,并且有相应的LOAD DATA INFILE子句相同的含义。见7.16 LOAD DATA INFILE语法。
- -F, --flush-logs
- 在开始倾倒前,洗掉在MySQL服务器中的日志文件。
- -f, --force,
- 即使我们在一个表倾倒期间得到一个SQL错误,继续。
- -h, --host=..
- 从命名的主机上的MySQL服务器倾倒数据。缺省主机是localhost。
- -l, --lock-tables.
- 为开始倾倒锁定所有表。
- -t, --no-create-info
- 不写入表创建信息(CREATE TABLE语句)
- -d, --no-data
- 不写入表的任何行信息。如果你只想得到一个表的结构的倾倒,这是很有用的!
- --opt
- 同--quick --add-drop-table --add-locks --extended-insert --lock-tables。应该给你为读入一个MySQL服务器的尽可能最快的倾倒。
- -pyour_pass, --password[=your_pass]
- 与服务器连接时使用的口令。如果你不指定“=your_pass”部分,mysqldump需要来自终端的口令。
- -P port_num, --port=port_num
- 与一台主机连接时使用的TCP/IP端口号。(这用于连接到localhost以外的主机,因为它使用 Unix套接字。)
- -q, --quick
- 不缓冲查询,直接倾倒至stdout;使用mysql_use_result()做它。
- -S /path/to/socket, --socket=/path/to/socket
- 与localhost连接时(它是缺省主机)使用的套接字文件。
- -T, --tab=path-to-some-directory
- 对于每个给定的表,创建一个table_name.sql文件,它包含SQL CREATE 命令,和一个table_name.txt文件,它包含数据。 注意:这只有在mysqldump运行在mysqld守护进程运行的同一台机器上的时候才工作。.txt文件的格式根据--fields-xxx和--lines--xxx选项来定。
- -u user_name, --user=user_name
- 与服务器连接时,MySQL使用的用户名。缺省值是你的Unix登录名。
- -O var=option, --set-variable var=option
- 设置一个变量的值。可能的变量被列在下面。
- -v, --verbose
- 冗长模式。打印出程序所做的更多的信息。
- -V, --version
- 打印版本信息并且退出。
- -w, --where='where-condition'
- 只倾倒被选择了的记录;注意引号是强制的!
"--where=user='jimf'" "-wuserid>1" "-wuserid<1"
最常见的mysqldump使用可能制作整个数据库的一个备份:
mysqldump --opt database > backup-file.sql
但是它对用来自于一个数据库的信息充实另外一个MySQL数据库也是有用的:
mysqldump --opt database mysql --host=remote-host -C database
12.4 从文本文件导入数据
mysqlimport提供一个到LOAD DATA INFILESQL语句的命令行接口。mysqlimport的大多数选项直接对应于LOAD DATA INFILE的相同选项。见7.16 LOAD DATA INFILE语法。
mysqlimport象这样调用:
shell> mysqlimport [options] filename ...
对于在命令行上命名的每个文本文件,mysqlimport剥去文件名的扩展名并且使用它决定哪个表导入文件的内容。例如,名为“patient.txt”、“patient.text”和“patient”将全部被导入名为patient的一个表中。
mysqlimport支持下列选项:
- -C, --compress
- 如果客户和服务器均支持压缩,压缩两者之间的所有信息。
- -#, --debug[=option_string]
- 跟踪程序的使用(为调试)。
- -d, --delete
- 在导入文本文件前倒空表格。
- --fields-terminated-by=...
- --fields-enclosed-by=...
- --fields-optionally-enclosed-by=...
- --fields-escaped-by=...
- --fields-terminated-by=...
- 这些选项与对应于LOAD DATA INFILE的子句相同的含义。见7.16 LOAD DATA INFILE语法。
- -f, --force
- 忽略错误。例如,如果对于一个文本文件的一个表不存在,继续处理任何余下的文件。没有--force,如果表不存在,mysqlimport退出。
- --help
- 显示一条帮助消息并且退出。
- -h host_name, --host=host_name
- 导入数据到命名的主机上的MySQL服务器。缺省主机是localhost。
- -i, --ignore
- 见为--replace选项的描述。
- -l, --lock-tables
- 在处理任何文本文件前为写入所定所有的表。这保证所有的表在服务器上被同步。
- -L, --local
- 从客户读取输入文件。缺省地,如果你连接localhost(它是缺省主机),文本文件被假定在服务器上。
- -pyour_pass, --password[=your_pass]
- 与服务器连接时使用的口令。如果你不指定“=your_pass”部分,mysqlimport要求来自终端的口令。
- -P port_num, --port=port_num
- 与一台主机连接时使用的TCP/IP端口号。(这被用于连接到除localhost以外的主机,因为它使用Unix套接字。)
- -r, --replace
- --replace和--ignore选项控制对输入在唯一键值上有重复的现有记录的输入处理。如果你指定--replace,新行将代替有相同唯一键的存在的行。如果你指定--ignore,跳过输入在唯一键值上有重复的现有记录。如果你不指定任何一个选项,当找到一个重复的键值,出现一个错误,并且文本文件余下部分被忽略。
- -s, --silent
- 安静模式。只有在错误发生时,写出输出。
- -S /path/to/socket, --socket=/path/to/socket
- 与localhost(它是缺省主机)连接时使用的套接字文件。
- -u user_name, --user=user_name
- MySQL使用的用户名字当与服务者联接时。缺省价值是你的 Unix 登录名字。
- -v, --verbose
- 冗长模式。打印程序所做的更多信息。
- -V, --version
- 打印版本信息并且退出。
以下是使用mysqlimport运行的一个样本:
$ mysql --versionmysql Ver 9.33 Distrib 3.22.25, for pc-linux-gnu (i686)$ uname -aLinux xxx.com 2.2.5-15 #1 Mon Apr 19 22:21:09 EDT 1999 i586 unknown$ mysql -e 'CREATE TABLE imptest(id INT, n VARCHAR(30))' test$ eda100 Max Sydow101 Count Dracula.w imptest.txt32q$ od -c imptest.txt0000000 1 0 0 \t M a x S y d o w \n 1 00000020 1 \t C o u n t D r a c u l a \n0000040$ mysqlimport --local test imptest.txttest.imptest: Records: 2 Deleted: 0 Skipped: 0 Warnings: 0$ mysql -e 'SELECT * FROM imptest' test+------+---------------+ id n +------+---------------+ 100 Max Sydow 101 Count Dracula +------+---------------+
12.5 MySQL压缩只读表生成器
myisampack被用来压缩MyISAM表,而pack_isam被用来压缩ISAM表。由于ISAM表被淘汰,这里我们将只讨论myisampack。
myisampack是当你订购超过10个许可证或扩展的支持时,你得到的一个额外的实用程序。因为这些仅以二进制形式被分发,他们仅在某些平台上可用。
下面我们仅谈论myisampack, 但是每件事情对pack_isam也是持有的。
myisampack通过单独压缩表中的每个列来工作。当表被打开时,需要加压缩的信息被读进内存,这使得在存取单个记录时能得到更好的性能,因为你只需要解压缩一个记录,不是更大的磁盘块,象在 MSDOS上使用Stacker时一样。通常,myisampack压缩数据文件40%-70%。
MySQL使用内存映射(mmap())在压缩表上而如果mmap()的使用不工作,倒回到正常的读/写文件。
当前myisampack有2个限制:
- 在压缩后,表只能读。
- myisampack也能压缩BLOB或TEXT列。较老的pack_isam不能做到。
修正这些限制以在我们的TODO表上,但是具有低优先级。
myisampack象这样调用:
shell> myisampack [options] filename ...
每个文件名应该是一个索引(“.MYI”) 文件名。如果你不在数据库目录下,你应该指定文件的路径名。允许省略“.MYI”扩展名。
myisampack支持下列选项:
- -b, --backup
- 制作表的一个备份,为tbl_name.OLD。
- -#, --debug=debug_options
- 输出调试日志。debug_options串经常是'd:t:o,filename'。
- -f, --force
- 即使它变得更大或如果临时文件存在,强制表的压缩。(myisampack在压缩表时创建一个名位“tbl_name.TMD”的临时文件。如果你杀死myisampack,“.TMD”文件不能被删除。通常,如果myisampack发现“tbl_name.TMD”存在,它以一个错误退出。用--force,myisampack不管怎样都压缩表。
- -?, --help
- 显示一条帮助消息并且退出。
- -j big_tbl_name, --join=big_tbl_name
- 联结所有在命令行上被命名的表到一个单独的表big_tbl_name中。所有要被合并的表必须是相同的(同样的列名字和类型,同样的索引,等等。)
- -p #, --packlength=#
- 指定记录长度存储尺寸,按字节。值应该是1、2或3。(myisampack用1、2或3字节的长度指针存储所有行。在最一般的情况下,myisampack在它开始包装文件以前,能确定正确的长度值,但是它可能注意到在包装过程期间,它能使用了更短的长度。在这种情况下,myisampack在下一次你包装同样文件时间打印出一条提示,你可以使用更短的记录长度。)
- -s, --silent
- 安静模式。只有当错误发生时,写出输出。
- -t, --test
- 不压缩表,仅仅测试压缩它。
- -T dir_name, --tmp_dir=dir_name
- 使用命名的目录作为写入临时表的位置。
- -v, --verbose
- 冗长模式。写出有关进展和包装结果的信息。
- -V, --version
- 显示版本信息和出口。
- -w, --wait
- 如果表正在使用,等待并且再试。如果mysqld服务器以--skip-locking选项被调用,如果表可能在包装过程中被更新,调用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.frmshell> myisamchk -dvv stationMyISAM file: stationIsam-version: 2Creation time: 1996-03-13 10:08:58Recover time: 1997-02-02 3:06:43Data records: 1192 Deleted blocks: 0Datafile: Parts: 1192 Deleted data: 0Datafile pointer (bytes): 2 Keyfile pointer (bytes): 2Max datafile length: 54657023 Max keyfile length: 33554431Recordlength: 834Record format: Fixed lengthtable description:Key Start Len Index Type Root Blocksize Rec/key1 2 4 unique unsigned long 1024 1024 12 32 30 multip. text 10240 1024 1Field Start Length Type1 1 12 2 43 6 44 10 15 11 206 31 17 32 308 62 359 97 3510 132 3511 167 412 171 1613 187 3514 222 415 226 1616 242 2017 262 2018 282 2019 302 3020 332 421 336 422 340 123 341 824 349 825 357 826 365 227 367 228 369 429 373 430 377 131 378 232 380 833 388 434 392 435 396 436 400 437 404 138 405 439 409 440 413 441 417 442 421 443 425 444 429 2045 449 3046 479 147 480 148 481 7949 560 7950 639 7951 718 7952 797 853 805 154 806 155 807 2056 827 457 831 4shell> myisampack station.MYICompressing station.MYI: (1192 records)- Calculating statisticsnormal: 20 empty-space: 16 empty-zero: 12 empty-fill: 11pre-space: 0 end-space: 12 table-lookups: 5 zero: 7Original trees: 57 After join: 17- Compressing file87.14%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.frmshell> myisamchk -dvv stationMyISAM file: stationIsam-version: 2Creation time: 1996-03-13 10:08:58Recover time: 1997-04-17 19:04:26Data records: 1192 Deleted blocks: 0Datafile: Parts: 1192 Deleted data: 0Datafilepointer (bytes): 3 Keyfile pointer (bytes): 1Max datafile length: 16777215 Max keyfile length: 131071Recordlength: 834Record format: Compressedtable description:Key Start Len Index Type Root Blocksize Rec/key1 2 4 unique unsigned long 10240 1024 12 32 30 multip. text 54272 1024 1Field Start Length Type Huff tree Bits1 1 1 constant 1 02 2 4 zerofill(1) 2 93 6 4 no zeros, zerofill(1) 2 94 10 1 3 95 11 20 table-lookup 4 06 31 1 3 97 32 30 no endspace, not_always 5 98 62 35 no endspace, not_always, no empty 6 99 97 35 no empty 7 910 132 35 no endspace, not_always, no empty 6 911 167 4 zerofill(1) 2 912 171 16 no endspace, not_always, no empty 5 913 187 35 no endspace, not_always, no empty 6 914 222 4 zerofill(1) 2 915 226 16 no endspace, not_always, no empty 5 916 242 20 no endspace, not_always 8 917 262 20 no endspace, no empty 8 918 282 20 no endspace, no empty 5 919 302 30 no endspace, no empty 6 920 332 4 always zero 2 921 336 4 always zero 2 922 340 1 3 923 341 8 table-lookup 9 024 349 8 table-lookup 10 025 357 8 always zero 2 926 365 2 2 927 367 2 no zeros, zerofill(1) 2 928 369 4 no zeros, zerofill(1) 2 929 373 4 table-lookup 11 030 377 1 3 931 378 2 no zeros, zerofill(1) 2 932 380 8 no zeros 2 933 388 4 always zero 2 934 392 4 table-lookup 12 035 396 4 no zeros, zerofill(1) 13 936 400 4 no zeros, zerofill(1) 2 937 404 1 2 938 405 4 no zeros 2 939 409 4 always zero 2 940 413 4 no zeros 2 941 417 4 always zero 2 942 421 4 no zeros 2 943 425 4 always zero 2 944 429 20 no empty 3 945 449 30 no empty 3 946 479 1 14 447 480 1 14 448 481 79 no endspace, no empty 15 949 560 79 no empty 2 950 639 79 no empty 2 951 718 79 no endspace 16 952 797 8 no empty 2 953 805 1 17 154 806 1 3 955 807 20 no empty 3 956 827 4 no zeros, zerofill(2) 2 957 831 4 no zeros, zerofill(1) 2 9
由myisampack打印的信息在下面描述:
- normal
- 不是用额外压缩的列数。
- empty-space
- 仅包含空格值的列数;这些将占据1位。
- empty-zero
- 只包含二进制0值的列数;这些将占据1位。
- empty-fill
- 不占据其类型全部字节范围的整形列数;这些被改变为一种更小的类型(例如,一个INTEGER列可以被改变为MEDIUMINT)。
- pre-space
- 用前导空间存储的小数的列数。在这种情况下,每个值将包含一个前导空格的数量的计数。
- end-space
- 有很多拖后空格的列数。在这种情况下,每个值将包含一个拖后空格的数量的计数。
- table-lookup
- 列只有少数不同的值,并且它在哈夫曼压缩前被变换一个ENUM。
- zero
- 所有值为零的列数。
- Original trees
- 哈夫曼树的初始数目。
- After join
- 在联结哈夫曼树以节省一些表头空间后余下的不同树的数量。
在一张表被压缩以后,myisamchk -dvv打印出每个字段的额外信息:
- Type
- 字段类型可以包含下列描述符:
- constant
- 所有行有相同的值。
- no endspace
- 不存储尾空格。
- no endspace, not_always
- 不存储尾空格而且不对所有值做尾空格压缩。
- no endspace, no empty
- 不存储尾空格。不存储空值。
- table-lookup
- 列被变换到一个ENUM。
- zerofill(n)
- 值中最高n位总是0并且不被存储。
- no zeros
- 不存储零。
- always zero
- 0值以1位被存储。
- Huff tree
- 与字段相关的哈夫曼树
- Bits
- 在哈夫曼树里使用的位数。