本文介绍mysql服务器mysqld,以及几个用来启动mysql服务器的程序。
1.mysqld — mysql服务器
mysqld,也叫mysql服务器,其为mysql安装时完成大部分工作的主程序。mysql服务器管理对包含数据库和表的数据目录的存取。数据目录也是像日志文件和状态文件等其他信息的默认位置。
--注意:
某些安装包包含叫做mysqld-debug的服务器的调试版本。运行这个而版本而不是mysqld主要为了调试,内存分配检查,及跟踪文件支持等。当mysql服务器启动时,其将监听来自客户端程序的网络连接并管理客户端对数据库的存取操作。
mysqld启动时可以确定很多选项。为了获取这些选项的完整列表,可以运行如下命令:
shell> mysqld --verbose --help
mysql服务器也有一套运行时影响其操作的系统变量。系统变量能在服务器启动时进行设置,其中很多能在运行时进行更改并对服务器进行动态配置。mysql服务器也有一套用于提供其操作信息的状态变量。你可以通过监控这些状态变量来获取服务器运行时的性能特征。
2.mysqld_safe — mysql服务器启动脚本
mysqld_safe是unix上被推荐使用的启动mysqld服务器的方法。mysqld_safe会增加一些像错误发生时重启服务器并将运行时信息记录到错误日志的安全特点。
--注意:
某些linux平台,通过RPM或debian包安装的mysql包括systemd支持,以用于管理mysql服务器启动和关闭。这些平台上,因为没必要而不会安装mysqld_safe。
mysqld_safe试着启动叫做mysqld的可执行程序。为了覆盖默认行为并显式确定你想运行的服务器名字,可以为mysqld_safe确定--mysqld或--mysqld-version选项。你也能用--ledir选项来指定mysqld_safe寻找mysql服务器的目录。
mysqld_safe和mysqld有很多选项一样。当在命令行为mysqld_safe提供其不能识别的选项时,其将这些选项传递给mysqld。如果这些选项在选项文件的[mysqld_safe]组被确定,则这些选项被忽略。
mysqld_safe将读取选项文件的[mysqld],[server]和[mysqld_safe]组。例如:如果你像如下确定[mysqld]部分,mysqld_safe将发现和使用--log-error选项:
[mysqld]
log-error=error.log
为了向后兼容,mysqld_safe也会读取[safe_mysqld]组,但为了保持最新,需要将其重新命名为[mysqld_safe]。
mysqld_safe可以在命令行和选项文件中确定选项,具体如下列描述的这些选项。
表-1 mysqld_safe选项
Format Description Introduced
--basedir Path to MySQL installation directory
--core-file-size Size of core file that mysqld should be able to create
--datadir Path to data directory
--defaults-extra-file Read named option file in addition to usual option files
--defaults-file Read only named option file
--help Display help message and exit
--ledir Path to directory where server is located
--log-error Write error log to named file
--malloc-lib Alternative malloc library to use for mysqld
--mysqld Name of server program to start (in ledir directory)
--mysqld-safe-log-timestamps Timestamp format for logging 5.7.11
--mysqld-version Suffix for server program name
--nice Use nice program to set server scheduling priority
--no-defaults Read no option files
--open-files-limit Number of files that mysqld should be able to open
--pid-file Path name of server process ID file
--plugin-dir Directory where plugins are installed
--port Port number on which to listen for TCP/IP connections
--skip-kill-mysqld Do not try to kill stray mysqld processes
--skip-syslog Do not write error messages to syslog; use error log file
--socket Socket file on which to listen for Unix socket connections
--syslog Write error messages to syslog
--syslog-tag Tag suffix for messages written to syslog
--timezone Set TZ time zone environment variable to named value
--user Run mysqld as user having name user_name or numeric user ID user_id
--help Display a help message and exit.
如果用--defaults-file或--defaults-extra-file选项为mysqld_safe指定一个选项文件,选项必须为命令行的第一个选项,否则,将不会使用该选项文件。例如:下面的命令将不会使用指定的选项文件:
mysql> mysqld_safe --port=port_num --defaults-file=file_name
相反,用下面的命令将会使用指定的选项文件:
mysql> mysqld_safe --defaults-file=file_name --port=port_num
mysqld_safe通常用于启动通过源码编译或二进制发布包安装的mysql服务器,即使这些发布方式安装的mysql服务器稍有不同。mysqld_safe下列条件之一是真的:
1)如果能在相对于工作目录(mysqld_safe被运行的目录)的位置发现服务器和数据库。对二进制发布包,mysqld_safe在其工作目录下寻找bin和data目录。对源码发布,其将libexec和var目录。如果你从mysql安装目录运行mysqld_safe,这些条件能被满足(例如:二进制发布的工作目录为/usr/local/mysql)。
2)如果工作目录的相对目录不能发现服务器和数据库,mysqld_safe将试图通过绝对路径名定位它们。典型的目录为/usr/local/libexec和/usr/local/var。实际位置取决于分不包编译时指定的具体值。
如果mysql安装在配置指定的位置,那么,这将是正确的。因为,mysqld_safe试图在相对于自己工作目录的位置寻找服务器和数据库,只要你从mysql安装目录运行mysqld_safe,你可以将mysql二进制发布包安装到任何位置。
shell> cd mysql_installation_directory
shell> bin/mysqld_safe &
如果mysqld_safe启动失败了,甚至从mysql安装目录启动,那么,确定--ledir和--datadir选项来指定系统上mysql服务器和数据库所在的目录。
mysqld_safe试图用睡眠和日期系统功能来决定每秒试图启动多少次。如果该功能可用且每秒试图启动次数大于次,mysqld_safe再次启动前将会等待1整秒的时间。这是为了防止mysqld_safe启动失败时过度消耗CPU资源。
当用mysqld_safe启动mysqld时,mysqld_safe将把自己和mysqld的错误(和注意)信息放于同样的位置。
有几个mysqld_safe用于控制这些信息目的地的选项:
1)--log-error=file_name:将错误信息写至命名的错误文件。
2)--syslog: 将错误信息写至系统上支持日志程序的syslog。
3)--skip-syslog: 并不将错误信息写于syalog。信息将会被写入默认的错误日志文件(数据目录中的host_name.err),或如果--log-error被配置则写入某个命名的文件。如果这些选项都没配置,则默认配置将是--skip-syslog。
当mysqld_safe写一个信息时,注意(notice)将写入日志目的地(syslog或错误日志文件)和标准输出(stdout)。错误将输出到日志目的地和标准错误。
--注意
从mysqld_safe控制mysqld日志从mysql5.7.5被弃用。而是用服务器的内部syslog支持替代。
3.mysql.server — mysql服务器的启动脚本
unix和类unix系统上的mysql发布包包括叫做mysql.server的脚本,其使用mysqld_safe来启动mysql服务器。该脚本可用于使用system v风格运行目录的linux和saloris系统上。也被用于macOS上mysql的启动项。
mysql.server为用于mysql源码树中的脚本名。其安装名也许是不同的。例如:mysqld或mysql。下面的讨论中,将mysql.server名字调整为你系统中的合适的名字。
注意:
某些linux平台上,RPM或debian安装的mysql包括systemd支持,以用于管理mysql服务器的启动和关闭。这些平台上,因为没必要而不mysql.server和mysqld_safe。
为了用mysql.server脚本手工启动和停止服务器,从命令行运行带start和stop参数的mysql.server:
shell> mysql.server start
shell> mysql.server stop
mysql.server将位置改变到mysql的安装目录,接着,运行mysqld_safe。为了以某个特定用户运行服务器,在全局/etc/my.cnf选项文件的[mysqld]组增加合适的用户选项,就像该部分后面叙述的那样。
(如果你已经在某个非标准位置安装了一个二进制mysql,可能你必须编辑mysql.server。在你运行mysqld_safe前将其位置修改到正确的目录。如果你做了这些修改,如果将来你升级mysql,你修改过的mysql.server版本也许被覆盖掉。因此,需要对你可能重新安装的编辑过的版本进行一个备份。
mysql.server通过发送一个信号来停止服务器。你也可以通过执行mysqladmin shutdown来手工的停止服务器。
为了自动启动和停止和停止mysql服务器,你必须将启动和停止命令加到/etc/rc*文件的合适位置:
1)如果你用linux服务器RPM包(mysql-server-version.rpm),或内部linux安装包,mysql.server脚本也许以mysqld或mysql名字安装在/etc/init.d目录。
2)如果你源码包或二进制包安装mysql,并没有自动安装mysql.server,你可以手工安装该脚本。可以在mysql安装目录或源码树下的support文件目录发现该脚本。将该脚本用mysql名字拷贝至/etc/init.d目录,并赋予执行权限:
shell> cp mysql.server /etc/init.d/mysql
shell> chmod +x /etc/init.d/mysql
安装该脚本后,系统启动时激活其运行的命令依赖于你的操作系统。linux上,你可以用chkconfig:
shell> chkconfig --add mysql
某些linux系统上,下面的命令也许是完全启用该mysql脚本所必须的:
shell> chkconfig --level 345 mysql on
3)freebsd上,启动脚本一般在/usr/local/etc/rc.d/下。将mysql.server脚本安装为/usr/local/etc/rc.d/mysql.server.sh将开启自动启动。rc(8)手册页声明该目录下的脚本只有其基础名字与*.sh shell文件名模式匹配才会被执行。出现于该目录下的任何其他文件或目录将会被静默忽略掉。
4)作为前述设置的替代,某些操作系统启动时也使用/etc/rc.local或/etc/init.d/boot.local来启动另外的服务。为了用该方法启动mysql,将下述命令附加到合适的启动文件中:
/bin/sh -c 'cd /usr/local/mysql; ./bin/mysqld_safe --user=mysql &'
5)对其他系统,查阅你的操作系统文档来了解如何安装启动脚本。mysql.server将会读取选项文件的[mysql.server]和[mysqld]组。为了向后兼容,其也会读取[mysql_server]组,但为了保持最新,你应该将其重命名为[mysql.server]。
你可以往全局/etc/my.cnf文件中为mysql.server增加选项,典型的my.cnf文件也许如下所示:
[mysqld]
datadir=/usr/local/mysql/var
socket=/var/tmp/mysql.sock
port=3306
user=mysql
[mysql.server]
basedir=/usr/local/mysql
mysql.server脚本支持下表中的选项。如果指定,必须在选项文件中确定,而不是在命令行中。mysql.server命令行只支持start和stop参数。
表-2 mysql.server 选项文件选项
Option Name Description Type
basedir Path to MySQL installation directory directory name
datadir Path to MySQL data directory directory name
pid-file File in which server should write its process ID file name
servicestartup-timeout How long to wait for server startup integer
4. mysqld_multi — 管理多个mysql服务器
mysqld_multi设计用来管理几个在不同unix套接字文件和TCP/IP端口监听连接的mysqld进程。其可以启动和停止服务器,或报告它们的当前状态。
注意:
某些linux平台上,RPM或debian包安装的mysql包括systemd支持,以用于管理mysql服务器启动和关闭。在这些平台上,因为不需要而不安装mysqld_multi。
mysqld_multi在my.cnf(或在--default-file选项指定的文件中)寻找名字为[mysqldN]的组。N可以是任何正整数。这个数在下面的讨论中被参考为选项组号,或GNR。
组号区别不同组间的选项组,并被用作mysqld_multi的参数来指定你想启动,停止或得到其状态报告的服务器。这些选项组中列出的选项和你在[mysqld]组中用于启动mysqld的选项是一样的。
然而,当用多个服务器时,每个服务器用其自己像unix套接字文件和TCP/IP的选项值是必须的。
为了运行mysqld_multi,用下面的语法:
shell> mysqld_multi [options] {start|stop|reload|report} [GNR[,GNR] ...]
启动,停止,重载(停止和重启)和报告指定要执行的操作。你能为一个或多个服务器执行指定的操作,这取决于选项名后面跟的GNR列。如果没有GNR列,mysqld_multi将为选项文件中的所有服务器执行该操作。
每个GNR值表示一个选项组号或选项组号范围。该值将是选项文件中组名字末尾的数字。例如:组名[mysqld17]的GNR为17。为了确定一个数字范围,用一个破折号将第一个和最后一个数字隔开。GNR值10-13表示从[mysqld10]到[mysqld13]的组。在命令行通过逗号指定多个组或组范围。GNR列中一定不要有空格字符(空格或tab);空格字符后的一切都将被忽略。
如下命令将用[mysqld17]选项组启动单个服务器:
shell> mysqld_multi start 17
如下命令分别用[mysqld8]和[mysqld10]到[mysqld13]选项组停止几个服务器:
shell> mysqld_multi stop 8,10-13
作为如何设置选项文件的一个例子,用如下命令:
shell> mysqld_multi --example
mysqld_multi按照如下搜索选项文件:
1)带--no-defaults,不读取选项文件。
2)带--default-file=file_name,只读取指定的文件。
3)否则,标准位置列表中的选项文件被读取,包括--default-extra-file=file_name选项指定的任何文件,如果有的话。(如果如果选项被多次给出,将使用最后的值。)
选项文件读取将搜索[mysqld_multi]和[mysqldN]选项组。[mysqld_multi]组能用于mysqld_multi自己的选项。[mysqldN]组能用于传给特定mysqld实例的选项。
[mysqld]或[mysqld_safe]组能用于mysqld或mysqld_safe所有实例的通用选项。你能用--defaults-file=file_name选项来为特定实例指定不同的配置文件,这种情况下,该文件中[mysqld]或[mysqld_safe]组将用于该实例。mysql_multi支持如下选项:
1)--help:Display a help message and exit.
2)--example:Display a sample option file.
3)--log=file_name:Specify the name of the log file. If the file exists, log output is appended to it.
4)--mysqladmin=prog_name:The mysqladmin binary to be used to stop servers.
5)--mysqld=prog_name:The mysqld binary to be used. Note that you can specify mysqld_safe as the value for this option
also. If you use mysqld_safe to start the server, you can include the mysqld or ledir options
in the corresponding [mysqldN] option group. These options indicate the name of the server that
mysqld_safe should start and the path name of the directory where the server is located.
Example:
[mysqld38]
mysqld = mysqld-debug
ledir = /opt/local/mysql/libexec
6)--no-log:Print log information to stdout rather than to the log file. By default, output goes to the log file.
7)--password=password:The password of the MySQL account to use when invoking mysqladmin. Note that the password value is not optional for this option, unlike for other MySQL programs.
8)--silent:Silent mode; disable warnings.
9)--tcp-ip:Connect to each MySQL server through the TCP/IP port instead of the Unix socket file. (If a socket file is missing, the server might still be running, but accessible only through the TCP/IP port.) By default,
connections are made using the Unix socket file. This option affects stop and report operations.
10)--user=user_name:The user name of the MySQL account to use when invoking mysqladmin.
11)--verbose:Be more verbose.
12) --version:Display version information and exit.
有关mysqld_multi的注意:
1)最重要的:使用mysqld_multi前,确定已经理解传递给mysqld服务器的选项的意义,以及为什么选择使用多个独立的mysqld进程。清楚多个mysqld服务器共用同一个数据目录的危险性。
除非你知道你在做什么,一定使用单独的数据目录。用同一个数据目录并不能给线程系统额外的性能。此外,确信每个服务器的数据目录对mysqld进程启动时的unix账户是完全可存取的。
不要用unix的root账户,除非你知道正在做什么。
2)确信每个服务器使用同样的用户名和密码来停止mysqld服务器(用mysqladmin程序)。同时,也确定该用户有shutdown权限。如果你管理的服务器有不同的用户名和密码,也许你想为它们创建相同的用户名和密码。例如:你也许通过如下命令来为所有服务器创建一个通用multi_admin账号:
shell> mysql -u root -S /tmp/mysql.sock -p
Enter password:
mysql> CREATE USER 'multi_admin'@'localhost' IDENTIFIED BY 'multipass';
mysql> GRANT SHUTDOWN ON *.* TO 'multi_admin'@'localhost';
你必须在每个mysqld服务器上运行如上命令。当连接每个服务器时再改变不同的连接参数。注意,账号的主机名部分必须允许你运行mysqld_multi的主机连接。
3)每个mysqld服务器必须拥有不同的unix套接字文件和TCP/IP端口号。(另外,如果主机有多个网络地址,你可以通过--bind-address来让不同的服务器监听在不同的网络地址上。)
4)如果你用mysqld_safe启动mysqld(例如:--mysqld=mysqld_safe),则--pid-file选项非常重要。每个mysqld应该有其自己的进程id文件。用mysqld_safe而不是mysqld的好处是mysqld_safe会监控它的mysqld进程,且当进程由于被kill -9发送的信号或其他类似段错误(segmentation fault)原因而终止的话,将重启mysqld进程。
5)你也许想为mysqld用--user选项,但这样的话,需要以unix超级用户来运行mysqld_multi。将该选项放于选项文件没关系;如果你不是超级用户仅会收到一个警告,但mysqld进程将在你自己的unix账户下运行。
如下的例子显示你如何设置一个用于mysqld_multi的选项文件。mysqld程序被启动和停止的顺序将依赖于它们出现于选项文件的顺序。组号可以不连续。第一和第五个[mysqldN]组故意从例子中漏掉,以说明选项文件中的组号可以有缺口(gaps)。这样用起来会更灵活些。
# This is an example of a my.cnf file for mysqld_multi.
# Usually this file is located in home dir ~/.my.cnf or /etc/my.cnf
[mysqld_multi]
mysqld = /usr/local/mysql/bin/mysqld_safe
mysqladmin = /usr/local/mysql/bin/mysqladmin
user = multi_admin
password = my_password
[mysqld2]
socket = /tmp/mysql.sock2
port = 3307
pid-file = /usr/local/mysql/data2/hostname.pid2
datadir = /usr/local/mysql/data2
language = /usr/local/mysql/share/mysql/english
user = unix_user1
[mysqld3]
mysqld = /path/to/mysqld_safe
ledir = /path/to/mysqld-binary/
mysqladmin = /path/to/mysqladmin
socket = /tmp/mysql.sock3
port = 3308
pid-file = /usr/local/mysql/data3/hostname.pid3
datadir = /usr/local/mysql/data3
language = /usr/local/mysql/share/mysql/swedish
user = unix_user2
[mysqld4]
socket = /tmp/mysql.sock4
port = 3309
pid-file = /usr/local/mysql/data4/hostname.pid4
datadir = /usr/local/mysql/data4
language = /usr/local/mysql/share/mysql/estonia
user = unix_user3
[mysqld6]
socket = /tmp/mysql.sock6
port = 3311
pid-file = /usr/local/mysql/data6/hostname.pid6
datadir = /usr/local/mysql/data6
language = /usr/local/mysql/share/mysql/japanese
user = unix_user4