119011090 发表于 2006-10-12 14:11:30

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 command 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: 10077Threads: 1Questions: 9Slow queries: 0Opens: 6Flush tables: 1
Open tables: 2Memory in use: 1092KMax memory used: 1116K

mysqladmin status命令结果有下述列:

UptimeMySQL服务器已经运行的秒数
Threads活跃线程(客户)的数量
Questions从mysqld启动起来自客户问题的数量
Slow queries已经超过long_query_time秒的查询数量
Opensmysqld已经打开了多少表
Flush tablesflush ..., 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 database

如果你不给定任何表,整个数据库将被倾倒。

通过执行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=&#39;where-condition&#39;
只倾倒被选择了的记录;注意引号是强制的!
"--where=user=&#39;jimf&#39;" "-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 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 --version
mysqlVer 9.33 Distrib 3.22.25, for pc-linux-gnu (i686)
$ uname -a
Linux xxx.com 2.2.5-15 #1 Mon Apr 19 22:21:09 EDT 1999 i586 unknown
$ mysql -e &#39;CREATE TABLE imptest(id INT, n VARCHAR(30))&#39; test
$ ed
a
100    Max Sydow
101    Count Dracula
.
w imptest.txt
32
q
$ od -c imptest.txt
0000000100\tMax   Sydow\n10
00000201\tCount   Dracula\n
0000040
$ mysqlimport --local test imptest.txt
test.imptest: Records: 2Deleted: 0Skipped: 0Warnings: 0
$ mysql -e &#39;SELECT * FROM imptest&#39; 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 filename ...

每个文件名应该是一个索引(“.MYI”) 文件名。如果你不在数据库目录下,你应该指定文件的路径名。允许省略“.MYI”扩展名。

myisampack支持下列选项:

-b, --backup
制作表的一个备份,为tbl_name.OLD。
-#, --debug=debug_options
输出调试日志。debug_options串经常是&#39;d:t:o,filename&#39;。
-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.frm

shell> myisamchk -dvv station

MyISAM file:    station
Isam-version:2
Creation time: 1996-03-13 10:08:58
Recover time:1997-02-023:06:43
Data records:          1192Deleted blocks:          0
Datafile: Parts:      1192Deleted data:         0
Datafile pointer (bytes):    2Keyfile pointer (bytes):    2
Max datafile length:54657023Max keyfile length:33554431
Recordlength:          834
Record format: Fixed length

table description:
Key Start Len IndexType                RootBlocksize   Rec/key
12    4uniqueunsigned long          1024   1024       1
232   30multip. text               10240   1024       1

Field Start Length Type
1    1    1
2    2    4
3    6    4
4    10   1
5    11   20
6    31   1
7    32   30
8    62   35
9    97   35
10   13235
11   1674
12   17116
13   18735
14   2224
15   22616
16   24220
17   26220
18   28220
19   30230
20   3324
21   3364
22   3401
23   3418
24   3498
25   3578
26   3652
27   3672
28   3694
29   3734
30   3771
31   3782
32   3808
33   3884
34   3924
35   3964
36   4004
37   4041
38   4054
39   4094
40   4134
41   4174
42   4214
43   4254
44   42920
45   44930
46   4791
47   4801
48   48179
49   56079
50   63979
51   71879
52   7978
53   8051
54   8061
55   80720
56   8274
57   8314

shell> myisampack station.MYI
Compressing station.MYI: (1192 records)
- Calculating statistics

normal:    20empty-space:    16empty-zero:      12empty-fill:11
pre-space:0end-space:      12table-lookups:    5zero:      7
Original trees:57After join: 17
- Compressing file
87.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.frm

shell> myisamchk -dvv station

MyISAM file:    station
Isam-version:2
Creation time: 1996-03-13 10:08:58
Recover time:1997-04-17 19:04:26
Data records:          1192Deleted blocks:          0
Datafile: Parts:      1192Deleted data:         0
Datafilepointer (bytes):    3Keyfile pointer (bytes):    1
Max datafile length:16777215Max keyfile length:    131071
Recordlength:          834
Record format: Compressed

table description:
Key Start Len IndexType                RootBlocksize   Rec/key
12    4uniqueunsigned long         10240   1024       1
232   30multip. text               54272   1024       1

Field Start Length Type               Huff treeBits
1    1    1    constant                  1    0
2    2    4    zerofill(1)                  2    9
3    6    4    no zeros, zerofill(1)         2    9
4    10   1                           3    9
5    11   20    table-lookup               4    0
6    31   1                           3    9
7    32   30    no endspace, not_always          5    9
8    62   35    no endspace, not_always, no empty   6    9
9    97   35    no empty                  7    9
10   13235    no endspace, not_always, no empty   6    9
11   1674    zerofill(1)                  2    9
12   17116    no endspace, not_always, no empty   5    9
13   18735    no endspace, not_always, no empty   6    9
14   2224    zerofill(1)                  2    9
15   22616    no endspace, not_always, no empty   5    9
16   24220    no endspace, not_always          8    9
17   26220    no endspace, no empty         8    9
18   28220    no endspace, no empty         5    9
19   30230    no endspace, no empty         6    9
20   3324    always zero                  2    9
21   3364    always zero                  2    9
22   3401                           3    9
23   3418    table-lookup               9    0
24   3498    table-lookup                10    0
25   3578    always zero                  2    9
26   3652                           2    9
27   3672    no zeros, zerofill(1)         2    9
28   3694    no zeros, zerofill(1)         2    9
29   3734    table-lookup                11    0
30   3771                           3    9
31   3782    no zeros, zerofill(1)         2    9
32   3808    no zeros                  2    9
33   3884    always zero                  2    9
34   3924    table-lookup                12    0
35   3964    no zeros, zerofill(1)          13    9
36   4004    no zeros, zerofill(1)         2    9
37   4041                           2    9
38   4054    no zeros                  2    9
39   4094    always zero                  2    9
40   4134    no zeros                  2    9
41   4174    always zero                  2    9
42   4214    no zeros                  2    9
43   4254    always zero                  2    9
44   42920    no empty                  3    9
45   44930    no empty                  3    9
46   4791                            14    4
47   4801                            14    4
48   48179    no endspace, no empty          15    9
49   56079    no empty                  2    9
50   63979    no empty                  2    9
51   71879    no endspace               16    9
52   7978    no empty                  2    9
53   8051                            17    1
54   8061                           3    9
55   80720    no empty                  3    9
56   8274    no zeros, zerofill(2)         2    9
57   8314    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
在哈夫曼树里使用的位数。
页: [1]
查看完整版本: 12 MySQL实用程序