5.数据库管理(1)

5.1. MySQL服务器和服务器启动脚本

5.1.1. 服务器端脚本和实用工具概述


mysqld

SQL后台程序(即MySQL服务器)。要想使用客户端程序,该程序必须运行,因为客户端通过连接服务器来访问数据库。

mysqld-max

包括更多特性的一个服务器版本。


mysqld_safe

服务器启动脚本。如果mysqld-max存在,mysqld_safe试图启动它,否则启动mysqld


 mysql.server

服务器启动脚本。该脚本用于使用包含为特定级别的运行启动服务的脚本的运行目录的系统。它调用mysqld_safe来启动MySQL服务器。


mysqld_multi

服务器启动脚本,可以启动或停止系统上安装的多个服务器。


mysql_install_db

该脚本用默认权限创建MySQL授权表。通常只是在系统上首次安装MySQL时执行一次


 mysql_fix_ privilege_tables

在升级安装后,如果新版本MySQL中的 授权表有更改,则使用该脚本来更改授权表。


myisamchk

用来描述、检查、优化和维护MyISAM表的实用工具


make_binary_distribution

该程序可以生成编译过的MySQL的二进制版本。


mysqlbug

MySQL 缺陷报告脚本。它可以用来向MySQL邮件系统发送缺陷报告。


5.1.2. mysqld-max扩展MySQL服务器


MySQL-Max 服务器是 mysqld  MySQL 服务器的一个版本,包含了更多的特性。

对于 Windows MySQL 二进制分发版包括标准服务器  ( mysqld.exe ) MySQL-Max 服务器 (mysqld-max.exe) ,因此你不再需要专用分发版。只需要使用一个常规 Windows 分发版,

对于 Linux ,如果你使用 RPM 分发版安装 MySQL ,首先使用常规 MySQL-server  RPM 来安装标准 mysqld 服务器。然后使用 MySQL-Max  RPM 来安装 mysqld-max 服务器。 MySQL-Max  RPM 假定你已经安装了常规服务器 RPM


MySQL AB 使用下面的 configure 选项构建 MySQL-Max 服务器


 --with-server-suffix=-max

该选项为mysqld版本字符串添加一个-max后缀。


--with-innodb

该选项启用InnoDB存储引擎支持。


--with-bdb

该选项启用Berkeley DB (BDB)存储引擎支持。


--with-blackhole-storage-engine

该选项启用BLACKHOLE存储引擎支持。


USE_SYMDIR

启用该定义来为Windows打开数据库符号链接支持。符号链接支持适用于所有Windows服务器,因此Max服务器不需要支持该特性。

 --with-ndbcluster

该选项启用NDB Cluster存储引擎支持。

下面的表显示了MySQL-Max二进制在哪个平台上包括BDB和/或NDB CLUSTER支持:

系统

BDB支持

NDB支持

AIX 4.3

N

N

HP-UX 11.0

N

N

Linux-Alpha

N

Y

Linux-IA-64

N

N

Linux-Intel

Y

Y

Mac OS X

N

N

NetWare

N

N

SCO OSR5

Y

N

Solaris-SPARC

Y

Y

Solaris-Intel

N

Y

UnixWare

Y

N

Windows NT/2000/XP

Y

N

要想找出你的服务器支持哪个存储引擎,执行下面的语句:

mysql> SHOW ENGINES;

+------------+---------+----------------------------------------------------------------+
| Engine     | Support | Comment                                                        |
+------------+---------+----------------------------------------------------------------+
| MyISAM     | DEFAULT | Default engine as of MySQL 3.23 with great performance         |
| MEMORY     | YES     | Hash based, stored in memory, useful for temporary tables      |
| HEAP       | YES     | Alias for MEMORY                                               |
| MERGE      | YES     | Collection of identical MyISAM tables                          |
| MRG_MYISAM | YES     | Alias for MERGE                                                |
| ISAM       | NO      | Obsolete storage engine, now replaced by MyISAM                |
| MRG_ISAM   | NO      | Obsolete storage engine, now replaced by MERGE                 |
| InnoDB     | YES     | Supports transactions, row-level locking, and foreign keys     |
| INNOBASE   | YES     | Alias for INNODB                                               |
| BDB        | YES     | Supports transactions and page-level locking                   |
| BERKELEYDB | YES     | Alias for BDB                                                  |
| NDBCLUSTER | NO      | Clustered, fault-tolerant, memory-based tables                 |
| NDB        | NO      | Alias for NDBCLUSTER                                           |
| EXAMPLE    | NO      | Example storage engine                                         |
| ARCHIVE    | YES     | Archive storage engine                                         |
| CSV        | NO      | CSV storage engine                                             |
| FEDERATED  | YES     | Federated MySQL storage engine                                 |
| BLACKHOLE  | YES     | /dev/null storage engine (anything you write to it disappears) |
+------------+---------+----------------------------------------------------------------+
18 rows in set (0.00 sec)


你还可以使用下面的语句代替SHOW ENGINES,并检查你感兴趣的存储引擎的变量值:

mysql> SHOW VARIABLES LIKE 'have%';
+-----------------------+----------+
| Variable_name         | Value    |
+-----------------------+----------+
| have_archive          | YES      |
| have_bdb              | NO       |
| have_blackhole_engine | YES      |
| have_compress         | YES      |
| have_crypt            | YES      |
| have_csv              | YES      |
| have_example_engine   | NO       |
| have_federated_engine | NO       |
| have_geometry         | YES      |
| have_innodb           | YES      |
| have_isam             | NO       |
| have_ndbcluster       | DISABLED |
| have_openssl          | NO       |
| have_partition_engine | YES      |
| have_query_cache      | YES      |
| have_raid             | NO       |
| have_rtree_keys       | YES      |
| have_symlink          | YES      |
+-----------------------+----------+
18 rows in set (0.01 sec)


5.1.3. mysqld_safe:MySQL服务器启动脚本


Unix NetWare 中推荐使用 mysqld_safe 来启动 mysqld服务器 mysqld_safe 增加了一些安全特性,例如当出现错误时重启服务器并向错误日志文件写入运行时间信息。

默认情况下,mysqld_safe尝试启动可执行mysqld-max(如果存在),否则启动mysqld。该行为的含义是:

·         在Linux中,MySQL-Max RPM依赖该mysqld_safe的行为。RPM安装可执行mysqld-max,使mysqld_safe从该点起自动使用可执行命令。

·         如果你安装包括mysqld-max服务器的MySQL-Max分发版,后面升级到非-Max的MySQL版本,mysqld_safe仍然试图运行旧的 mysqld-max服务器。升级时,你应手动删除旧的mysqld-max服务器以确保mysqld_safe运行新的mysqld服务器


要想越过默认行为并显式指定你想要运行哪个服务器,为 mysqld_safe 指定 --mysqld --mysqld-version 选项。


所有在命令行中为 mysqld_safe 指定的选项被传递给 mysqld 如果你想要使用 mysqld 不支持的 mysqld_safe 选项,不要在命令行中指定。相反,在选项文件的 [mysqld_safe] 组内将它们列出来。


mysqld_safe 从选项文件的 [mysqld] [server] [mysqld_safe] 部分读取所有选项。

mysqld_safe 支持下面的选项:

--help

显示帮助消息并退出。


--autoclose

(只在NetWare中)在NetWare中,mysqld_safe可以保持窗口。当你关掉mysqld_safe NLM时,窗口不按默认设置消失。相反,它提示用户输入:

*<NLM has terminated; Press any key to close the screen>*

如果你想让NetWare自动关闭窗口,在mysqld_safe中使用--autoclose选项。


--basedir=path

MySQL安装目录的路径。


 --core-file-size=size

mysqld能够创建的内核文件的大小。选项值传递给ulimit -c

--datadir=path

数据目录的路径。


--defaults-extra-file=path

除了通用选项文件所读取的选项文件名。如果给出,必须首选该选项。


--defaults-file=path

读取的代替通用选项文件的选项文件名。如果给出,必须首选该选项。


 --ledir=path

包含mysqld程序的目录的路径。使用该选项来显式表示服务器位置。

--log-error=path

将错误日志写入给定的文件。


 --mysqld=prog_name

想要启动的服务器程序名(在ledir目录)。如果你使用MySQL二进制分发版但有二进制分发版之外的数据目录需要该选项。



--mysqld-version =suffix

该选项类似--mysqld选项,但你只指定服务器程序名的后缀。基本名假定为mysqld例如,如果你使用--mysqld-version =maxmysqld_safe启动ledir目录中的mysqld-max程序。如果--mysqld-version的参数为空,mysqld_safe使用目录中的mysqld


--nice=priority

使用nice程序根据给定值来设置服务器的调度优先级。


 --no-defaults

不要读任何选项文件。如果给出,必须首选该选项。

 --open-files-limit=count

mysqld能够打开的文件的数量。选项值传递给 ulimit -n。请注意你需要用root启动mysqld_safe来保证正确工作!


--pid-file=path

进程ID文件的路径。


--port=port_num

 用来帧听TCP/IP连接的端口号。端口号必须为1024或更大值,除非MySQL以root系统用户运行。


--skip-character-set-client-handshake

忽略客户端发送的字符集信息,使用服务器的默认字符集。


--socket=path

用于本地连接的Unix套接字文件。


--timezone=zone

为给定的选项值设置TZ时区环境变量。从操作系统文档查阅合法的时区规定格式。


 --user={user_name | user_id}

以用户名user_name或数字用户ID user_id运行mysqld服务器


执行mysqld_safe时,必须先给出--defaults-file--defaults-extra-option,或不使用选项文件。例如,该命令将不使用选项文件:

mysqld_safe --port=port_num --defaults-file=file_name

相反,使用下面的命令:

mysqld_safe --defaults-file=file_name --port=port_num

一般情况,你不应编辑 mysqld_safe 脚本。相反,应使用命令行选项或 my.cnf 选项文件的 [mysqld_safe] 部分的选项来配置 mysqld_safe 。一般不需要编辑 mysqld_safe 来正确启动服务器。但是,如果你编辑,将来升级 MySQL 后会覆盖你修改的 mysqld_safe 版本,因此你应对你修改的版本进行备份以便将来重装。

在NetWare中,mysqld_safe是一个NetWare Loadable Module (NLM),从原Unix shell脚本移植。它执行:

1.    检查系统和选项。

2.    检查MyISAM表。

3.    保持MySQL服务器窗口。

4.    启动并监视mysqld,如果因错误终止则重启。

5.    mysqld错误消息发送到数据目录中的host_name.err 文件。

6.    将mysqld_safe的屏幕输出发送到数据目录中的host_name.safe文件。


5.1.4. mysql.server:MySQL服务器启动脚本

在Unix中的MySQL分发版包括mysql.server脚本。它可以用于使用System V-style运行目录来启动和停止系统服务的系统,例如Linux和Solaris。它还用于MySQL的Mac OS X Startup Item。

mysql.server位于MySQL源码树MySQL安装目录下的support-files目录中。

如果你使用Linux 服务器RPM软件包(MySQL-server-VERSION.rpm),mysql.server脚本将安装到/etc/init.d目录下,名为mysql

mysql.server 从  [mysql.server] 和选项文件的 [mysqld] 部分读取选项。

5.1.5. mysqld_multi:管理多个MySQL服务器的程序

mysqld_multi可以管理多个帧听不同Unix套接字文件和TCP/IP端口的连接的mysqld 进程。它可以启动或停止服务器,或报告它们的当前状态。

程序寻找my.cnf中的[mysqldN]组(或--config-file选项指定的文件)。N 可以为任何正整数。在下面的讨论中该数字指选项组号,或GNR。组号区别各选项组,并用作mysqld_multi的参数来指定想要启动、停止哪个服务器或获取哪个服务器的状态报告。这些组中的选项与将用来启动mysqld[mysqld]组中的相同。


要想调用mysqld_multi,使用下面的语法:

shell> mysqld_multi [options] {start|stop|report} [GNR[,GNR] ...]

startstopreport表示你想要执行的操作。你可以在单个服务器或多个服务器上执行指定的操作,取决于选项名后面的GNR 列。如果没有该列,mysqld_multi为选项文件中的所有服务器执行该操作。

该命令使用选项组[mysqld17]启动单个服务器:

shell> mysqld_multi start 17

该命令停止多个服务器,使用选项组[mysql8][mysqld10][mysqld13]

shell> mysqld_multi stop 8,10-13

使用该命令列出设置选项文件的示例:

shell> mysqld_multi --example

mysqld_multi支持下面的选项

--config-file=name

指定选项文件名。这关系到mysqld_multi从哪里寻找[mysqldN]选项组。没有该选项,从通用my.cnf文件读所有选项。选项不影响 mysqld_multi从哪里读取自己的选项,总是从通用my.cnf文件的[mysqld_multi]组读取。

--example

显示示例选项文件。

--help

显示帮助消息并退出。


--log=name

指定日志文件名。如果该文件存在,后面为日志输出。

--mysqladmin=prog_name

用来停止服务器的mysqladmin二进制。

--mysqld=prog_name

可用的mysqld二进制。请注意你还可以将该选项的值指定为mysqld_safe。选项被传递给 mysqld确保在PATH环境变量设定值或mysqld_safe中有mysqld所在目录。

--no-log

按照标准输出打印日志信息,不要写入日志文件。默认情况下,输出写入日志文件。

 --password=password

调用mysqladmin时使用的MySQL账户的密码。请注意该密码值不是可选项,不象其它MySQL程序。

--silent

禁用警告。

--tcp-ip

通过TCP/IP端口而不是Unix套接字文件来连接每个MySQL服务器。(如果找不到套接字文件, 服务器仍然可以运行,但只能通过 TCP/IP端口访问)。默认情况下,使用Unix套接字文件进行连接。该选项影响stopreport操作。

--user=user_name

调用mysqladmin时使用的MySQL账户的用户名。

--verbose

更详细。

--version

显示版本信息并退出。


关于mysqld_multi的一些注解:

·         确保停止mysqld服务器(用mysqladmin程序)的MySQL账户在各个服务器中的用户名和密码相同。并且应确保账户具有SHUTDOWN权限。如果你想要管理的服务器的管理账户有许多不同的用户名或密码,你需要在每个服务器上创建一个账户,并具有相同的用户名和密码。例如,你可以执行下面的命令为每个服务器设置一个普通multi_admin账户:

·                shell> mysql -u root -S /tmp/mysql.sock -proot_password
·                mysql> GRANT SHUTDOWN ON *.*
·                    -> TO 'multi_admin'@'localhost' IDENTIFIED BY 'multipass'

·         如果你使用mysqld_safe来启动mysqld(例如,--mysqld=mysqld_safe),--pid-file选项很重要。每个mysqld应有自己的进程ID文件。使用mysqld_safe而不使用mysqld的好处是mysqld_safe守护”其mysqld进程,如果用kill 9发送的信号或由于其它原因(例如分段故障)进程终止,则重启进程。请注意mysqld_safe脚本需要你从某个位置启动它。这说明运行mysqld_multi前你必须进入某个目录。如果启动时有问题,请参见mysqld_safe脚本。特别是要检查下列行:

·                ----------------------------------------------------------------
·                MY_PWD=`pwd`
·                # Check if we are starting this relative (for the binary release)
·                if test -d $MY_PWD/data/mysql -a -f ./share/mysql/english/errmsg.sys -a \
·                -x ./bin/mysqld
·                ----------------------------------------------------------------

·         每个mysqld的Unix套接字文件和TCP/IP端口号必须不同。

·         你可能想要为mysqld使用--user选项,但为此你需要用Unix root用户运行mysqld_multi脚本。选项文件中有选项不要紧;如果你不是超级用户,并且你用自己的Unix账户重启mysqld进程,你只会得到警告。

·         重要:确保mysqld进程启动所用Unix账户可以完全访问数据目录。不要使用Unix root账户,除非你知道你在做什么。

·         非常重要:使用mysqld_multi前,确保理解传递给mysqld服务器的选项的含义以及你为什么想要独立的mysqld进程。应清楚 在相同的数据目录下使用多个mysqld服务器的危险。使用单独的数据目录,除非你知道你在做什么。在线程系统中,在相同的数据目录下启动多个服务器不会得到超性能。


下面的示例显示了你如何设置选项文件来使用mysqld_multi。专门省去第1个和第5个[mysqldN]组来说明你的选项文件可以稍有不同。这样给你更大的灵活性。mysqld程序重启或停止的顺序由它们在选项文件中的顺序决定。

# This file should probably be in your home dir (~/.my.cnf)
# or /etc/my.cnf
# Version 2.1 by Jani Tolonen
 
[mysqld_multi]
mysqld     = /usr/local/bin/mysqld_safe
mysqladmin = /usr/local/bin/mysqladmin
user       = multi_admin
password   = multipass
 
[mysqld2]
socket     = /tmp/mysql.sock2
port       = 3307
pid-file   = /usr/local/mysql/var2/hostname.pid2
datadir    = /usr/local/mysql/var2
language   = /usr/local/share/mysql/english
user       = john
 
[mysqld3]
socket     = /tmp/mysql.sock3
port       = 3308
pid-file   = /usr/local/mysql/var3/hostname.pid3
datadir    = /usr/local/mysql/var3
language   = /usr/local/share/mysql/swedish
user       = monty
 
[mysqld4]
socket     = /tmp/mysql.sock4
port       = 3309
pid-file   = /usr/local/mysql/var4/hostname.pid4
datadir    = /usr/local/mysql/var4
language   = /usr/local/share/mysql/estonia
user       = tonu
 
[mysqld6]
socket     = /tmp/mysql.sock6
port       = 3311
pid-file   = /usr/local/mysql/var6/hostname.pid6
datadir    = /usr/local/mysql/var6
language   = /usr/local/share/mysql/japanese
user       = jani

5.2. mysqlmanager:MySQL实例管理器

MySQL 实例管理器 (IM) 是通过 TCP/IP 端口运行的后台程序,用来监视和管理 MySQL 数据库服务器实例。 MySQL 实例管理器 适合 Unix- 类操作系统和 Windows


可以在 mysqld_safe 脚本使用 MySQL 实例管理器来启动和停止 MySQL 服务器, 甚至可以从一个远程主机 MySQL 实例管理器还执行 mysqld_multi 脚本的功能 ( 和大多数语法 )

5.2.1. 用MySQL实例管理器启动MySQL服务器

一般情况,用 mysql.server 脚本启动 MySQL Database Server MySQL 数据库服务器),通常驻留在 /etc/init.d/   文件夹。默认情况下该脚本调用 mysqld_safe 脚本。但是,你可以在脚本中将 use_mysqld_safe 变量设置为 0 ( ) 以便使用 MySQL 实例管理器来启动服务器。

在这种情况下, Instance Manager 的行为取决于 MySQL 配置文件中的选项。如果没有配置文件, MySQL 实例管理器创建 mysqld 实例并试图用默认 ( 编译嵌入的 ) 配置来启动。这说明如果 mysqld没有 安装到 默认位置, IM 不能猜出它的位置。如果你已经在非标准位置安装了 MySQL 服务器,你应使用配置文件

如果有配置文件, IM 将分析配置文件搜索 [mysqld] 部分 ( 例如 [mysqld] [mysqld1] [mysqld2] ) 。每个部分指定一个实例。启动时 IM 将启动所有找到的实例。 IM 关闭时默认停止所有实例。

启用MySQL实例管理器的典型MySQL服务器启动/关闭循环为:

·          用/etc/init.d/mysql脚本启动MySQL实例管理器。

·          MySQL实例管理器启动所有实例并监视它们。

·         如果某个服务器实例失败,MySQL实例管理器重启它。

·         如果MySQL实例管理器被关闭(例如用/etc/init.d/mysql stop命令),所有实例被MySQL实例管理器关闭。


5.2.2. 连接到MySQL实例管理器并创建用户账户

IM将用户信息保存到密码文件中。密码文件的默认位置为/etc/mysqlmanager.passwd

密码应类似于:

petr:*35110DC9B4D8140F5DE667E28C72DD2597B5C848

要想生成密码用--passwd选项调用IM。则输出可以重定向到/etc/mysqlmanager.passwd文件以添加新用户。下面为示例命令。

./mysqlmanager --passwd >> /etc/mysqlmanager.passwd
Creating record for new user.
Enter user name: mike
Enter password: <password>
Re-type password: <password>

下面的行将加到/etc/mysqlmanager.passwd

mike:*00A51F3F48415C7D4E8908980D443C29C69B60C9

5.2.3. MySQL实例管理器命令行选项

执行 ./mysqlmanager --help 命令可以简单列出。有下面的选项:

--help-?

显示帮助消息并退出。


--bind-address=name

绑定地址用于连接。

--default-mysqld-path=name

在Unix中,如果实例部分没有路径,则为寻找MySQL服务器二进制的地点。例如:default-mysqld-path = /usr/sbin/mysqld

--defaults-file=file_name

从给定文件读Instance Manager和MySQL服务器设定值。所有Instance Manager更改的配置将加入该文件。只能用于Instance Manager的第一选项。

--install

在Windows中,将Instance Manager安装为Windows服务。

--log=name

IM日志文件的路径。结合--run-as-service选项使用。

 --monitoring-interval=Seconds

监视实例的间隔,单位为秒。Instance Manager将尝试连接每个监视的实例来检查它们是否是活动的/没有挂起。出现故障,IM将重启几次(实际上是多次)实例。可以用nonguarded选项为特定实例禁用该行为。如果未给定任何值, 默认使用20秒。

 --passwd-P

编写passwd文件并退出。

--password-file=name

从该文件中寻找Instance Manager用户和密码。默认文件是/etc/mysqlmanager.passwd

--pid-file=name

使用的进程ID文件。默认情况下,该文件文件名为mysqlmanager.pid

-- port=port_num

用于连接的端口号。(IANA分配的 默认端口号为2273)。

 --print-defaults

打印当前的默认值并退出。只能用作Instance Manager的第一选项。

 --remove

在Windows中,删掉Instance Manager Windows服务。假定前面已经用--install运行了Instance Manager。

--run-as-service

使完善进程变为后台程序并启动。完善进程很简单,不易崩溃。出现故障后它将自己重启IM。

--socket=name

Unix中用于连接的套接字文件。默认情况下,文件名为/tmp/mysqlmanager.sock

--standalone

在Windows中以单机模式运行Instance Manager。

--user=name

启动并运行mysqlmanager的用户名。建议使用运行mysqld服务器的用户账户来运行mysqlmanager


--version-V

输出版本信息并退出。


5.2.4. MySQL实例管理器配置文件

Instance Manager 使用标准 my.cnf 文件。它使用 [manager] 部分为自己读取选项并读取 [mysqld] 部分来创建实例。 [manager] 部分包含上述列出的选项。下面为 [manager] 部分示例:
# MySQL Instance Manager options section
[manager]
default-mysqld-path = /usr/local/mysql/libexec/mysqld
socket=/tmp/manager.sock
pid-file=/tmp/manager.pid
password-file = /home/cps/.mysqlmanager.passwd
monitoring-interval = 2
port = 1999
bind-address = 192.168.1.5

MySQL实例管理器只在Unix中读取并管理/etc/my.cnf文件。在Windows中,MySQL实例管理器从Instance Manager的安装目录读取my.ini文件。用--defaults-file=file_ name选项可以更改默认选项文件的位置。

实例部分指定启动时给每个实例的选项。这些主要是普通MySQL服务器选项,但有一些IM-专用选项:

·         mysqld-path = <path-to-mysqld-binary>

mysqld服务器二进制的路径。

·         shutdown-delay = Seconds

IM应等待实例关闭的秒数。 默认为35秒。超过延迟时间后,IM假定实例正挂起并试图“kill 9它。如果你使用带large表的InnoDB,你应当增加该值。

·         nonguarded

如果你想要为某个实例禁用IM监视功能,应设置该选项。


下面给出了几个实例示例。

[mysqld]
mysqld-path=/usr/local/mysql/libexec/mysqld
socket=/tmp/mysql.sock
port=3307
server_id=1
skip-stack-trace
core-file
skip-bdb
log-bin
log-error
log=mylog
log-slow-queries
 
[mysqld2]
nonguarded
port=3308
server_id=2
mysqld-path= /home/cps/mysql/trees/mysql-5.1/sql/mysqld
socket     = /tmp/mysql.sock5
pid-file   = /tmp/hostname.pid5
datadir= /home/cps/mysql_data/data_dir1
language=/home/cps/mysql/trees/mysql-5.1/sql/share/english
log-bin

log=/tmp/fordel.log


5.2.5. MySQL实例管理器识别的命令

         START INSTANCE <instance_name>

该命令将试图启动一个实例:

mysql> START INSTANCE mysqld4;
Query OK, 0 rows affected (0,00 sec)

·         STOP INSTANCE <instance_name>

将试图停止一个实例:

mysql> STOP INSTANCE mysqld4;
Query OK, 0 rows affected (0,00 sec)

·         SHOW INSTANCES

显示所有载入的实例名:

mysql> show instances;
+---------------+---------+
| instance_name | status  |
+---------------+---------+
| mysqld3       | offline |
| mysqld4       | online  |
| mysqld2       | offline |
+---------------+---------+
3 rows in set (0,04 sec)

·         SHOW INSTANCE STATUS <instance_name>

显示选定的实例的状态和版本信息:

mysql> SHOW INSTANCE STATUS mysqld3;
+---------------+--------+---------+
| instance_name | status | version |
+---------------+--------+---------+
| mysqld3       | online | unknown |
+---------------+--------+---------+
1 row in set (0.00 sec)

·         SHOW INSTANCE OPTIONS <instance_name>

显示实例使用的选项:

mysql> SHOW INSTANCE OPTIONS mysqld3;
+---------------+---------------------------------------------------+
| option_name   | value                                             |
+---------------+---------------------------------------------------+
| instance_name | mysqld3                                           |
| mysqld-path   | /home/cps/mysql/trees/mysql-4.1/sql/mysqld        |
| port          | 3309                                              |
| socket        | /tmp/mysql.sock3                                  |
| pid-file      | hostname.pid3                                     |
| datadir       | /home/cps/mysql_data/data_dir1/                   |
| language      | /home/cps/mysql/trees/mysql-4.1/sql/share/english |
+---------------+---------------------------------------------------+
7 rows in set (0.01 sec)

·         SHOW <instance_name> LOG FILES

该命令提供实例使用的所有日志文件。结果包含日志文件的路径和日志文件的大小。如果没有在配置文件中指定日志文件的路径 (例如log=/var/mysql.log),IM试图猜出它的位置。如果IM不能猜出日志文件的位置,你应明确指定日志文件的位置。

mysql> SHOW mysqld LOG FILES;
+-------------+------------------------------------+----------+
| Logfile     | Path                               | Filesize |
+-------------+------------------------------------+----------+
| ERROR LOG   | /home/cps/var/mysql/owlet.err      | 9186     |
| GENERAL LOG | /home/cps/var/mysql/owlet.log      | 471503   |
| SLOW LOG    | /home/cps/var/mysql/owlet-slow.log | 4463     |
+-------------+------------------------------------+----------+
3 rows in set (0.01 sec)

·         SHOW <instance_name> LOG {ERROR | SLOW | GENERAL} size[,offset_from_end]

该命令查找指定的日志文件的一部分。因为大多数用户关注最新的日志消息,用size参数定义你想要从日志末尾开始索取的字节数。你可以指定可选offset_from_end参数从日志文件中部索取数据。下面的示例可以索取21个字节的数据,从日志文件末尾开始23个字节,2个字节用于结束:

mysql> SHOW mysqld LOG GENERAL 21, 2;
+---------------------+
| Log                 |
+---------------------+
| using password: YES |
+---------------------+
1 row in set (0.00 sec)

·         SET instance_name.option_name=option_value

该命令编辑指定的实例的配置文件以更改/增加实例选项。IM假定配置文件位于/etc/my.cnf。你应检查文件是否存在,并具有合适的权限。

mysql> SET mysqld2.port=3322;
Query OK, 0 rows affected (0.00 sec)

在MySQL服务器重启前,对配置文件进行的更改不会生效。并且,执行FLUSH INSTANCES命令后,才会将这些更改保存到Instance Manager的实例设定值的本地缓存中。

·         UNSET instance_name.option_name

该命令从实例的配置文件删除一个选项。

mysql> UNSET mysqld2.port;
Query OK, 0 rows affected (0.00 sec)

在MySQL服务器重启前,对配置文件进行的更改不会生效。并且,执行FLUSH INSTANCES命令后,才会将这些更改保存到Instance Manager的实例设定值的本地缓存中。

·         FLUSH INSTANCES

该命令强制IM重读配置文件并清空内部结构。编辑配置文件后应执行该命令。该命令不重启实例:

mysql> FLUSH INSTANCES;
Query OK, 0 rows affected (0.04 sec)

5.3. mysqld:MySQL服务器

5.3.1. mysqld命令行选项

mysqld [mysqld] [server] 组读取选项。 mysqld_safe [mysqld] [server] [mysqld_safe] [safe_mysqld] 组读取选项。 mysql.server 从  [mysqld] [mysql.server] 组读取选项。嵌入式 MySQL 服务器通常从 [server] [embedded] [xxxxx_SERVER] 组读取选项,其中 xxxxx 是服务器嵌入的应用程序名。

mysqld 接受许多命令行选项。执行 mysqld --help 可以简单列出来。要想看全部列表列,使用命令 mysqld --verbose --help


下面列出了一些最常用的服务器选项。其它的选项在其它地方描述:

·         影响安全的选项:参见5.6.3节,“Mysqld安全相关启动选项”。

·         SSL-相关选项:参见5.8.7.6节,“SSL命令行选项”。

·         二进制日志控制选项:参见5.11.3节,“二进制日志”。

·         复制相关选项:参见6.8节,“复制启动选项”。

·         特定存储引擎相关选项:参见15.1.1节,“MyISAM启动选项”、15.5.3节,“BDB启动选项”和15.2.4节,“InnoDB启动选项”。

你还可以将变量名作为一个选项,设置服务器系统变量的值,如本节后面所述。


--help-?

显示简短的帮助消息并退出。使用--verbose--help选项来看全部内容。

--allow-suspicious-udfs

该选项控制是否用户定义的函数只有一个xxx符,用作可载入的主函数。默认情况下,该选项被关闭,只有至少有一个附属符的UDF  可以载入。这样可以防止从未包含合法UDF的共享文件装载函数。参见27.2.3.6节,“用户定义函数安全注意事项”。


--ansi

使用标准(ANSI)SQL语法代替MySQL语法。


--basedir=path, -b path

MySQL安装目录的路径。通常所有路径根据该路径来解析。

 --bind-address=IP

待绑定的IP地址。

--bootstrap

mysql_install_db脚本使用该选项来创建MySQL授权表,不需要启动MySQL服务器。


--console

将错误日志消息写入stderrstdout,即使指定了--log-error。在Windows中,如果使用该选项,mysqld不关闭控制台窗口。

--character-sets-dir=path

字符集安装的目录。

--chroot=path

通过chroot()系统调用在启动过程中将mysqld服务器放入一个封闭环境中。这是推荐的一个安全措施。请注意使用该选项可以 限制LOAD DATA INFILESELECT ... INTO OUTFILE

--character-set-server=charset

使用charset作为 默认服务器字符集。

--core-file

如果mysqld终止,写内核文件。在某些系统中,你还必须为mysqld_safe指定--core-file-size 选项。

--collation-server=collation

使用collation作为 默认服务器校对规则。

--datadir=path, -h path

数据目录的路径。

--debug[=debug_options]-# [debug_options]

如果MySQL配置了--with-debug,你可以使用该选项来获得一个跟踪文件,跟踪mysqld正进行的操作。debug_options字符串通常为'd:t:ofile_name'

--default-storage-engine=type

该选项为--default-table-type的同义词。

 --default-table-type=type

设置表的默认类型。参见第15章:存储引擎和表类型。

--default-time-zone=type

设置默认服务器时区。该选项设置全局time_zone系统变量。如果未给出该选项, 默认时区与系统时区相同(用system_time_zone系统变量值给定)。

--delay-key-write[= OFF | ON | ALL]

如何使用DELAYED KEYS选项。键写入延迟会造成再次写MyISAM表时键缓冲区不能被清空。OFF禁用延迟的键写入。ON启用用DELAYED KEYS选项创建的表的延迟的键写入。ALL延迟所有MyISAM表的键写入。参见7.5.2节,“调节服务器参数”。参见15.1.1节,“MyISAM启动选项”。

释:如果你将该变量设置为ALL,你不应从另一个正使用MyISAM表的程序中使用MyISAM(例如从另一个MySQL服务器或用myisamchk)。这样操作会导致索引破坏。

--des-key-file=file_name

从该文件读DES_ENCRYPT()DES_DECRYPT()使用的 默认键。

--enable-named-pipe

启用命名管道支持。该选项只适用Windows NT、2000、XP和2003系统,并且只适用支持命名管道连接的mysqld-ntmysqld-max-nt服务器。

 --flush

执行SQL语句后向硬盘上清空更改。一般情况执行SQL语句后 MySQL向硬盘写入所有更改,让操作系统处理与硬盘的同步。

--init-file=file

启动时从该文件读SQL语句。每个语句必须在同一行中并且不应包括注释。

--language=lang_name, -L lang_name

用给定语言给出客户端错误消息。lang_name可以为语言名或语言文件安装目录的全路径名。


--large-pages

一些硬件/操作系统架构支持大于 默认值(通常4 KB)的内存页。实际支持取决于使用的硬件和OS。大量访问内存的应用程序通过使用较大的页,降低了Translation Lookaside Buffer (TLB)损失,可以改善性能。

 ---log[=file]-l [file]

日志连接和对文件的查询。参见5.11.2节,“通用查询日志”。如果你不指定文件名,MySQL使用host_name.log作为文件名。

 --log-bin=[file]

二进制日志文件。将更改数据的所有查询记入该文件。用于备份和复制。参见5.11.3节,“二进制日志”。建议指定一个文件名否则MySQL使用host_name-bin作为日志文件基本名。

--log-bin-index[=file]

二进制日志文件名的索引文件。参见5.11.3节,“二进制日志”。如果你不指定文件名,并且如果你没有在--log-bin中指定,MySQL使用host_name-bin.index作为文件名。

--log-error[=file]

该文件的日志错误和启动消息。参见5.11.1节,“错误日志”。如果你不指定文件名,MySQL使用host_name.err作为文件名。如果文件名没有扩展名,则加上.err扩展名。

--log-isam[=file]

将所有MyISAM更改记入该文件(只有调试MyISAM时才使用)。

--low-priority-updates

表修改(INSERTREPLACEDELETEUPDATE)比选择的优先级要低。也可以通过{INSERT | REPLACE | DELETE | UPDATE} LOW_PRIORITY ... 来降低某个查询的优先级来实现,或通过SET LOW_PRIORITY_UPDATES=1来更改一个线程的优先级。参见7.3.2节,“表锁定事宜”。

--one-thread

只使用一个线程(用于在Linux中调试)。只有服务器启用了调试,该选项才可用。

--open-files-limit=count

用来更改mysqld文件描述符的数量。如果没有设置或设置为0,则mysqld通过setrlimit()使用该值来保存文件描述符。如果该值为0,则mysqld 保存max_connections*5max_connections + table_cache*2(取较大者)个文件。如果mysqld给出你错误"打开的文件太多。",你应试试增加该值。

--pid-file=path

mysqld_safe使用的进程ID文件的路径。

--port=port_num, -P port_num

帧听TCP/IP连接时使用的端口号。


--safe-mode

跳过一些优化阶段。


--socket=path

在Unix中,该选项指定用于本地连接的Unix套接字文件。 默认值是/tmp/mysql.sock。在Windows中,该选项指定本地连接所使用的管道名。 默认值是MySQL


--sql-mode=value[,value[,value...]]

将MySQL设置为SQL模式。参见5.3.2节,“SQL服务器模式”。

--transaction-isolation=level

设置默认事务隔离级别,可以READ-UNCOMMITTEDREAD-COMMITTEE、REPEATABLE-READSERIALIZABLE。参见13.4.6节,“SET TRANSACTION语法”。

--tmpdir=path, -t path

创建临时文件的目录路径。默认/tmp目录在太小不能容纳临时表的分区时该选项很有用。该选项接受round-robin模式的几个路径。在Unix中路径应用冒号(‘:’) 间隔开,在Windows、NetWare和OS/2中用分号(‘’) 间隔开。

--user={user_name | user_id}, -u {user_name | user_id}

user_name或数字用户ID user_id运行mysqld服务器

--version-V

显示版本信息并退出。


5.3.2. SQL服务器模式

--sql-mode="modes" 选项启动 mysqld 设置默认 SQL 模式。如果你想要重设,该值还可以为空 ( --sql-mode ="" )
你还可以在启动后用 SET [SESSION|GLOBAL] sql_mode='modes' 语句设置 sql_mode 变量来更改 SQL 模式。

Modesis是用逗号(‘’)间隔开的一系列不同的模式。你可以用SELECT @@sql_mode语句查询当前的模式。默认值是空(没有设置任何模式)。

主要重要sql_mode值为:

·         ANSI

更改语法和行为,使其更符合标准SQL。

·         STRICT_TRANS_TABLES

如果不能将给定的值插入到事务表中,则放弃该语句。对于非事务表,如果值出现在单行语句或多行语句的第1行,则放弃该语句。本节后面给出了更详细的描述。

·         TRADITIONAL

Make MySQL的行为象“传统”SQL数据库系统。该模式的简单描述是当在列中插入不正确的值时“给出错误而不是警告”。释:一旦发现错误立即放弃INSERT/UPDATE。如果你使用非事务存储引擎,这种方式不是你想要的,因为出现错误前进行的数据更改不会“滚动”,结果是更新“只进行了一部分”。


下面描述了支持的所有模式:

·         ALLOW_INVALID_DATES

在严格模式下不要检查全部日期。只检查1到12之间的月份和1到31之间的日。这在Web应用程序中,当你从三个不同的字段获取年、月、日,并且想要确切保存用户插入的内容(不进行日期验证)时很重要。该模式适用于DATEDATETIME列。不适合TIMESTAMP列,TIMESTAMP列需要验证日期。

启用严格模式后,服务器需要合法的月和日,不仅仅是分别在1到12和1到31范围内。例如,禁用严格模式时'2004-04-31'是合法的,但启用严格模式后是非法的。要想在严格模式允许遮掩固定日期,还应启用ALLOW_INVALID_DATES

·         ANSI_QUOTES

将‘"’视为识别符引号(‘`’引号字符),不要视为字符串的引号字符。在ANSI模式,你可以仍然使用‘`’来引用识别符。启用ANSI_QUOTES后,你不能用双引号来引用字符串,因为它被解释为识别符。

·         ERROR_FOR_DIVISION_BY_ZERO

在严格模式,在INSERTUPDATE过程中,如果被零除(或MOD(X,0)),则产生错误(否则为警告)。如果未给出该模式,被零除时MySQL返回NULL。如果用到INSERT IGNOREUPDATE IGNORE中,MySQL生成被零除警告,但操作结果为NULL

·         HIGH_NOT_PRECEDENCE

NOT操作符的优先顺序是表达式例如NOT a BETWEEN b AND c被解释为NOT (a BETWEEN b AND c)。在一些旧版本MySQL中, 表达式被解释为(NOT a) BETWEEN b AND c。启用HIGH_NOT_PRECEDENCESQL模式,可以获得以前的更高优先级的结果。

mysql> SET sql_mode = '';
mysql> SELECT NOT 1 BETWEEN -5 AND 5;
        -> 0
mysql> SET sql_mode = 'broken_not';
mysql> SELECT NOT 1 BETWEEN -5 AND 5;
        -> 1

·         IGNORE_SPACE

允许函数名和‘(’之间有空格。强制将所有函数名视为保存的字。结果是,如果你想要访问保存为字的数据库、表或列名,你必须引用它。例如,因为有USER()函数,mysql数据库中的user表名和该表内的User列被保存下来,因此你必须引用它们:

SELECT "User" FROM mysql."user";

·         NO_AUTO_CREATE_USER

防止GRANT自动创建新用户,除非还指定了密码。

·         NO_AUTO_VALUE_ON_ZERO

NO_AUTO_VALUE_ON_ZERO影响AUTO_INCREMENT列的处理。一般情况,你可以向该列插入NULL0生成下一个序列号。NO_AUTO_VALUE_ON_ZERO禁用0,因此只有NULL可以生成下一个序列号。

如果将0保存到表的AUTO_INCREMENT列,该模式会很有用。(不推荐采用该惯例)。例如,如果你用mysqldump转储表并重载,MySQL遇到0值一般会生成新的序列号,生成的表的内容与转储的表不同。重载转储文件前启用NO_AUTO_VALUE_ON_ZERO可以解决该问题。mysqldump在输出中自动包括启用NO_AUTO_VALUE_ON_ZERO的语句。

·         NO_BACKSLASH_ESCAPES

禁用反斜线字符(‘\’)做为字符串内的退出字符。启用该模式,反斜线则成为普通字符。

·         NO_DIR_IN_CREATE

创建表时,忽视所有INDEX DIRECTORYDATA DIRECTORY指令。该选项对从复制服务器有用。

·         NO_ENGINE_SUBSTITUTION

如果需要的存储引擎被禁用或未编译,可以防止自动替换存储引擎。

·         NO_FIELD_OPTIONS

不要在SHOW CREATE TABLE的输出中打印MySQL专用列选项。该模式在可移植模式(portability mode)下用于mysqldump

·         NO_KEY_OPTIONS

不要在SHOW CREATE TABLE的输出中打印MySQL专用索引选项。该模式在可移植模式(portability mode)下用于mysqldump

·         NO_TABLE_OPTIONS

不要在SHOW CREATE TABLE的输出中打印MySQL专用表选项(例如ENGINE)。该模式在可移植模式(portability mode)下用于mysqldump

·         NO_UNSIGNED_SUBTRACTION

在减运算中,如果某个操作数没有符号,不要将结果标记为UNSIGNED。请注意这样使UNSIGNED BIGINT不能100%用于上下文中。参12.8节,“Cast函数和操作符”。

 

·         NO_ZERO_DATE

在严格模式,不要将 '0000-00-00'做为合法日期。你仍然可以用IGNORE选项插入零日期。在非严格模式,可以接受该日期,但会生成警告。

·         NO_ZERO_IN_DATE

在严格模式,不接受月或日部分为0的日期。如果使用IGNORE选项,我们为类似的日期插入'0000-00-00'。在非严格模式,可以接受该日期,但会生成警告。

·         ONLY_FULL_GROUP_BY

不要让GROUP BY部分中的查询指向未选择的列。

·         PIPES_AS_CONCAT

||视为字符串连接操作符(+)(同CONCAT()),而不视为OR

·         REAL_AS_FLOAT

REAL视为FLOAT的同义词,而不是DOUBLE的同义词。

·         STRICT_TRANS_TABLES

为所有存储引擎启用严格模式。非法数据值被拒绝。后面有详细说明。

·         STRICT_TRANS_TABLES

为事务存储引擎启用严格模式,也可能为非事务存储引擎启用严格模式。后面有详细说明。

严格模式控制MySQL如何处理非法或丢失的输入值。有几种原因可以使一个值为非法。例如,数据类型错误,不适合列,或超出范围。当新插入的行不包含某列的没有显示定义DEFAULT子句的值,则该值被丢失。

对于事务表,当启用STRICT_ALL_TABLESSTRICT_TRANS_TABLES模式时,如果语句中有非法或丢失值,则会出现错误。语句被放弃并滚动。

对于非事务表,如果插入或更新的第1行出现坏值,两种模式的行为相同。语句被放弃,表保持不变。如果语句插入或修改多行,并且坏值出现在第2或后面的行,结果取决于启用了哪个严格选项:

·         对于STRICT_ALL_TABLES,MySQL返回错误并忽视剩余的行。但是,在这种情况下,前面的行已经被插入或更新。这说明你可以部分更新,这可能不是你想要的。要避免这点,最好使用单行语句,因为这样可以不更改表即可以放弃。

·         对于STRICT_TRANS_TABLES,MySQL将非法值转换为最接近该列的合法值并插入调整后的值。如果值丢失,MySQL在列中插入隐式 默认值。在任何情况下,MySQL都会生成警告而不是给出错误并继续执行语句。13.1.5节,“CREATE TABLE语法”描述隐式默认值。

严格模式不允许非法日期,例如'2004-04-31'。它不允许禁止日期使用“零”部分,例如'2004-04-00'或“”日期。要想禁止,应在严格模式基础上,启用NO_ZERO_IN_DATENO_ZERO_DATE SQL模式。

如果你不使用严格模式(即不启用STRICT_TRANS_TABLESSTRICT_ALL_TABLES模式),对于非法或丢失的值,MySQL将插入调整后的值并给出警告。在严格模式,你可以通过INSERT IGNOREUPDATE IGNORE来实现。参见13.5.4.22节,“SHOW WARNINGS语法”。

下面的特殊模式快速组合了前面所列的模式。

其中包括大多数最新版本MySQL中的所有模式值。旧版本中,组合模式不包括新版本中没有的不适用的具体模式值。

·         ANSI

等同REAL_AS_FLOATPIPES_AS_CONCATANSI_QUOTESIGNORE_SPACE。参见1.8.3节,“在ANSI模式下运行MySQL”。

·         DB2

等同PIPES_AS_CONCATANSI_QUOTESIGNORE_SPACENO_KEY_OPTIONSNO_TABLE_OPTIONSNO_FIELD_OPTIONS

·         MAXDB

等同PIPES_AS_CONCATANSI_QUOTESIGNORE_SPACENO_KEY_OPTIONSNO_TABLE_OPTIONSNO_FIELD_OPTIONS、 NO_AUTO_CREATE_USER

·         MSSQL

等同PIPES_AS_CONCATANSI_QUOTESIGNORE_SPACENO_KEY_OPTIONSNO_TABLE_OPTIONS、 NO_FIELD_OPTIONS

·         MYSQL323

等同NO_FIELD_OPTIONSHIGH_NOT_PRECEDENCE

·         MYSQL40

等同NO_FIELD_OPTIONSHIGH_NOT_PRECEDENCE

·         ORACLE

等同PIPES_AS_CONCATANSI_QUOTESIGNORE_SPACENO_KEY_OPTIONSNO_TABLE_OPTIONSNO_FIELD_OPTIONSNO_AUTO_CREATE_USER

·         POSTGRESQL

等同PIPES_AS_CONCATANSI_QUOTESIGNORE_SPACENO_KEY_OPTIONSNO_TABLE_OPTIONSNO_FIELD_OPTIONS

·         TRADITIONAL

等同STRICT_TRANS_TABLES、STRICT_ALL_TABLES、NO_ZERO_IN_DATE、NO_ZERO_DATE、ERROR_FOR_DIVISION_BY_ZERO、NO_AUTO_CREATE_USER。


5.3.3. 服务器系统变量


5.3.3.1. 动态系统变量

服务器将维护许多表示其配置的系统变量。所有变量均有默认值。可以在命令行中或选项文件设置选项在服务器启动时对它们进行设置。大多数可以在运行时使用 SET 语句来设置

全局变量影响服务器的全局操作。会话变量影响具体客户端连接相关操作。

服务器启动时,将所有全局变量初始化为默认值。可以在选项文件或命令行中指定的选项来更改这些默认值。服务器启动后,通过连接服务器并执行 SET GLOBAL var_name 语句可以更改动态全局变量。要想更改全局变量,必须具有 SUPER 权限。


服务器还为每个客户端连接维护会话变量。连接时使用相应全局变量的当前值对客户端会话变量进行初始化。客户可以通过 SET SESSION var_name 语句来更改动态会话变量。


任何访问全局变量的客户端都可以看见对全局变量的更改。但是,它只影响在更改后连接的从该全局变量初始化相应会话变量的客户端。它不会影响已经连接上的客户端的会话变量 ( 甚至是执行 SET GLOBAL 语句的客户端 )

当使用启动选项设置变量时,变量值可以使用后缀 K M G 分别表示千字节、兆字节或 gigabytes
mysqld --key_buffer_size=16M

后缀的大小写没关系;16M16m是同样的。

运行时,使用SET语句来设置系统变量。此时,不能使用后缀,但值可以采取下列表达式:

mysql> SET sort_buffer_size = 10 * 1024 * 1024;

要想显式指定是否设置全局或会话变量,使用GLOBALSESSION选项:

mysql> SET GLOBAL sort_buffer_size = 10 * 1024 * 1024;
mysql> SET SESSION sort_buffer_size = 10 * 1024 * 1024;

两个选项均没有,则语句设置会话变量。


如果你想用 SET 语句限制系统变量可设的最大值,可以在服务器启动时通过 --maximum-var_name 形式的选项来指定。例如,要想防止 query_cache_size 的值运行时超过 32MB ,使用选项 --maximum-query_cache_size=32M


你可以通过 SHOW VARIABLES 语句查看系统变量及其值。

mysql> SHOW VARIABLES;


auto_increment_incrementauto_increment_offset用于主服务器-主服务器(master-to-master)复制,并可以用来控制AUTO_INCREMENT列的操作。两个变量均可以设置为全局或局部变量,并且假定每个值都可以为1到65,535之间的整数值。将其中一个变量设置为0会使该变量为1。如果试图将这些变量设置为大于65,535或小于0的值,则会将该值设置为65,535。如果向将auto_increment_incrementauto_increment_offset设置为非整数值,则会给出错误,并且变量的实际值在这种情况下保持不变。

这两个变量影响AUTO_INCREMENT列的方式:


o        auto_increment_increment控制列中的值的增量值。例如:

o                       mysql> SHOW VARIABLES LIKE 'auto_inc%';
o                       +--------------------------+-------+
o                       | Variable_name            | Value |
o                       +--------------------------+-------+
o                       | auto_increment_increment | 1     |
o                       | auto_increment_offset    | 1     |
o                       +--------------------------+-------+
o                       2 rows in set (0.00 sec)
o                      
o                       mysql> CREATE TABLE autoinc1 (col INT NOT NULL AUTO_INCREMENT PRIMARY KEY);
o                       Query OK, 0 rows affected (0.04 sec)
o                      
o                       mysql> SET @auto_increment_increment=10;
o                       Query OK, 0 rows affected (0.00 sec)
o                      
o                       mysql> SHOW VARIABLES LIKE 'auto_inc%';
o                       +--------------------------+-------+
o                       | Variable_name            | Value |
o                       +--------------------------+-------+
o                       | auto_increment_increment | 10    |
o                       | auto_increment_offset    | 1     |
o                       +--------------------------+-------+
o                       2 rows in set (0.01 sec)
o                      
o                       mysql> INSERT INTO autoinc1 VALUES (NULL), (NULL), (NULL), (NULL);
o                       Query OK, 4 rows affected (0.00 sec)
o                       Records: 4  Duplicates: 0  Warnings: 0
o                      
o                       mysql> SELECT col FROM autoinc1;
o                       +-----+
o                       | col |
o                       +-----+
o                       |   1 |
o                       |  11 |
o                       |  21 |
o                       |  31 |
o                       +-----+
o                       4 rows in set (0.00 sec)



o        auto_increment_offset确定AUTO_INCREMENT列值的起点。假定在与前面的例子的相同的会话中执行下面的命令:

o                       mysql> SET @auto_increment_offset=5;
o                       Query OK, 0 rows affected (0.00 sec)
o                      
o                       mysql> SHOW VARIABLES LIKE 'auto_inc%';
o                       +--------------------------+-------+
o                       | Variable_name            | Value |
o                       +--------------------------+-------+
o                       | auto_increment_increment | 10    |
o                       | auto_increment_offset    | 5     |
o                       +--------------------------+-------+
o                       2 rows in set (0.00 sec)
o                      
o                       mysql> CREATE TABLE autoinc2 (col INT NOT NULL AUTO_INCREMENT PRIMARY KEY);
o                       Query OK, 0 rows affected (0.06 sec)
o                      
o                       mysql> INSERT INTO autoinc2 VALUES (NULL), (NULL), (NULL), (NULL);
o                       Query OK, 4 rows affected (0.00 sec)
o                       Records: 4  Duplicates: 0  Warnings: 0
o                      
o                       mysql> SELECT col FROM autoinc2;
o                       +-----+
o                       | col |
o                       +-----+
o                       |   5 |
o                       |  15 |
o                       |  25 |
o                       |  35 |
o                       +-----+
o                       4 rows in set (0.02 sec)
o                      


如果 auto_increment_offset 的值大于 auto_increment_increment 的值,则 auto_increment_offset 的值被忽略。

如果其中一个或两个变量被更改了,然后更改插入到包含AUTO_INCREMENT列的表中的新行,结果可能看上去有问题,由于计算AUTO_INCREMENT系列值时没有考虑列内已经存在的值,并且插入的下一个值是列内最小的值,大于AUTO_INCREMENT列内已有的最大值。换句话说,数值的计算方法为:

auto_increment_offset+ N * auto_increment_increment


其中N为系列内的正整数值[1,2,3,...]。例如:

mysql> SHOW VARIABLES LIKE 'auto_inc%';
+--------------------------+-------+
| Variable_name            | Value |
+--------------------------+-------+
| auto_increment_increment | 10    |
| auto_increment_offset    | 5     |
+--------------------------+-------+
2 rows in set (0.00 sec)
 
mysql> SELECT col FROM autoinc1;
+-----+
| col |
+-----+
|   1 |
|  11 |
|  21 |
|  31 |
+-----+
4 rows in set (0.00 sec)
 
mysql> INSERT INTO autoinc1 VALUES (NULL), (NULL), (NULL), (NULL);
Query OK, 4 rows affected (0.00 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> SELECT col FROM autoinc1;
+-----+
| col |
+-----+
|   1 |
|  11 |
|  21 |
|  31 |
|  35 |
|  45 |
|  55 |
|  65 |
+-----+
8 rows in set (0.00 sec)

auto_increment_incrementauto_increment_offset所示的值可以生成系列5 + N * 10,即,[5,15,25,35,45,...]。在INSERTcol 列内最大的值为31,AUTO_INCREMENT数列的下一个值为35,因此col中插入的值从该点开始,结果如SELECT查询所示。


这些变量控制 MySQL 服务器上 all AUTO_INCREMENT 列的所有行为。

如果某个变量设为全局变量,则只有通过局部设置将全局值更改和覆盖后或 mysqld 重启后其作用方可改变;如果局部设置,则新值影响所有表的 AUTO_INCREMENT 列,在这个会话期间当前用户在这些表中插入了新行,除非在会话期间更改了这些值。

 back_log

MySQL有的主要连接请求的数量。当主MySQL线程在短时间内得到许多连接请求时发挥作用。主线程需要花一些时间(尽管很少)来检查连接并启动一个新线程。back_log值说明MySQL临时停止响应新请求前在短时间内可以堆起多少请求。如果你需要在短时间内允许大量连接,可以增加该数值。

换句话说,该值为“进”TCP/IP连接帧听队列的大小。操作系统有该队列自己的限制值。


 bdb_cache_size

BDB表缓存索引和行分配的缓冲区的大小。如果你不使用BDB表,你应用--skip-bdb启动mysqld以便不浪费该缓存。


 bdb_home

BDB表基准目录。应与datadir变量的值相同。


 bulk_insert_buffer_size

MyISAM 使用专用树状缓存来使INSERT ... SELECTINSERT ... VALUES (...)、(...)、 ...LOAD DATA INFILE的大块插入更快。该变量用每线程的字节数限制缓存树的大小。将它设置为0禁用优化。释:只有向非空表添加数据时才使用该缓存。 默认值是8MB。

character_set_client

来自客户端的语句的字符集。


collation_connection

连接字符集的校对规则。



 connect_timeout

mysqld服务器Bad handshake响应前等待连接包的秒数。


div_precision_increment

该变量说明用/操作符执行除操作的结果可增加的精确度的位数。 默认值是4。最小和最大值分别为0和30。下面的示例说明了增加 默认值的结果。

mysql> SELECT 1/7;
+--------+
| 1/7    |
+--------+
| 0.1429 |
+--------+
mysql> SET div_precision_increment = 12;
mysql> SELECT 1/7;
+----------------+
| 1/7            |
+----------------+
| 0.142857142857 |
+----------------+

expire_logs_days

二进制日志自动删除的天数。默认值为0,表示“没有自动删除”。启动时和二进制日志循环时可能删除。


init_connect

服务器为每个连接的客户端执行的字符串。字符串由一个或多个SQL语句组成。要想指定多个语句,用分号间隔开。例如,每个客户端开始时默认启用autocommit模式。没有全局服务器变量可以规定autocommit默认情况下应禁用,但可以用init_connect来获得相同的效果:

SET GLOBAL init_connect='SET AUTOCOMMIT=0';

还可以在命令行或选项文件中设置该变量。要想使用选项文件设置变量,应包括下述行:

[mysqld]
init_connect='SET AUTOCOMMIT=0'

请注意init_connect的内容并不为拥有SUPER权限的用户执行;实际是内容设置错误(包含错误查询,例如语法错误),这样使所有连接失败。不为SUPER用户执行,使SUPER用户可以打开连接并固定init_connect


init_file

启动服务器时用--init-file选项指定的文件名。文件中包含服务器启动时要执行的SQL语句。每个语句必须在同一行中并且不能包括注释。


join_buffer_size

用于完全联接的缓冲区的大小(当不使用索引的时候使用联接操作)。一般情况获得快速联接的最好方法是添加索引。当增加索引时不可能通过增加join_buffer_size值来获得快速完全联接。将为两个表之间的每个完全联接分配联接缓冲区。对于多个表之间不使用索引的复杂联接,需要多联接缓冲区。

language

错误消息所用语言。

max_join_size

不允许可能需要检查多于max_join_size行(为单个表语句)或行组合(为多个表语句)或可能执行大于max_join_size次硬盘查询的SELECT语句。通过设置该值,你可以捕获键使用不正确并可能花很长时间的SELECT语句。如果用户想要执行没有WHERE子句的花较长时间或返回数百万行的联接,则设置它。

将该变量设置为DEFAULT之外的值,将SQL_BIG_SELECTS的值重设为0如果你重新设置SQL_BIG_SELECTS值,max_join_size变量被忽略。

如果查询结果位于查询缓存中,则不检查结果大小,因为前面已经计算了结果,不会要求服务器将它发送给客户端。

该变量以前叫做sql_max_join_size

5.3.4. 服务器状态变量

服务器维护许多提供操作相关信息的状态变量。你可以通过 SHOW STATUS 语句查看这些变量和它们的值:

mysql> SHOW STATUS;

 Com_xxx

Com_xxx 语句计数变量表示每个xxx 语句执行的次数。每类语句有一个状态变量。例如,Com_deleteCom_insert分别统计DELETE 和INSERT语句执行的次数。


Com_stmt_xxx状态变量为:

o        Com_stmt_prepare

o        Com_stmt_execute

o        Com_stmt_fetch

o        Com_stmt_send_long_data

o        Com_stmt_reset

o        Com_stmt_close

这些变量代表准备好的语句命令。它们的名字对应网络层使用的COM_xxx 命令系列;换句话说:当准备好的语句API调用如mysql_stmt_prepare()mysql_stmt_执行()并执行时,它们的值增加。但是,当执行下面的SQL语句时,Com_stmt_prepareCom_stmt_executeCom_stmt_close也增加:PREPAREEXECUTEDEALLOCATE PREPARE。此外,旧(从MySQL 4.1.3起可用)语句计数变量Com_prepare_sqlCom_execute_sqlCom_dealloc_sql的值也随PREPAREEXECUTEDEALLOCATE PREPARE语句增加。Com_stmt_fetch代表通过光标获取的网络round-trips的总数量。

所有 Com_stmt_xxx 变量将增加,即使语句参数未知或执行过程中出现错误。换句话说,它们的值对应发出的请求数,而不是成功完成的请求数。


5.4. mysql_fix_privilege_tables:升级MySQL系统表


在Unix或Unix类系统中,运行mysql_fix_privilege_tables脚本来更新系统表:

shell> mysql_fix_privilege_tables

你必须在服务器运行时执行该脚本。它试图连接本机上用root运行的服务器。如果root账户需要密码,在命令行中按下述方法给出密码:

shell> mysql_fix_privilege_tables--password=root_password

mysql_fix_privilege_tables脚本可以执行将系统表转换为当前格式的任何动作。运行时你可能会看见一些Duplicate column name警告;你可以忽略它们。

运行完脚本后,停止服务器并重启。


在Windows系统中,MySQL分发包括mysql_fix_privilege_tables.sql SQL脚本,你可以用mysql客户端来运行。例如,如果MySQL安装到C:\Program Files\MySQL\MySQL Server 5.1,命令应为:

C:\> C:\Program Files\MySQL\MySQL Server 5.1\bin\mysql -u root -p mysql
mysql> SOURCE C:/Program Files/MySQL/MySQL Server 5.1/scripts/mysql_fix_privilege_tables.sql

如果安装到其它目录,相应地更改路径名


5.5. MySQL服务器关机进程

  1.  服务器关闭进程可以概括为:

    1.    启动关闭进程

    2.    服务器根据需要创建关闭线程

    3.    服务器停止接收新连接

    4.    服务器终止当前的活动

    5.    存储引擎被停掉或关闭

    6.    服务器退出

    下面是更详细的描述:

    1.    启动关闭进程。

    可以用多种方法启动服务器的关闭。例如,拥有SHUTDOWN权限的用户可以执行mysqladmin shutdown命令。mysqladmin可以用于所有支持MySQL的平台上。其它操作系统相关的关闭开始方法还可能有:在Unix中,当接收到SIGTERM信号后,服务器关闭。对于在Windows中作为服务运行的服务器,当服务管理器让它关闭时,则关闭。

    2.    服务器根据需要创建关闭线程。

    根据开始关闭的方式,服务器可以创建线程来处理关闭进程。如果客户端需要关闭,则创建关闭线程。如果收到SIGTERM信号后关闭,信号线程可以自己关闭,或者创建单独的线程来完成。如果服务器尝试创建关闭线程而不能创建(例如,如果内存被耗尽),它在错误日志中给出诊断消息:

    Error: Can't create thread to kill server

    3.    服务器停止接收新连接。

    在关闭过程中要想防止启动新活动,服务器停止接收新的客户端连接。它将关闭它帧听的网络连接:TCP/IP端口、Unix套接字文件、Windows命名管道和在Windows中的共享内存。

    4.    服务器终止当前的活动。

    对于每个与客户端连接相关的线程,与客户端的连接被中断,线程被标记为“杀掉的”。当线程注意到此类标记后则线程终止。空闲连接的线程很快终止。当前正处理查询的线程定期检查它们的状态,终止的时间较长。关于线程终止的详细信息,参见13.5.5.3节,“KILL语法”,特别是关于对MyISAM表的杀掉的REPAIR TABLEOPTIMIZE TABLE操作。

    对于有打开事务的线程,事务被回滚。请注意如果某个线程正在更新非事务表,多行UPDATEINSERT等操作会使表部分更新,因为操作在完成前会终止。

    如果服务器是主复制服务器,与当前连接的从服务器相关的线程的处理方式同其它客户端线程。即每个线程被标记为杀掉的,在下次检查他的状态后会退出。

    如果服务器是从复制服务器,在客户端线程标记为杀掉的之前,激活的I/O和SQL线程被停止。SQL线程允许先结束它当前的语句(以避免造成复制问题)然后停止。如果此时SQL线程正位于事务中部,事务则 回滚。

    5.    存储引擎被停掉或关闭。

    在该阶段,表缓存被清空,所有打开的表被关闭。

    每个存储引擎执行它管理的表需要的任何动作。例如,MyISAM清空任何挂起的表索引写操作。InnoDB将它的缓冲池清空到硬盘上(除非innodb_fast_shutdown为2),将当前的LSN写入表内,并终止自己的内部线程。

    6.    服务器退出。

5.6. 一般安全问题

5.6.1. 通用安全指南

MySQL 根据访问控制列表 (ACL) 对所有连接、查询和其它用户尝试执行的操作进行安全管理。 MySQL 客户端和服务器之间还支持 SSL- 加密连接。

运行MySQL时,应尽量遵从下面的指导:

·         不要让任何人(除了MySQL root账户)访问mysql数据库中的user表!这很关键。加密的密码才是MySQL中的真正的密码。知道user表中所列的密码并且能访问该账户客访问的主机的人可以很容易地用该用户登录

·         学习MySQL访问权限系统。用GRANTREVOKE语句来控制对MySQL的访问。不要授予超过需求的权限。决不能为所有主机授权。

检查清单:

o        试试mysql -u root。如果你能够成功连接服务器而没有要任何密码,则说明有问题。任何人可以作为MySQLroot用户用它的全部权限来连接MySQL服务器!查阅MySQL安装说明,应特别注意关于设置root密码的信息。参见2.9.3节,“使初始MySQL账户安全”。

o        通过SHOW GRANTS语句检查查看谁已经访问了什么。然后使用REVOKE语句删除不再需要的权限。

·         不要将纯文本密码保存到数据库中。如果你的计算机有安全危险,入侵者可以获得所有的密码并使用它们。相反,应使用MD5()、SHA1()或单向哈希函数。

·         不要从词典中选择密码。有专门的程序可以破解它们。即使象“xfish98”这样的密码也很差。而“duag98”要好得多,虽然包含了相同的字“fish”,但从标准QWERTY键盘向左输入。另一种方法是使用“Mhall”,来自句子“Mary had a little lamb.”中每个字的第一个字符。这样很容易记住并输入,但是不知道的人很难猜出来。

·         购买防火墙。这样可以保护你防范各种软件中至少50%的各种类型的攻击。把MySQL放到防火墙后或隔离区(DMZ)。

检查清单:

o        试试从Internet使用nmap工具扫描端口。MySQL默认使用端口3306。不应从不可信任主机访问该端口。另一种检查是否MySQL端口打开的简单方式是从远程机器试试下面的命令,其中server_host是MySQL服务器运行的主机:

o                     shell> telnet server_host 3306

如果得到连接并得到一些垃圾字符,则端口打开着,则应从防火墙或路由器上关闭,除非你有合理的理由让它开着。如果telnet挂起或连接被拒绝,则端口被阻塞,这是你所希望的。

不要信任应用程序的用户输入的任何数据。它们可以用Web形式、URL或构建的应用程序输入特殊或逃溢字符序列来尝试欺骗你的代码。如果某个用户输入“; DROP DATABASE mysql;”等内容,应确保你的应用程序保持安全。这是特例,但当黑客使用类似技术时,如果你没有做好准备,结果可能会出现大的安全漏洞和数据丢失。

一个常见的错误是只保护字符串数据值。一定要记住还应检查数字数据。如果当用户输入值234时,应用程序生成查询SELECT * FROM table WHERE ID=234,用户可以输入值234 OR 1=1使应用程序生成查询SELECT * FROM table WHERE ID=234 OR 1=1。结果是服务器查找表内的每个记录。这样会暴露每个记录并造成过多的服务器负载。保护防范这类攻击的最简单的方法是使用单引号将数字常量引起来:SELECT * FROM table WHERE ID='234'。如果用户输入其它信息,均变为字符串的一部分。在数字部分,MySQL自动将字符串转换为数字并剥离字符串包含的附加的非数字字符。

有时候人们会认为如果数据库只包含供公共使用的数据,则不需要保护。这是不正确的。即使允许显示数据库中的任何记录,你仍然应保护防范拒绝服务攻击(例如,基于前面段落中所述的技术的攻击,会使服务器浪费资源)。否则,你的服务器不再响应合法用户。

检查清单:

o        试试用Web形式输入单引号和双引号(‘'’和‘"’)。如果得到任何形式的MySQL错误,立即分析原因。

o        试试修改动态URL,可以在其中添加%22(‘"’)、%23(‘#’)和%27(‘'’)。

o        试试在动态URL中修改数据类型,使用前面示例中的字符,包括数字和字符类型。你的应用程序应足够安全,可以防范此类修改和类似攻击。

o        试试输入字符、空格和特殊符号,不要输入数值字段的数字。你的应用程序应在将它们传递到MySQL之前将它们删除或生成错误。将未经过检查的值传递给MySQL是很危险的!

o        将数据传给MySQL之前先检查其大小。

o        用管理账户之外的用户名将应用程序连接到数据库。不要给应用程序任何不需要的访问权限。

·         许多应用程序编程接口提供了措施逃逸数据值中的特殊字符。如果使用正确,可以防止应用程序用户输入使应用程序生成不期望的效果的语句的数值:

o        MySQL C API:使用mysql_real_escape_string() API调用。

o        MySQL++:查询流使用escapequote修订符。

o        PHP:使用mysql_escape_string()函数基于MySQL C API中的同名函数。(在PHP 4.0.3之前,使用addslashes())。在PHP 5中,可以使用mysqli扩展名,它支持改进的MySQL鉴定协议和密码,以及用占位符编写的语句。

o        Perl DBI:使用quote()方法或使用占位符。

o        Java JDBC:使用一个PreparedStatement对象和占位符。

其它编程接口有类似的功能。

·         不要通过Internet传送明文(未加密的)数据。该信息可以被有足够时间和能力来截取它并用于个人目的的任何人访问。相反,应使用加密协议,例如SSL或SSH。MySQL支持内部SSL连接,例如版本 4.0.0。可以使用SSH端口映射为通信创建加密(并压缩)的隧道。

·         学会使用tcpdumpstrings工具。在大多数情况下,你可以使用下面的命令检查是否MySQL数据流未加密:

·                shell> tcpdump -l -i eth0 -w - src or dst port 3306 | strings

(该命令在Linux中可以工作,在其它系统中经过小小的修改后应可以工作)。 警告:如果你没有看见明文数据,并不一定说明信息实际上被加密了。如果你需要较高级别的安全,你应咨询安全专家。


5.6.2. 使MySQL在攻击者面前保持安全

当你连接到 MySQL 服务器时,你应使用一个密码。

所有其它信息以文本传送,可以被可以看到连接的任何人读取。如果你担心这个,你可以使用压缩协议来使通信更难以解密。
要想使连接更加安全,你应使用 SSH 来获得加密的 MySQL 服务器和 MySQL 客户端之间的 TCP/IP 连接。
还可以使用 MySQL 内部 OpenSSL 支持。

为了使MySQL系统安全,强烈要求你考虑下列建议:

·         对所有MySQL用户使用密码。客户端程序不需要知道运行它的人员的身份。对于客户端/服务器应用程序,用户可以指定客户端程序的用户名。例如,如果other_user没有密码,任何人可以简单地用mysql -u other_user db_name冒充他人调用mysql程序进行连接。如果所有用户有密码,使用其它用户的账户进行连接要困难得多。

要想更改用户的密码,应使用SET PASSWORD语句。还可以直接更新mysql数据库中的user表。例如,要更改所有root用户的MySQL账户的密码,应:

shell> mysql -u root
mysql> UPDATE mysql.user SET Password=PASSWORD('newpwd')
    -> WHERE User='root';
mysql> FLUSH PRIVILEGES;

·         绝对不要作为Unix的root用户运行MySQL服务器。这样做非常危险,因为任何具有FILE权限的用户能够用root创建文件(例如,~root/.bashrc)。为了防止,mysqld拒绝用root运行,除非使用--user=root选项明显指定。

应可以(并且应该)用普通非特权用户运行mysqld。你可以创建独立的Unix中的mysql账户来以便使所有内容更加安全。该账户只用于管理MySQL。要想用其它Unix用户启动mysqld,增加user选项指定/etc/my.cnf选项文件或服务器数据目录的my.cnf选项文件中的[mysqld]组的用户名。例如:

[mysqld]
user=mysql

该命令使服务器用指定的用户来启动,无论你手动启动或通过mysqld_safemysql.server启动。详细信息参见A.3.2节,“如何以普通用户身份运行MySQL”。

作为其它Unix用户而不用root运行mysqld,你不需要更改user表中的root用户名,因为MySQL账户的用户名与Unix账户的用户名无关。

·         不要允许使用表的符号链接。(可以用--skip-symbolic-links选项禁用)。如果你用root运行mysqld则特别重要,因为任何对服务器的数据目录有写访问权限的人则能够删除系统中的任何文件!参见7.6.1.2节,“在Unix平台上使用表的符号链接”。

·         确保mysqld运行时,只使用对数据库目录具有读或写权限的Unix用户来运行。

·         不要将PROCESSSUPER权限授给非管理用户。mysqladmin processlist的输出显示出当前执行的查询正文,如果另外的用户发出一个UPDATE user SET password=PASSWORD('not_secure')查询,被允许执行那个命令的任何用户可能看得到。

mysqld为有SUPER权限的用户专门保留一个额外的连接,因此即使所有普通连接被占用,MySQL root用户仍可以登录并检查服务器的活动。

可以使用SUPER权限来终止客户端连接,通过更改系统变量的值更改服务的器操作,并控制复制服务器。

·         

不要向非管理用户授予FILE权限。有这权限的任何用户能在拥有mysqld守护进程权限的文件系统那里写一个文件!为了更加安全,由SELECT ... INTO OUTFILE生成的所有文件对每个人是可写的,并且你不能覆盖已经存在的文件。


file权限也可以被用来读取任何作为运行服务器的Unix用户可读取或访问的文件。使用该权限,你可以将任何文件读入数据库表。这可能被滥用,例如,通过使用LOAD DATA装载“/etc/passwd”进一个数据库表,然后能用SELECT显示它。


·         如果你不信任你的DNS,你应该在授权表中使用IP数字而不是主机名。在任何情况下,你应该非常小心地使用包含通配符的主机名来创建 授权表条目!


·         如果你想要限制单个账户允许的连接数量,你可以设置mysqld中的max_user_connections变量来完成。GRANT语句也可以支持 资源控制选项来限制服务器对一个账户允许的使用范围。参见13.5.1.3节,“GRANT和REVOKE语法”。

5.6.3. Mysqld安全相关启动选项

下列mysqld选项影响安全:

·         --allow-suspicious-udfs

该选项控制是否可以载入主函数只有xxx符的用户定义函数。默认情况下,该选项被关闭,并且只能载入至少有辅助符的UDF。这样可以防止从未包含合法UDF的共享对象文件载入函数。参见27.2.3.6节,“用户定义函数安全注意事项”。

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

如果用--local-infile=0启动服务器则客户端不能使用LOCAL in LOAD DATA语句。参见5.6.4节,“LOAD DATA LOCAL安全问题”。

·         --old-passwords

强制服务器为新密码生成短(pre-4.1)密码哈希。当服务器必须支持旧版本客户端程序时,为了保证兼容性这很有用。参见5.7.9节,“MySQL 4.1中的密码哈希处理”。

·         (OBSOLETE--safe-show-database

在以前版本的MySQL中,该选项使SHOW DATABASES语句只显示用户具有部分权限的数据库名。在MySQL 5.1中,该选项不再作为现在的 默认行为使用,有一个SHOW DATABASES权限可以用来控制每个账户对数据库名的访问。参见13.5.1.3节,“GRANT和REVOKE语法”。

·         --safe-user-create

如果启用,用户不能用GRANT语句创建新用户,除非用户有mysql.user表的INSERT权限。如果你想让用户具有授权权限来创建新用户,你应给用户授予下面的权限:

mysql> GRANT INSERT(user) ON mysql.user TO 'user_name'@'host_name';

这样确保用户不能直接更改权限列,必须使用GRANT语句给其它用户授予该权限。

·         --secure-auth

不允许鉴定有旧(pre-4.1)密码的账户。

·         --skip-grant-tables

这个选项导致服务器根本不使用权限系统。这给每个人以完全访问所有的数据库的权力!(通过执行mysqladmin flush-privilegesmysqladmin reload命令,或执行FLUSH PRIVILEGES语句,你能告诉一个正在运行的服务器再次开始使用授权表。)  

·         --skip-name-resolve

主机名不被解析。所有在授权表的Host的列值必须是IP号或localhost

·         --skip-networking

在网络上不允许TCP/IP连接。所有到mysqld的连接必须经由Unix套接字进行。

·         --skip-show-database

使用该选项,只允许有SHOW DATABASES权限的用户执行SHOW DATABASES语句,该语句显示所有数据库名。不使用该选项,允许所有用户执行SHOW DATABASES,但只显示用户有SHOW DATABASES权限或部分数据库权限的数据库名。请注意全局权限指数据库的权限。

5.6.4. LOAD DATA LOCAL安全问题

LOAD DATA语句可以装载服务器主机上的文件,若指定LOCAL关键字,可以装载客户端文件。

支持LOCAL版本的LOAD DATA语句有两个可能的安全问题:

·         由MySQL服务器启动,文件从客户端向服务器主机的传输。理论上,打过补丁的服务器可以告诉客户端程序传输服务器选择的文件,而不是客户用LOAD DATA语句指定的文件。这样服务器可以访问客户端上客户有读访问权限的任何文件。

·         在Web环境中,客户从Web服务器连接,用户可以使用LOAD DATA LOCAL来读取Web服务器进程有读访问权限的任何文件(假定用户可以运行SQL服务器的任何命令)。在这种环境中,MySQL服务器的客户实际上是Web服务器,而不是连接Web服务器的用户运行的程序。

要处理这些问题,我们更改了MySQL 3.23.49和MySQL 4.0.2(Windows中的4.0.13)中的LOAD DATA LOCAL的处理方法:

·         默认情况下,现在所有二进制分中的发MySQL客户端和库是用--enable-local-infile选项编译,以便与MySQL 3.23.48和以前的版本兼容。

·         如果你从源码构建MySQL但没有使用--enable-local-infile选项来进行configure,则客户不能使用LOAD DATA LOCAL,除非显式调用mysql_options (...MYSQL_OPT_本地_INFILE,0)。参见25.2.3.48节,“mysql_options()”。

·         你可以用--local-infile=0选项启动mysqld从服务器端禁用所有LOAD DATA LOCAL命令。

·         对于mysql命令行客户端,可以通过指定--local-infile[=1]选项启用LOAD DATA LOCAL,或通过--local-infile=0选项禁用。类似地,对于mysqlimport--localor -L选项启用本地数据文件装载。在任何情况下,成功进行本地装载需要服务器启用相关选项。

·         如果你使用LOAD DATA LOCAL Perl脚本或其它读选项文件中的[client]组的程序,你可以在组内添加local-infile=1选项。但是,为了方便不理解local-infile的程序产生问题,则规定使用loose- prefix:

·                [client]
·                loose-local-infile=1

·         如果LOAD DATA LOCAL INFILE在服务器或客户端被禁用,试图执行该语句的客户端将收到下面的错误消息:

ERROR 1148: The used command is not allowed with this MySQL version



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值