启动和关闭MySQL服务器
作为MySQL管理员,一个普通的目标就是确保服务器尽可能地处于运行状态,使得客户机能够随时访问它。但是,有时最好关闭服务器(例如,如果正在进行数据库的重定位,不希望服务器在该数据库中更新表)。保持服务器运行和偶尔关闭它的需求关系不是本文所解决的。但是我们至少可以讨论如何使服务器启动和停止,以便您具备进行这两个操作的能力。本章的说明只用于UNIX 系统。
调用本章给出的命令
为了简洁,在大多数情况中,诸如mysqla d m i n、mysqldump 等程序在本章中没有给出任何- h、- u或- p选项。笔者假定您将会用连接服务器所需的任何选项调用这些程序。
用无特权的用户账号运行MySQL服务器
在讨论如何启动服务器之前,考虑一下在服务器启动时应该运行哪个账号。服务器可以手工和自动启动。如果手工启动,则服务器以UNIX 用户身份运行(您恰好作为该用户进行了注册)。即,如果笔者以paul 进行注册并启动服务器,则它将以paul 身份运行。如果用s u命令将用户切换到root 然后启动服务器,则服务器以root 身份运行。
但是,大多数时候可能都不会采用手工启动服务器。您很可能将安排服务器在系统引导时作为标准启动过程的一部分自动地运行。在UNIX中,该启动过程由系统以UNIX 的r o o t用户的身份执行,该过程中启动的任何进程都用root 的权限运行。
应该紧记MySQL服务器启动过程的两个目标:
要服务器以某些非root 的用户身份启动。通常,除非进程真的需要root 访问权而mysql办不到,否则应限制任何进程的能力。
要服务器始终以同一个用户的身份运行。服务器有时作为一个用户运行而有时又作为另一个用户运行时会产生矛盾。这将导致文件和目录以不同的所有权在该数据下被创建,甚至引起服务器不能访问数据库或表。以同一个用户的身份一致地运行服务器可以避免该问题。
为了以标准的、非特权的用户身份运行数据库,可按如下步骤执行该过程:
1) 选择用于运行服务器的账号。mysqld 可以以任何用户身份运行,但是很明显,它只为MySQL活动创建了一个单独的账号。您也可以为MySQL专门指定一个组。笔者将调用的这些用户和组的名字命名为mysqladm 和mysqlg r p。如果您使用了其他的名字,则在本书中有mysqladm 和mysqlgrp 的地方替换它们
如果您在自己的账号下安装了MySQL并且系统中没有特定的管理权限,则您可以在自己的ID 用户下运行服务器。在这种情况下,应使用您自己的注册名和组名替代mysqladm 和mysqlgrp 。
如果您利用RPM 文件在RedHat Linux 下安装了MySQL,则该安装程序将在mysql名下自动创建了一个账号。应使用该名字替换mysqladm 。
2) 如果必要的话,可用系统常用的账号创建过程( a c count - c r e a t i o n)来创建服务器账号。这需要以root 身份进行操作。
3) 关闭服务器(如果它在运行)。
4) 修改数据目录以及任何子目录和文件的所有权,使mysqladm 用户拥有它们。例如,如果数据目录是/ us r / l o c a l / v a r,则可按以下设置mysqladm 用户的所有权:
# cd /usr/local/var 移动到数据目录
# chown -r mysqladmin.mysqlgrp 设置所有目录和文件的所有权
5) 修改数据目录以及任何子目录和文件的许可权,使得只有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 选项被增加到MySQL3.22 的mysql中。如果您的版本比MySQL3.22 旧,则在启动服务器并作为root 用户运行时,可以使用su命令指示系统在指定账号下运行服务器。您需要阅读有关su的人工页,因为作为一个指定用户运行命令的语法被改变了。
MySQL有很多可以导入数据的方法,然而这些只是数据传输中的一半,另外的一般是从MySQL数据库中导出数据。有许多的原因我们需要导出数据。一个重要的原因是用于备份数据库。数据的造价常常是昂贵的,需要谨慎处理它们。经常地备份可以帮助防止宝贵数据地丢失;另外一个原因是,也许您希望导出数据来共享。 在这个信息技术不断成长的世界中,共享数据变得越来越常见。
比方说Macmillan USA维护护着一个将要出版的书籍的大型数据库。这个数据库在许多书店之间共享,这样他们就知道哪些书将会很快出版。医院越来越走向采用无纸病历记录,这样这些病历可以随时跟着你。世界变得越来越小,信息也被共享得越来越多。有很多中导出数据得方法,它们都跟导入数据很相似。因为,毕竟,这些都只是一种透视得方式。从数据库导出的数据就是从另一端导入的数据。这里我们并不讨论其他的数据库各种各样的导出数据的方法,您将学会如何用MySQL来实现数据导出。
使用mysqldump:
(mysqldump命令位于mysql/bin/目录中)
mysqldump工具很多方面类似相反作用的工具mysqlimport。它们有一些同样的选项。但mysqldump能够做更多的事情。它可以把整个数据库装载到一个单独的文本文件中。这个文件包含有所有重建您的数据库所需要的SQL命令。这个命令取得所有的模式(Schema,后面有解释)并且将其转换成DDL语法(CREATE语句,即数据库定义语句),取得所有的数据,并且从这些数据中创建INSERT语句。这个工具将您的数据库中所有的设计倒转。因为所有的东西都被包含到了一个文本文件中。这个文本文件可以用一个简单的批处理和一个合适SQL语句导回到MySQL中。这个工具令人难以置信地简单而快速。决不会有半点让人头疼地地方。
因此,如果您像装载整个数据库Meet_A_Geek的内容到一个文件中,可以使用下面的命令:
bin/mysqldump –p Meet_A_Geek > MeetAGeek_Dump_File.txtbin/mysqldump –p Meet_A_Geek > MeetAGeek_Dump_File.txt
这个语句也允许您指定一个表进行dump(备份/导出/装载?)。如果您只是希望把数据库Meet_A_Geek中的表Orders中的整个内容导出到一个文件,可以使用下面的命令:
bin/mysqldump –p Meet_A_Geek Orders >MeetAGeek_Orders.txt
这个非常的灵活,您甚至可以使用WHERE从句来选择您需要的记录导出到文件中。要达到这样的目的,可以使用类似于下面的命令:
bin/mysqldump –p –where="Order_ID > 2000" Meet_A_Geek Orders > Special_Dump.txt
mysqldump工具有大量的选项,部分选项如下表:
选项/Option 作用/Action Performed
--add-drop-table
这个选项将会在每一个表的前面加上DROP TABLE IF EXISTS语句,这样可以保证导回MySQL数据库的时候不会出错,因为每次导回的时候,都会首先检查表是否存在,存在就删除
--add-locks
这个选项会在INSERT语句中捆上一个LOCK TABLE和UNLOCK TABLE语句。这就防止在这些记录被再次导入数据库时其他用户对表进行的操作
-c or - complete_insert
这个选项使得mysqldump命令给每一个产生INSERT语句加上列(field)的名字。当把数据导出导另外一个数据库时这个选项很有用。
--delayed-insert 在INSERT命令中加入DELAY选项
-F or -flush-logs 使用这个选项,在执行导出之前将会刷新MySQL服务器的log.
-f or -force 使用这个选项,即使有错误发生,仍然继续导出
--full 这个选项把附加信息也加到CREATE TABLE的语句中
-l or -lock-tables 使用这个选项,导出表的时候服务器将会给表加锁。
-t or -no-create- info
这个选项使的mysqldump命令不创建CREATE TABLE语句,这个选项在您只需要数据而不需要DDL(数据库定义语句)时很方便。
-d or -no-data 这个选项使的mysqldump命令不创建INSERT语句。
在您只需要DDL语句时,可以使用这个选项。
--opt 此选项将打开所有会提高文件导出速度和创造一个可以更快导入的文件的选项。
-q or -quick 这个选项使得MySQL不会把整个导出的内容读入内存再执行导出,而是在读到的时候就写入导文件中。
-T path or -tab = path 这个选项将会创建两个文件,一个文件包含DDL语句或者表创建语句,另一个文件包含数据。DDL文件被命名为table_name.sql,数据文件被命名为table_name.txt.路径名是存放这两个文件的目录。目录必须已经存在,并且命令的使用者有对文件的特权。
-w "WHERE Clause" or -where = "Where clause "
如前面所讲的,您可以使用这一选项来过筛选将要放到 导出文件的数据。
关闭服务器
要想手工关闭服务器,可使用mysqla d m i n:
% mysqladmin shutdown
要想自动关闭服务器,您不需要做特别的操作。BSD 系统通常会通过给进程发送一个TERM 信号来关闭服务。进程或者对其作出反应,或者被随便地取消。当mysqld 接收到信号时,它会通过终止来响应。对于利用mysql.server 启动服务器的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 pit-viper.snake.net shutdown
如果此套接字文件被cron 作业删除,则问题将复发,直到您修改cron 作业或使用另一个套接字文件为止。您可以用全局选项文件指定另一个套接字文件。例如,如果数据目录为/ us r / l o c a l / v a r,则可通过将以下行添加到/ e t c / my.cnf 中来移动套接字文件到那里:
socket=/usr/local/var/mysql.sock
[client]
socket=/usr/local/var/mysql.sock
路径名是为服务器和客户机程序二者所指定的,以便它们能使用相同的套接字文件。如果只对服务器设置路径名,客户机程序将仍然在旧的位置上查找套接字文件。在做出这个修改后应重新启动服务器,使它在新的位置创建套接字文件。
如果由于您忘记了root 的口令或将其修改为一个您不知道的值而不能进行连接,则需要收回服务器的控制以便重新设置口令:
关闭服务器。如果您以root 用户的身份在服务器主机上进行登录,可用kill 命令终止服务器。通过使用ps 命令或通过查看服务器的PID 文件(通常放在数据目录中)能找出服务器的ID 进程。
最好先试着用标准的kill 命令取消服务器,该命令将一个TERM 信号发送到服务器上,以查看服务器是否通过关闭信号来响应。也就是说,表和日志将被适当地刷新。如果服务器被堵塞并且没有响应正常的终止信号,可使用kill -9 强制终止它。这是最后的一个
方法,因为可能存在未刷新的更改,并且要承担非一致状态下将表保留下来的风险。如果用kill -9 终止服务器,应确保在重新启动服务器之前利用myisamchk 和i s a m c h k对表进行检查(参见第13章)
用--skip-grant-tables 选项重新启动服务器。该操作告诉服务器不要使用授权的表检查连接。这允许您作为root 用户不用输入口令即可进行连接。在连接之后,修改r o o t的口令。
告诉服务器再利用mysqladmin flush-privileges 使用授权表启动。如果您的mysqladmin 版本不识别f l us h - priv i l e g e s,试着进行重新加载。
页:
[1]