服务器

位置:IT落伍者 >> 服务器 >> 浏览文章

启动和关闭MySQL服务器


发布日期:2022年04月07日
 
启动和关闭MySQL服务器

作为MySQL管理员一个普通的目标就是确保服务器尽可能地处于运行状态使得客户机能够随时访问它但是有时最好关闭服务器(例如如果正在进行数据库的重定位不希望服务器在该数据库中更新表)保持服务器运行和偶尔关闭它的需求关系不是本文所解决的但是我们至少可以讨论如何使服务器启动和停止以便您具备进行这两个操作的能力

本章的说明只用于UNIX 系统

调用本章给出的命令

为了简洁在大多数情况中诸如mysqla d m i nmysqldump 等程序在本章中没有给出任何 h u或 p选项笔者假定您将会用连接服务器所需的任何选项调用这些程序

用无特权的用户账号运行MySQL服务器

在讨论如何启动服务器之前考虑一下在服务器启动时应该运行哪个账号服务器可以手工和自动启动如果手工启动则服务器以UNIX 用户身份运行(您恰好作为该用户进行了注册)如果笔者以paul 进行注册并启动服务器则它将以paul 身份运行如果用s u命令将用户切换到root 然后启动服务器则服务器以root 身份运行

但是大多数时候可能都不会采用手工启动服务器您很可能将安排服务器在系统引导时作为标准启动过程的一部分自动地运行在UNIX中该启动过程由系统以UNIX 的r o o t用户的身份执行该过程中启动的任何进程都用root 的权限运行

应该紧记MySQL服务器启动过程的两个目标

要服务器以某些非root 的用户身份启动通常除非进程真的需要root 访问权而mysql办不到否则应限制任何进程的能力

要服务器始终以同一个用户的身份运行服务器有时作为一个用户运行而有时又作为另一个用户运行时会产生矛盾这将导致文件和目录以不同的所有权在该数据下被创建甚至引起服务器不能访问数据库或表以同一个用户的身份一致地运行服务器可以避免该问题

为了以标准的非特权的用户身份运行数据库可按如下步骤执行该过程

) 选择用于运行服务器的账号mysqld 可以以任何用户身份运行但是很明显它只为MySQL活动创建了一个单独的账号您也可以为MySQL专门指定一个组笔者将调用的这些用户和组的名字命名为mysqladm 和mysqlg r p如果您使用了其他的名字则在本书中有mysqladm 和mysqlgrp 的地方替换它们

如果您在自己的账号下安装了MySQL并且系统中没有特定的管理权限则您可以在自己的ID 用户下运行服务器在这种情况下应使用您自己的注册名和组名替代mysqladm 和mysqlgrp

如果您利用RPM 文件在RedHat Linux 下安装了MySQL则该安装程序将在mysql名下自动创建了一个账号应使用该名字替换mysqladm

) 如果必要的话可用系统常用的账号创建过程( a c count c r e a t i o n)来创建服务器账号这需要以root 身份进行操作

) 关闭服务器(如果它在运行)

) 修改数据目录以及任何子目录和文件的所有权使mysqladm 用户拥有它们例如如果数据目录是/ us r / l o c a l / v a r则可按以下设置mysqladm 用户的所有权

# cd /usr/local/var 移动到数据目录

# chown r mysqladminmysqlgrp 设置所有目录和文件的所有权

) 修改数据目录以及任何子目录和文件的许可权使得只有mysqladm 用户能够访问它们设置该方式以避免其他人员访问是一种好得安全预防措施如果数据目录是/ us r / l o c a l / v a r则可通过mysqladm 用户按下列操作设置应具有的一切(您需要以root 身份运行这些命令)

# cd /usr/local/var 移动到数据目录

# chmod R go rwx 使所有一切只对mysqladm 可访问

在设置数据目录及其内容的所有权和方式时观察符号连接您需要跟蹤符号连接并修改所指向的文件或目录的所有权和方式如果这些连接文件所定位的目录不属于您则这样做可能会引起麻烦因此您必须是root 用户

在完成前述过程后应确保无论是作为mysqladm 还是作为root 用户注册都始终启动服务器在后者中要确保指定了user = mysqladm 的选项使服务器可以将其用户ID 切换到mysqla d m(该选项在系统启动过程中也可使用)

user 选项被增加到MySQL 的mysql中如果您的版本比MySQL则在启动服务器并作为root 用户运行时可以使用su命令指示系统在指定账号下运行服务器您需要阅读有关su的人工页因为作为一个指定用户运行命令的语法被改变了

启动服务器的方法

如果您已经确定了用来运行服务器的账号则可以选择安排怎样启动服务器可以从命令行手工运行或在系统启动过程中自动运行服务器有三种启动服务器的主要方法

直接调用mysqld这或许是最小的命令方法除了说明mysqld help 是一个有用的命令(用它可以查找您可利用其他启动方法使用的选项)外笔者不打算进一步讨论它

调用safe_mysqld 脚本safe_mysqld 试图确定服务器程序和数据目录的位置然后利用反映这些位置的选项调用服务器safe_mysqld 将服务器的标准错误输出重定向到数据目录的错误文件中并以记录的形式出现在启动服务器后 safe_mysqld 还监控服务器并在其死机时重新启动safe_mysqld 通常用于UNIX 的BSD 风格的版本

如果您曾经作为root 或在系统启动程序中启动s a f e _ mysqld则错误日志将由r o o t拥有如果您试着以非特权的用户身份调用s a f e _ mysqld则可能引起所有权被拒绝的错误删除该错误文件再试一次

调用mysqlserver 脚本通过运行s a f e _ mysqld mysql server该脚本启动服务器该脚本建议在使用System V 启动/关闭系统的系统中使用这个系统包括几个包含在机器登录或退出一个特定运行级时被调用的脚本的目录它可以利用start 或stop 参数进行调用以指明希望启动还是关闭服务器

safe_mysqld 脚本被安装在MySQL安装目录的bin 目录下或者在MySQL源程序分发包的scripts 目录中mysqlserver 脚本安装在MySQL安装目录的s h a r e / mysql目录下或者在MySQL源程序分发包的supportfiles 目录中如果要使用它应将其拷贝到合适的启动目录中

对于BSD 风格的系统在/etc 目录中有几个文件相对应它们在引导期间开始服务这些文件的名字通常以 r c开始因此很可能会有一个名为rclocal (或类似的名字)的文件来启动本地的安装服务在这样的系统中您可能要按如下方法添加一些行到rclocal 文件中以启动服务器(如果路径与您系统中的不同可将其修改成s a f e _ mysqld)

if(x/usr/local/bin/safe_mysqld);then

/usr/local/bin/safe_mysqld&

fi

对于System V 风格的系统可以通过将其放置在/etc 下的合适的启动目录中来安装mysql server如果您运行Linux 并从RPM 文件中安装了MySQL那么这此操作可能已经完成了否则应该在主启动脚本目录中安装该脚本并在合适的运行级目录中设置对它的连接您还可使该脚本仅对root 用户可执行

启动文件目录的布局随系统而变化因此将需要全面检查来弄清系统是怎样组织它们的例如在LinuxPPC 中这些目录为/etc/rcd/initd 和/ e t c / r c d / r c d应该按如下方法安装该脚本

#cpmysqlserver/etc/rcd/initd

#cd/etc/initd

#chmodmysqlserver

#cd/etc/rcd/rcd

#Ins/initd/mysqlserverSmysql在Solaris中主脚本目录为/etc/initd运行级目录为/etc/rcd因此上述命令将替换为

#cpmysqlserver/etc/initd

#cd/etc/initd

#chmodmysqlserver

#cd/etc/rcd

#Ins/initd/mysqlserversmysql在系统启动期间Smysql脚本利用start参数自动调用

如果您拥有chkconfig 命令(它在Linux 中很常用)则可用其帮助安装mysqlserver 脚本来代替手工运行上述的命令

指定启动选项

在启动服务器时如果想要指定附加的启动选项可用两种方法进行操作您可以修改所使用的启动脚本( safe_mysqld 或mysql server)并在调用服务器的命令行中直接指定这些选项您还可以在选项文件中指定选项笔者建议如果可能的话应在全局选项文件中指定服务器选项通常该文件的位置是UNIX 中的/ e t c / mycnf 和Windows 中的c:mycnf(有关使用选项文件的细节请参阅附录E)

某些种类的信息不能作为服务器的选项指定为了这些选项您可能需要修改s a f e _ mysqld例如如果服务器不能正确地拾取GMT 中的本地时区(local time zone)和返回时间值可以设置TZ 环境变量以给该变量一个提示如果用safe_mysqld 或mysql ser ver启动服务器可以将时区设置增加到safe_mysqld 中找到启动服务器的命令行并在该行之前增加下列命令

TZ=US/Central

exportTZ

这个命令将TZ 设置为US Central 时区您需要使用合适位置的时区该语法是S o l a r i s 的您的系统可能会有所不同例如设置TZ 变量的另一个常用语法为

TZ=CSTCDT

exportTZ

如果修改了启动脚本当下次安装MySQL时(如升级到更新的版本)将失去这些修改除非在之前将该启动脚本拷贝到了其他地方在安装新的版本之后将您的脚本与新安装的脚本进行比较以便看看重新建立还需要做什么改动

在启动期间检查表

除了在系统引导时安排服务器的启动外您还可以安装一个脚本来运行mysamchk 和i s a m c h k以便在服务器启动前对表进行检查您可能打算在服务器崩溃后重新启动但表可能已经毁坏了在服务器启动前检查这些表是发现问题的好办法 章包含了有关编写和安装这种脚本的细节

关闭服务器

要想手工关闭服务器可使用mysqla d m i n

% mysqladmin shutdown

要想自动关闭服务器您不需要做特别的操作BSD 系统通常会通过给进程发送一个TERM 信号来关闭服务进程或者对其作出反应或者被随便地取消当mysqld 接收到信号时它会通过终止来响应对于利用mysqlserver 启动服务器的System V风格的系统该关闭进程将调用带有stop 参数的脚本来指示服务器进行关闭──当然这是在假定您已经安装了mysql ser ver的情况下进行的

在不连接时收回服务器的控制

在某些环境中由于不能连接到服务器您需要用手工重新启动它当然这有点荒谬因为一般是通过连接到服务器然后告知服务器终止来手工关闭服务器的那么这种情况是怎样出现的?

首先MySQL的root 口令可能得到了一个您不知道的值这种情况可能是在修改口令时发生的─例如如果在输入新的口令值时碰巧键入了一个不可见的控制字符还有可能就是完全忘记了口令

其次对于localhost 的连接通常是通过UNIX 域的套接字文件进行的它一般为/ t m p / mysql s o c k如果该套接字文件被删除了则本地客户机将不能进行连接如果系统偶尔运行了一个删除/tmp 中的临时文件的cron 作业这种情况就可能会发生

如果因为失去套接字文件而不能进行连接可以通过重新启动服务器简单地进行恢复因为服务器在启动期间重新建立了该文件这里应知道的是不能用该套接字建立连接(因为它已经不存在)而必须建立TCP/IP 连接例如如果服务器的主机是pit viper s n a k e n e t则可以按如下方法进行连接

% mysqladmin p uroot h pitvipersnakenet shutdown

如果此套接字文件被cron 作业删除则问题将复发直到您修改cron 作业或使用另一个套接字文件为止您可以用全局选项文件指定另一个套接字文件例如如果数据目录为/ us r / l o c a l / v a r则可通过将以下行添加到/ e t c / mycnf 中来移动套接字文件到那里

[mysqld]

socket=/usr/local/var/mysqlsock

[client]

socket=/usr/local/var/mysqlsock

路径名是为服务器和客户机程序二者所指定的以便它们能使用相同的套接字文件如果只对服务器设置路径名客户机程序将仍然在旧的位置上查找套接字文件在做出这个修改后应重新启动服务器使它在新的位置创建套接字文件

如果由于您忘记了root 的口令或将其修改为一个您不知道的值而不能进行连接则需要收回服务器的控制以便重新设置口令

关闭服务器如果您以root 用户的身份在服务器主机上进行登录可用kill 命令终止服务器通过使用ps 命令或通过查看服务器的PID 文件(通常放在数据目录中)能找出服务器的ID 进程

最好先试着用标准的kill 命令取消服务器该命令将一个TERM 信号发送到服务器上以查看服务器是否通过关闭信号来响应也就是说表和日志将被适当地刷新如果服务器被堵塞并且没有响应正常的终止信号可使用kill 强制终止它这是最后的一个

方法因为可能存在未刷新的更改并且要承担非一致状态下将表保留下来的风险如果用kill 终止服务器应确保在重新启动服务器之前利用myisamchk 和i s a m c h k对表进行检查(参见第章)

skipgranttables 选项重新启动服务器该操作告诉服务器不要使用授权的表检查连接这允许您作为root 用户不用输入口令即可进行连接在连接之后修改r o o t的口令

告诉服务器再利用mysqladmin flushprivileges 使用授权表启动如果您的mysqladmin 版本不识别f l us h priv i l e g e s试着进行重新加载

               

上一篇:nginx中常用问题(nginx 301/绑定独立IP地址)

下一篇:苹果从Mac OS X服务器版中清除MySQL