linux下MySQL服务器的启动与停⽌
⼀、以⾮特权⽤户运⾏MySQL服务器
在讨论如何启动MySQL服务器之前,让我们考虑⼀下应该以什么⽤户⾝份运⾏MySQL服务器。器可以⼿动或⾃动启动。如果你⼿动启动它,器以你登录Unix(Linux)的⽤户⾝份启动,即如果你⽤paul登录Unix并启动器,它⽤paul运⾏;如果你⽤su 命令切换到root,然后运启动器,则它以root运⾏。然⽽,⼤多数情况下你可能不想⼿动启动器,最有可能是你安排MySQL服务器在引导时⾃动启动,作为标准引导过程的⼀部分,在Unix下,该引导过程由的Unix⽤户root执⾏,并且任何在该过程中运⾏的进程均以root权限运⾏。
你应该牢记MySQL服务器启动过程的两个⽬标:
你想让服务器以某个⾮root⽤户运⾏。⼀般地,你想限制任何运⾏进程的能⼒,除⾮确实需要root权限,⽽MySQL不需要。
你想让服务器始终以同⼀个⽤户运⾏,此时⽤⼀个⽤户⽽其他时候以另⼀个不同的⽤户运⾏服务器是很不⽅便的,这造成了为⽂件和⽬录以具有不同属主的数据⽬录下被创建,并可能导致服务器不能访问数据库或表,这看你以哪个⽤户运⾏。统⼀⽤同⼀个⽤户运⾏服务器是你避免这个问题。
要⼀个普通的⾮特权⽤户运⾏器,按照下列步骤:
1. 选择⼀个⽤于运⾏服务器的⽤户,mysqld可以⽤任何⽤户运⾏。但在概念上较清晰的是为MySQL操作创建⼀个单独的⽤
户。你也可以特别为MySQL选择⼀个⽤户组。本⽂使⽤mysqladm和mysqlgrp分别作为⽤户名和⽤户组名。
如果你已在⾃⼰的账号下安装好了MySQL且没有系统上的特殊管理权限,你将可能在你⾃⼰的⽤户ID下运⾏服务器。在这种情况下,⽤你⾃⼰的登录名和⽤户组代替mysqladm和mysqlgrp。
如果你在RedHat Linux上⽤rpm⽂件安装MySQL,该安装将⾃动创建⼀个名为mysql的账号,⽤该账号代替mysqladm。
2. 如果必要,⽤系统通常的创建⽤户的过程创建服务器账号,你需要⽤root做它。
3. 如果服务器在运⾏,停⽌它。
4. 修改数据⽬录和任何⼦⽬录和⽂件的属主,这样使得mysqladm⽤户拥有它们。例如,如果数据⽬录是/usr/local/var,你
可以如下设置mysqladm的属主(你需要以root运⾏这些命令):
#cd /usr/local/var
#chown -sqlgrp
5. 修改数据⽬录和任何⼦⽬录和⽂件的权限,使得它们只能由mysqladm⽤户访问。如果数据⽬录是/usr/local/var,你可
以设置由mysqladm拥有的任何东西:
# cd /usr/local/var
# chmod -R go-rwx
当你数据⽬录及其内容的属主和模式时,注意符号连接。你需要顺着它们并改变它们指向的⽂件或⽬录的属主和模式。如果连接⽂件的⽬录位于不属于你的地⽅,会有些⿇烦,你可能需要root⾝份。
在你完成了上述过程后,你应该确保总是在以mysqladm或root登录时启动器,在后者,确定指定--user=mysqladm选项,使器能将其⽤户ID切换到mysqladm(同时也适⽤于启动过程)。
-
-user选项在MySQL 3.22中引⼊,如果你有⽼版本,你可以使⽤su命令告诉在以root运⾏时在特定的⽤户下运⾏器。mysql无法连接到服务器
⼆、启动服务器的⽅法
在我们确定了⽤于运⾏器的账号后,你可以选择如何安排启动器。你可以从命令⾏⼿动或在引导过程中⾃动地运⾏它。对于启动器由三种主要:
直接调⽤mysqld。
这可能是最不常⽤的⽅法,建议不要多使⽤,因此本⽂不详细介绍。
调⽤safe_mysqld脚本。
safe_mysqld试图确定服务器程序和数据⽬录的位置。然后⽤反映这些值的选项调⽤服务器。safe_mysqld将标准出错设备从服务器重定位到数据⽬录下的⼀个出错⽂件,使得有它的⼀条记录。在启动服务器后,safe_mysqld也监视它并且如果它死掉则重启它。safe_mysqld常⽤于BSD风格的Unix系统。
如果你以root或在系统引导期间启动sqfe_mysqld,出错⽇志由root拥有,这可能在你以后试图⽤⼀个
⾮特权⽤户调⽤safe_mysqld时将导致“permission denied”(权限拒绝)错误,删除出错⽇志再试⼀下。
调⽤mysql.server脚本。
这个脚本通过有意⽤于System V的启动和停⽌系统上的sql.server来启动服务器,该系统包含⼏个包含在机器进⼊或退出⼀个给定运⾏级别时被点⽤的脚本⽬录。它可以⽤⼀个start或stop参数点⽤以表明你是想启动还是想
停⽌服务器。
safe_mysqld脚本在MySQL安装⽬录的bin⽬录下,或可在MySQL源代码分发的scripts⽬录下到。mysql.server脚本在MySQL安装⽬录下的share/mysqld⽬录下或可以在MySQL源代码分发的support_files⽬录下到。如果你想使⽤它们,你需要将它们拷贝到适当的⽬录下。
对BSD风格的(FreeBSD,OpenBSD等),通常在/etc⽬录下有⼏个⽂件在引导时初始化,这些⽂件通常有以“rc”开头的名字,且它有可能由⼀个名为“rc.local”的⽂件(或类似的东西),特意⽤于启动本地的。在这样的上,你可能将类似于下列的⾏加⼊rc.local⽂件中以启动器(如果safe_mysqld的⽬录在你的上不同,修改它即可):
if [ -x /usr/local/bin/safe_mysqld ]; then
/usr/local/bin/safe_mysqld &
fi
对于对于System V风格的,你可以通过将mysql.server放在/etc下适当的启动⽬录下来它。如果你运⾏Linux并从⼀个RPM⽂件MySQL,这些已经为你做好了,否则将脚本在主启动⽬录下,并将指向它的连接放在适当的运⾏级别⽬录下。你也可以使脚本只能由root启动。
启动⽂件的⽬录布局各不同,所以你需要检查⼀下看看你的如何组织它们。例如在Linux PPC上,⽬录是/etc/rc.d
和/etc/rc.d/rc3.d,这样你可以这样脚本:
#cp mysql.server /etc/rc.d/init.d
#cd /etc/init.d
#chmod 500 mysql.server
#cd /etc/rc.d/rc3.d
#ln -s ../init.d/mysql.server S99mysql
在solaris上,主脚本⽬录是/etc/init.d,并且运⾏级别⽬录是/etc/rd2.d,所以命令看上去像这样:
#cp mysql.server /etc/rc.d/init.d
#cd /etc/init.d
#chmod 500 mysql.server
#cd /etc/rc2.d
waiting for headers
#ln -s ../init.d/mysql.server S99mysql
在启动时,S99mysql脚本将⾃动⽤⼀个start参数调⽤。如果你有chkconfig命令(Linux上有),你可以由它帮助mysql.server 脚本⽽不是象上⾯那样⼿⼯运⾏上述命令。
2.1 指定启动选项
如果你想在器启动时指定额外的启动选项,你可有两种。你可以修改你使⽤的启动脚本(safe_mysqld或mysql.server)并直接在调⽤器的⾏上指定选项,或在⼀个选项⽂件中指定选项。建议你如果可能在⼀个全局选项⽂件中指定选项,它通常位
于/etc/myf(Unix)或c:\myf(Windows)。
某些种类的信息⽆法以器选项指定。对于这些你可能需要修改safe_mysqld。例如,如果你的器不能正确选择本地时区⽽以GMT返回时间值,你可以TZ环境变量给它⼀个指⽰。如果你⽤safe_mysqld或mysql.server启动器,你可以将⼀个时区加到safe_mysqld。到启动器的⾏并在该⾏前加⼊下列命令:
TZ=US/Central
export TZ
上⾯命令的语法是Solaris的,对于其他语法可能不同,请查阅相关⼿册。如果你确实修改了你的启动脚本,要记住下次你MySQL时(如升级到新版本),你的修改将失去,除⾮你⾸先在别处复制了启动脚本。在了新版本后,⽐较新旧版本的脚本,看看你需要重建什么改变。
2.2 在启动时检查你的表smart目标例子
除了安排你的器在引导时启动,你可能要myisamchk和isamchk脚本,以在器启动前检查你的表。你可能在⼀个崩溃后重启,有可能表已经损害,在启动前检查它是⼀个发现问题的好。
三、停⽌服务器
要⼿⼯启动器,使⽤mysqladmin:
%mysqladmin shutdown
要⾃动停⽌器,你不需做特别的事情。BSD系统⼀般通过向进程发⼀个TERM信号停⽌,它们或者正确应答它或被粗鲁地杀死。mysqld在它收到这个信号时以终⽌作为应答。对于⽤mysql.server启动器的System V风格的,停⽌进程将⽤⼀个stop参数
调⽤该脚本,告诉器终⽌,当然假定你已了mysql.server。
四、如果你不能连接服务器,如何重新获得对服务器的控制
在某些情况下,你可能由于不能连接它⽽⼿⼯重启器。当然,这有点⽭盾。因为⼀般你通过连接器⽽⼿⼯关掉它,那么这种情况如何会出现。
⾸先,MySQL root⼝令可以已经为你不知道的值,这可能发⽣在你修改⼝令时,例如,如果你在输⼊新⼝令时偶然键⼊⼀个不可见的控制字符。你也可能忘记⼝令。
其次,连接localhost通常通过⼀个Unix域套接字⽂件进⾏,⼀般是/tmp/mysql.sock。如果套接字⽂件被删除了,本地客户就不能连接。这可能发⽣在你的运⾏⼀个cron任务删除了/tmp下的临时⽂件。
scanf是什么意思英语c语言如果你因为丢失套接字⽂件⽽不能连接,你可以简单地通过重启器重新创建得到它。因为器在启动时重新创建它。这⾥的是你不能⽤套接字建⽴连接因为它不见了,你必须建⽴⼀个TCP/IP连接,例如,如果器主机是pit.snake,你可以这样连接:
%mysqladmin -p -u root -h pit.snake shutdown
如果套接字⽂件被⼀个cron任务删除,问题将重复出现,除⾮你修改cron任务或使⽤⼀个或使⽤⼀个不同的套接字⽂件,你可以使⽤全局选项⽂件指定⼀个不同的套接字,例如,如果数据⽬录是/usr/local/var,你可以通过将下列⾏加⼊/etc/myf中,将套接字⽂件移到那⾥:
[mysqld]
socket=/usr/local/var/mysql.sock
[client]
socket=/usr/local/var/mysql.sock
对器和客户均指定路径名,使得它们都使⽤同⼀个套接字⽂件。如果你只为器路径,客户程序将仍然期望在原位置执⾏套接字,在修改后重启器,使它在新位置创建套接字。
如果你由于忘记root⼝令或已经将它为不同于认为的值⽽不能连接,你需要重新获得对器的控制,是你能再次⼝令:
中断服务器
如果你以root登录服务器主机,你可以⽤kill命令终⽌服务器。你可以使⽤ps命令或通过寻服务器的PID⽂件(通常在数据⽬录中)出服务器进程的ID。
最好是⾸先尝试⽤⼀个向服务器发出⼀个TERM信号的正常kill看它是否将以正常终⽌应答。这种⽅式下,表和⽇志将正确地被清空。如果服务器阻塞并且不应答⼀个正常终⽌信号,你可以⽤kill -9强制终⽌它。这是最后的⼿段了,因为这可能有未清空的修改,⽽且你冒着让表处于⼀个不⼀致状态的风险。
如果你⽤kill -9终⽌服务器,要确保在启动服务器前⽤myisamchk和isamchk检查你的表。
stream closed什么意思
⽤--skip-grant-table选项重启服务器。
这告诉服务器不使⽤授权表验证连接,这允许你以root连接⽽⽆须⼝令。在你已经连接后,改变root⼝令。
⽤mysqladmin flush-privileges告诉服务器再次使⽤授权表启动
如果你的mysqladmin版本不认识flash-privileges,试⼀试reload。
五、运⾏多个服务器
⼤多数再⼀台给定的机器上运⾏单个MySQL服务器,但在很多情况下,运⾏多个器是很有⽤的:
你可能想测试⼀个服务器的新版本,⽽保留你正在运⾏的⽣产服务器。在这种情况下,你会运⾏不同的服务器代码。
操作系统⼀般限制每个进程的打开⽂件句柄数量。如果你的系统很难提⾼这个限制,运⾏多个服务器是解决限制的⼀种⽅法。在这种情况下,你可能运⾏统⼀服务器的多个实例。
ISP经常为其客户提供⾃⼰的MySQL安装,有必要涉及单独的服务器。在这种情况下,你可能运⾏同⼀版本的多个实例或不同版本,如果不同的客户想要不同版本的MySQL。
很⾃然地,运⾏多个器⽐只运⾏⼀个器要复杂得多。如果你多个版本,你不能在同⼀个地⽅所有东西。当器运⾏时,某些参数必须或很可能对每个器是唯⼀的,它们包括器在哪、其数据⽬录的路径名、TCP/IP端⼝和UNIX域套接字路径名以及⽤于运⾏器的UNIX账号(如果你不再同⼀账号下运⾏所有器)。如果你决定运⾏多个器,⼀定要注意你使⽤的参数,是你不⾄于丢失对所发⽣的事情的踪迹。
5.1 配置和安装多个服务器
如果你要运⾏不同版本的器⽽不是同⼀版本的多个实例,你必须在不同地点它们。如果你⼆进制分发(不⽤RPM),它们将在包含不同版本号的⽬录名下。如果你从源代码,最简单的是在每个版本运⾏configure配置MySQL安装过程中使⽤--with-
prefix选项使得不同分发分开,这将使得所有东西在⼀个单独的⽬录下,你可以将⽬录域分发版本号联系起来,如,你可以象这样配置⼀个MySQL分发,其中version是MySQL版本号:
%.configure --with-prefix=/usr/local/mysql-version
--with-prefix选项也决定了器的⼀个唯⼀数据⽬录。你可能想加上其它器特定的选项,如TCP/IP端⼝号和套接字路径名(--with-tcp-port和--with-unix-socket)。
二进制如何转化为十进制
如果你想运⾏同⼀版本器的多个实例,任何必须基于⼀个器特定的选项将需要在运⾏时指定。
5.2 多服务器的启动过程
启动多个器⽐使⽤⼀个器要复杂。因为safe_mysqld和mysql.server均在单个器上⼯作得最好。建议你仔细研究⼀下
safe_mysqld并⽤它作为你的启动过程的基础,使⽤你修改的版本,你能针对你⾃⼰的需要更精确地裁剪它。
你必须处理的⼀个问题是如何在选项⽂件(myf)中指定选项。对于多器,你不能对于每个不同的器使⽤/etc/myf,你只能对所有器相同的使⽤该⽂件。如果器有⼀个不同的编译进去的数据⽬录位置,你可以在每个器数据⽬录中的myf中指定所有器要使⽤的,⽽使⽤DATADIR/myf指定器特定的,这⾥DATADIR以器不同⽽不同。
另⼀种指定器选项的是⽤--default-file=path_name作为命令⾏的第⼀个选项,告诉器从名为path_name中的⽂件中读取选项,这样你可以把⼀个器选项放在⼀个对该器唯⼀的⽂件中,然后告诉器在启动时读取该⽂件。注意,如果你指定这个选项,将不使⽤通常的选项⽂件如/etc/myf的任何⼀个。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。