、以非特权用户运行MySQL 在讨论如何启动MySQL的前
![](/icons/24126dou.gif)
让我们考虑
![](/icons/24126yi.gif)
下应该以什么用户身份运行MySQL服务器
![](/icons/24126dou2.gif)
服务器可以手动或自动启动
![](/icons/24126dou2.gif)
如果你手动启动它
![](/icons/24126dou.gif)
服务器以你登录Unix(Linux)
![](/icons/24126de.gif)
用户身份启动
![](/icons/24126dou.gif)
即如果你用paul登录Unix并启动服务器
![](/icons/24126dou.gif)
它用paul运行;如果你用su命令切换到root
![](/icons/24126dou.gif)
然后运启动服务器
![](/icons/24126dou.gif)
则它以root运行
![](/icons/24126dou2.gif)
然而
![](/icons/24126dou.gif)
大多数情况下你可能不想手动启动服务器
![](/icons/24126dou.gif)
最有可能是你安排MySQL服务器在系统引导时自动启动
![](/icons/24126dou.gif)
作为标准引导过程
![](/icons/24126de.gif)
![](/icons/24126yi.gif)
部分
![](/icons/24126dou.gif)
在Unix下
![](/icons/24126dou.gif)
该引导过程由系统
![](/icons/24126de.gif)
Unix用户root执行
![](/icons/24126dou.gif)
并且任何在该过程中运行
![](/icons/24126de.gif)
进程均以root权限运行
你应该牢记MySQL服务器启动过程
![](/icons/24126de.gif)
两个目标:
你想让服务器以某个非root用户运行
![](/icons/24126dou2.gif)
![](/icons/24126yi.gif)
般地
![](/icons/24126dou.gif)
你想限制任何运行进程
![](/icons/24126de.gif)
能力
![](/icons/24126dou.gif)
除非确实需要root权限
![](/icons/24126dou.gif)
而MySQL不需要
你想让服务器始终以同
![](/icons/24126yi.gif)
个用户运行
![](/icons/24126dou.gif)
此时用
![](/icons/24126yi.gif)
个用户而其他时候以另
![](/icons/24126yi.gif)
个区别
![](/icons/24126de.gif)
用户运行服务器是很不方便
![](/icons/24126de.gif)
![](/icons/24126dou.gif)
这造成了为文件和目录以具有区别属主
![](/icons/24126de.gif)
数据目录下被创建
![](/icons/24126dou.gif)
并可能导致服务器不能访问数据库或表
![](/icons/24126dou.gif)
这看你以哪个用户运行
![](/icons/24126dou2.gif)
统
![](/icons/24126yi.gif)
用同
![](/icons/24126yi.gif)
个用户运行服务器是你避免这个问题
要
个普通
非特权用户运行服务器
按照下列步骤: 选择
![](/icons/24126yi.gif)
个用于运行服务器
![](/icons/24126de.gif)
用户
![](/icons/24126dou.gif)
mysqld可以用任何用户运行
![](/icons/24126dou2.gif)
但在概念上较清晰
![](/icons/24126de.gif)
是为MySQL操作创建
![](/icons/24126yi.gif)
个单独
![](/icons/24126de.gif)
用户
![](/icons/24126dou2.gif)
你也可以特别为MySQL选择
![](/icons/24126yi.gif)
个用户组
![](/icons/24126dou2.gif)
本文使用mysqladm和mysqlgrp分别作为用户名和用户组名
![](/icons/24126dou2.gif)
如果你已在自己
![](/icons/24126de.gif)
账号下安装好了MySQL且没有系统上
![](/icons/24126de.gif)
特殊管理权限
![](/icons/24126dou.gif)
你将可能在你自己
![](/icons/24126de.gif)
用户ID下运行服务器
![](/icons/24126dou2.gif)
在这种情况下
![](/icons/24126dou.gif)
用你自己
![](/icons/24126de.gif)
登录名和用户组代替mysqladm和mysqlgrp
![](/icons/24126dou2.gif)
如果你在RedHat Linux上用rpm文件安装MySQL
![](/icons/24126dou.gif)
该安装将自动创建
![](/icons/24126yi.gif)
个名为mysql
![](/icons/24126de.gif)
账号
![](/icons/24126dou.gif)
用该账号代替mysqladm
如果必要
![](/icons/24126dou.gif)
用系统通常
![](/icons/24126de.gif)
创建用户
![](/icons/24126de.gif)
过程创建服务器账号
![](/icons/24126dou.gif)
你需要用root做它
如果服务器在运行
![](/icons/24126dou.gif)
停止它
修改数据目录和任何子目录和文件
![](/icons/24126de.gif)
属主
![](/icons/24126dou.gif)
这样使得mysqladm用户拥有它们
![](/icons/24126dou2.gif)
例如
![](/icons/24126dou.gif)
如果数据目录是/usr/local/var
![](/icons/24126dou.gif)
你可以如下设置mysqladm
![](/icons/24126de.gif)
属主(你需要以root运行这些命令):
#cd /usr/local/var
#chown -R mysqladm.mysqlgrp
修改数据目录和任何子目录和文件
![](/icons/24126de.gif)
权限
![](/icons/24126dou.gif)
使得它们只能由mysqladm用户访问
![](/icons/24126dou2.gif)
如果数据目录是/usr/local/var
![](/icons/24126dou.gif)
你可以设置由mysqladm拥有
![](/icons/24126de.gif)
任何东西:
# cd /usr/local/var
# chmod -R go-rwx
当你设置数据目录及其内容
![](/icons/24126de.gif)
属主和模式时
![](/icons/24126dou.gif)
注意符号连接
![](/icons/24126dou2.gif)
你需要顺着它们并改变它们指向
![](/icons/24126de.gif)
文件或目录
![](/icons/24126de.gif)
属主和模式
![](/icons/24126dou2.gif)
如果连接文件
![](/icons/24126de.gif)
目录位于不属于你
![](/icons/24126de.gif)
地方
![](/icons/24126dou.gif)
会有些麻烦
![](/icons/24126dou.gif)
你可能需要root身份
在你完成了上述过程后
![](/icons/24126dou.gif)
你应该确保总是在以mysqladm或root登录时启动服务器
![](/icons/24126dou.gif)
在后者
![](/icons/24126dou.gif)
确定指定--user=mysqladm选项
![](/icons/24126dou.gif)
使服务器能将其用户ID切换到mysqladm(同时也适用于系统启动过程)
--user选项在MySQL 3.22中引入
![](/icons/24126dou.gif)
如果你有老版本
![](/icons/24126dou.gif)
你可以使用su命令告诉系统在以root运行时在特定
![](/icons/24126de.gif)
用户下运行服务器
2、启动服务器
思路方法 在我们确定了用于运行服务器
![](/icons/24126de.gif)
账号后
![](/icons/24126dou.gif)
你可以选择如何安排启动服务器
![](/icons/24126dou2.gif)
你可以从命令行手动或在系统引导过程中自动地运行它
![](/icons/24126dou2.gif)
对于启动服务器由 3种主要思路方法:
直接
![](/icons/24126diaoyong.gif)
mysqld
![](/icons/24126dou2.gif)
这可能是最不常用
![](/icons/24126de.gif)
思路方法
![](/icons/24126dou.gif)
建议不要多使用
![](/icons/24126dou.gif)
因此本文不详细介绍
![](/icons/24126diaoyong.gif)
safe_mysqld脚本
![](/icons/24126dou2.gif)
safe_mysqld试图确定服务器
![](/icons/24126chengxu.gif)
和数据目录
![](/icons/24126de.gif)
位置
![](/icons/24126dou2.gif)
然后用反映这些值
![](/icons/24126de.gif)
选项
![](/icons/24126diaoyong.gif)
服务器
![](/icons/24126dou2.gif)
safe_mysqld将标准出错设备从服务器重定位到数据目录下
![](/icons/24126de.gif)
![](/icons/24126yi.gif)
个出错文件
![](/icons/24126dou.gif)
使得有它
![](/icons/24126de.gif)
![](/icons/24126yi.gif)
条记录
![](/icons/24126dou2.gif)
在启动服务器后
![](/icons/24126dou.gif)
safe_mysqld也监视它并且如果它死掉则重启它
![](/icons/24126dou2.gif)
safe_mysqld常用于BSD风格
![](/icons/24126de.gif)
Unix系统
![](/icons/24126dou2.gif)
如果你以root或在系统引导期间启动sqfe_mysqld
![](/icons/24126dou.gif)
出错日志由root拥有
![](/icons/24126dou.gif)
这可能在你以后试图用
![](/icons/24126yi.gif)
个非特权用户
![](/icons/24126diaoyong.gif)
safe_mysqld时将导致“permission denied”(权限拒绝)
![](/icons/24126cuowu.gif)
![](/icons/24126dou.gif)
删除出错日志再试
![](/icons/24126yi.gif)
下
![](/icons/24126diaoyong.gif)
mysql.server脚本
![](/icons/24126dou2.gif)
这个脚本通过有意用于
![](/icons/24126System.gif)
V
![](/icons/24126de.gif)
启动和停止系统上
![](/icons/24126de.gif)
safe_mysqld.mysql.server来启动服务器
![](/icons/24126dou.gif)
该系统包含几个包含在机器进入或退出
![](/icons/24126yi.gif)
个给定运行级别时被点用
![](/icons/24126de.gif)
脚本目录
![](/icons/24126dou2.gif)
它可以用
![](/icons/24126yi.gif)
个start或stop参数点用以表明你是想启动还是想停止服务器
safe_mysqld脚本安装在MySQL安装目录
![](/icons/24126de.gif)
bin目录下
![](/icons/24126dou.gif)
或可在MySQL源代码分发
![](/icons/24126de.gif)
scripts目录下找到
![](/icons/24126dou2.gif)
mysql.server脚本安装在MySQL安装目录下
![](/icons/24126de.gif)
share/mysqld目录下或可以在MySQL源代码分发
![](/icons/24126de.gif)
support_files目录下找到
![](/icons/24126dou2.gif)
如果你想使用它们
![](/icons/24126dou.gif)
你需要将它们拷贝到适当
![](/icons/24126de.gif)
目录下
对BSD风格
![](/icons/24126de.gif)
系统(FreeBSD
![](/icons/24126dou.gif)
OpenBSD等)
![](/icons/24126dou.gif)
通常在/etc目录下有几个文件在引导时
![](/icons/24126chushi.gif)
化服务
![](/icons/24126dou.gif)
这些文件通常有以“rc”开头
![](/icons/24126de.gif)
名字
![](/icons/24126dou.gif)
且它有可能由
![](/icons/24126yi.gif)
个名为“rc.local”
![](/icons/24126de.gif)
文件(或类似
![](/icons/24126de.gif)
东西)
![](/icons/24126dou.gif)
特意用于启动本地安装
![](/icons/24126de.gif)
服务
![](/icons/24126dou2.gif)
在这样
![](/icons/24126de.gif)
系统上
![](/icons/24126dou.gif)
你可能将类似于下列
![](/icons/24126de.gif)
行加入rc.local文件中以启动服务器(如果safe_mysqld
![](/icons/24126de.gif)
目录在你
![](/icons/24126de.gif)
系统上区别
![](/icons/24126dou.gif)
修改它即可):
![](/icons/24126if.gif)
[ -x /usr/local/bin/safe_mysqld ]; then
/usr/local/bin/safe_mysqld &
fi
对于对于
![](/icons/24126System.gif)
V风格
![](/icons/24126de.gif)
系统
![](/icons/24126dou.gif)
你可以通过将mysql.server放在/etc下适当
![](/icons/24126de.gif)
启动目录下来安装它
![](/icons/24126dou2.gif)
如果你运行Linux并从
![](/icons/24126yi.gif)
个RPM文件安装MySQL
![](/icons/24126dou.gif)
这些已经为你做好了
![](/icons/24126dou.gif)
否则将脚本安装在主启动目录下
![](/icons/24126dou.gif)
并将指向它
![](/icons/24126de.gif)
连接放在适当
![](/icons/24126de.gif)
运行级别目录下
![](/icons/24126dou2.gif)
你也可以使脚本只能由root启动
启动文件
![](/icons/24126de.gif)
目录布局各系统区别
![](/icons/24126dou.gif)
所以你需要检查
![](/icons/24126yi.gif)
下看看你
![](/icons/24126de.gif)
系统如何组织它们
![](/icons/24126dou2.gif)
例如在Linux PPC上
![](/icons/24126dou.gif)
目录是/etc/rc.d和/etc/rc.d/rc3.d
![](/icons/24126dou.gif)
这样你可以这样安装脚本:
#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上
![](/icons/24126dou.gif)
主脚本目录是/etc/init.d
![](/icons/24126dou.gif)
并且运行级别目录是/etc/rd2.d
![](/icons/24126dou.gif)
所以命令看上去像这样:
#cp mysql.server /etc/rc.d/init.d
#cd /etc/init.d
#chmod 500 mysql.server
#cd /etc/rc2.d
#ln -s ../init.d/mysql.server S99mysql
在系统启动时
![](/icons/24126dou.gif)
S99mysql脚本将自动用
![](/icons/24126yi.gif)
个start参数
![](/icons/24126diaoyong.gif)
![](/icons/24126dou2.gif)
如果你有chkconfig命令(Linux上有)
![](/icons/24126dou.gif)
你可以由它帮助安装mysql.server脚本而不是象上面那样手工运行上述命令
2.1 指定启动选项
如果你想在服务器启动时指定额外
![](/icons/24126de.gif)
启动选项
![](/icons/24126dou.gif)
你可有两种思路方法
![](/icons/24126dou2.gif)
你可以修改你使用
![](/icons/24126de.gif)
启动脚本(safe_mysqld或mysql.server)并直接在
![](/icons/24126diaoyong.gif)
服务器
![](/icons/24126de.gif)
行上指定选项
![](/icons/24126dou.gif)
或在
![](/icons/24126yi.gif)
个选项文件中指定选项
![](/icons/24126dou2.gif)
建议你如果可能在
![](/icons/24126yi.gif)
个全局选项文件中指定选项
![](/icons/24126dou.gif)
它通常位于/etc/my.cnf(Unix)或c:\my.cnf()
某些种类
![](/icons/24126de.gif)
信息无法以服务器选项指定
![](/icons/24126dou2.gif)
对于这些你可能需要修改safe_mysqld
![](/icons/24126dou2.gif)
例如
![](/icons/24126dou.gif)
如果你
![](/icons/24126de.gif)
服务器不能正确选择本地时区而以GMT返回时间值
![](/icons/24126dou.gif)
你可以设置TZ环境变量给它
![](/icons/24126yi.gif)
个指示
![](/icons/24126dou2.gif)
如果你用safe_mysqld或mysql.server启动服务器
![](/icons/24126dou.gif)
你可以将
![](/icons/24126yi.gif)
个时区设置加到safe_mysqld
![](/icons/24126dou2.gif)
找到启动服务器
![](/icons/24126de.gif)
行并在该行前加入下列命令:
TZ=US/Central
export TZ
上面命令
![](/icons/24126de.gif)
语法是Solaris
![](/icons/24126de.gif)
![](/icons/24126dou.gif)
对于其他系统语法可能区别
![](/icons/24126dou.gif)
请查阅相关手册
![](/icons/24126dou2.gif)
如果你确实修改了你
![](/icons/24126de.gif)
启动脚本
![](/icons/24126dou.gif)
要记住下次你安装MySQL时(如升级到新版本)
![](/icons/24126dou.gif)
你
![](/icons/24126de.gif)
修改将失去
![](/icons/24126dou.gif)
除非你首先在别处复制了启动脚本
![](/icons/24126dou2.gif)
在安装了新版本后
![](/icons/24126dou.gif)
比较新旧版本
![](/icons/24126de.gif)
脚本
![](/icons/24126dou.gif)
看看你需要重建什么改变
2.2 在启动时检查你
![](/icons/24126de.gif)
表
除了安排你
![](/icons/24126de.gif)
服务器在系统引导时启动
![](/icons/24126dou.gif)
你可能要安装myisamchk和isamchk脚本
![](/icons/24126dou.gif)
以在服务器启动前检查你
![](/icons/24126de.gif)
表
![](/icons/24126dou2.gif)
你可能在
![](/icons/24126yi.gif)
个崩溃后重启
![](/icons/24126dou.gif)
有可能表已经损害
![](/icons/24126dou.gif)
在启动前检查它是
![](/icons/24126yi.gif)
个发现问题
![](/icons/24126de.gif)
好思路方法
3、停止服务器 要手工启动服务器
![](/icons/24126dou.gif)
使用mysqladmin:
%mysqladmin shutdown
要自动停止服务器
![](/icons/24126dou.gif)
你不需做特别
![](/icons/24126de.gif)
事情
![](/icons/24126dou2.gif)
BSD系统
![](/icons/24126yi.gif)
般通过向进程发
![](/icons/24126yi.gif)
个TERM信号停止服务
![](/icons/24126dou.gif)
它们或者正确应答它或被粗鲁地杀死
![](/icons/24126dou2.gif)
mysqld在它收到这个信号时以终止作为应答
![](/icons/24126dou2.gif)
对于用mysql.server启动服务器
![](/icons/24126de.gif)
![](/icons/24126System.gif)
V风格
![](/icons/24126de.gif)
系统
![](/icons/24126dou.gif)
停止进程将用
![](/icons/24126yi.gif)
个stop参数
![](/icons/24126diaoyong.gif)
该脚本
![](/icons/24126dou.gif)
告诉服务器终止
![](/icons/24126dou.gif)
当然假定你已安装了mysql.server
4、如果你不能连接服务器
如何重新获得对服务器
控制 在某些情况下
![](/icons/24126dou.gif)
你可能由于不能连接它而手工重启服务器
![](/icons/24126dou2.gif)
当然
![](/icons/24126dou.gif)
这有点矛盾
![](/icons/24126dou2.gif)
![](/icons/24126yinwei.gif)
![](/icons/24126yi.gif)
般你通过连接服务器而手工关掉它
![](/icons/24126dou.gif)
那么这种情况如何会出现
首先
![](/icons/24126dou.gif)
MySQL root口令可以已经设置为你不知道
![](/icons/24126de.gif)
值
![](/icons/24126dou.gif)
这可能发生在你修改口令时
![](/icons/24126dou.gif)
例如
![](/icons/24126dou.gif)
如果你在输入新口令时偶然键入
![](/icons/24126yi.gif)
个不可见
![](/icons/24126de.gif)
控制
![](/icons/24126zifu.gif)
![](/icons/24126dou2.gif)
你也可能忘记口令
其次
![](/icons/24126dou.gif)
连接localhost通常通过
![](/icons/24126yi.gif)
个Unix域套接字文件进行
![](/icons/24126dou.gif)
![](/icons/24126yi.gif)
般是/tmp/mysql.sock
![](/icons/24126dou2.gif)
如果套接字文件被删除了
![](/icons/24126dou.gif)
本地客户就不能连接
![](/icons/24126dou2.gif)
这可能发生在你
![](/icons/24126de.gif)
系统运行
![](/icons/24126yi.gif)
个cron任务删除了/tmp下
![](/icons/24126de.gif)
临时文件
如果你
![](/icons/24126yinwei.gif)
丢失套接字文件而不能连接
![](/icons/24126dou.gif)
你可以简单地通过重启服务器重新创建得到它
![](/icons/24126dou2.gif)
![](/icons/24126yinwei.gif)
服务器在启动时重新创建它
![](/icons/24126dou2.gif)
这里
![](/icons/24126de.gif)
骗局是你不能用套接字建立连接
![](/icons/24126yinwei.gif)
它不见了
![](/icons/24126dou.gif)
你必须建立
![](/icons/24126yi.gif)
个TCP/IP连接
![](/icons/24126dou.gif)
例如
![](/icons/24126dou.gif)
如果服务器主机是pit.snake.net
![](/icons/24126dou.gif)
你可以这样连接:
%mysqladmin -p -u root -h pit.snake.net shutdown
如果套接字文件被
![](/icons/24126yi.gif)
个cron任务删除
![](/icons/24126dou.gif)
问题将重复出现
![](/icons/24126dou.gif)
除非你修改cron任务或使用
![](/icons/24126yi.gif)
个或使用
![](/icons/24126yi.gif)
个区别
![](/icons/24126de.gif)
套接字文件
![](/icons/24126dou.gif)
你可以使用全局选项文件