跳到内容

MySQL/管理

来自 Wikibooks,开放世界中的开放书籍

Debian 包

[编辑 | 编辑源代码]

包名通常是 mysql-server,要么直接使用,要么作为最新版本的过渡包。

稳定版

[编辑 | 编辑源代码]

当前的 稳定版 中有两个 Debian 包

您可以使用以下命令安装它

apt-get install mysql-server

或者使用 Synaptic GUI 安装您想要的包。

反向移植

[编辑 | 编辑源代码]

Backports.org 也可能提供更新的版本。

要安装它,您需要在 /etc/apt/sources.list 中添加反向移植源

deb http://www.backports.org/debian lenny-backports main

然后使用 aptitude

apt-get install -t lenny-backports mysql-server-5.1

要简单地删除程序

apt-get remove mysql-server

要删除配置文件,从而产生一个干净的环境

apt-get remove --purge mysql-server

Debconf 会询问您是否要删除现有的数据库。请明智地回答!

Fedora Core 5

[编辑 | 编辑源代码]

包名是 mysql-server

您可以使用以下命令安装它

yum install mysql-server

它会安装必要的依赖项。


使用 pirut(应用程序->添加/删除软件),您也可以在 服务器 类别中找到 MySQL 数据库 服务器

MySQL 在主要的 Portage 树中可用,名为“dev-db/mysql”。您必须使用完全限定的 ebuild 名称,因为“mysql”会因“virtual/mysql”而变得不明确。

命令

emerge dev-db/mysql

稳定的 FreeBSD 端口是 5.0 版本,beta 版 5.1 也可用。

您可以使用以下命令安装它

cd /usr/ports/databases/mysql50-server/ && make install clean

此命令将安装 MySQL 5.0 服务器以及所有必要的依赖项(包括 MySQL 客户端)。t

启动服务

[编辑 | 编辑源代码]

在 Debian 中,您使用 mysql 初始化脚本。

/etc/init.d/mysql start
/etc/init.d/mysql stop
/etc/init.d/mysql restart

如果您需要在脚本中执行此操作,请优先使用 invoke-rc.d 命令,它只在服务在系统启动时启动的情况下才会重新启动服务。这样,您就不会在不需要运行服务的情况下启动它。

invoke-rc.d mysql start|stop|restart

如果您想控制 MySQL 是否在启动时启动,可以使用 rcconf 包或 update-rc.d

cp /usr/local/mysql/support-files/mysql.server /etc/init.d/anysqlservernamehere
chmod +x /etc/init.d/anysqlservernamehere
update-rc.d anysqlservernamehere defaults

Fedora Core

[编辑 | 编辑源代码]

Fedora Core 建议您使用 service 包装器,它会在运行服务之前清理环境,以便所有服务在同一个标准环境中运行(例如,当前目录设置为系统根目录 /)。

service mysqld start|stop|restart
service mysqld --full-restart # means stop, then start - not a direct restart

如果需要,您也可以使用 /etc/init.d/mysqld

FC5 在您第一次启动 MySQL 服务器时(即启动 /usr/bin/mysql_install_db 时)会显示有用的提示。

$ service mysqld start
[...]
PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER !
To do so, start the server, then issue the following commands:
/usr/bin/mysqladmin -u root password 'new-password'
/usr/bin/mysqladmin -u root -h localhost password 'new-password'
[...] 

请参阅下一节了解更改密码。

要控制 MySQL 是否在启动时启动,可以使用 ntsysv 工具:

客户端连接

[编辑 | 编辑源代码]

有两种方法可以连接到 MySQL 服务器,使用 Unix 套接字和 TCP/IP。

默认的 TCP/IP 端口是 3306

# grep mysql /etc/services
mysql           3306/tcp                        # MySQL
mysql           3306/udp                        # MySQL
mysql-cluster   1186/tcp                        # MySQL Cluster Manager
mysql-cluster   1186/udp                        # MySQL Cluster Manager
mysql-im        2273/tcp                        # MySQL Instance Manager
mysql-im        2273/udp                        # MySQL Instance Manager

作为客户端,MySQL 将“localhost”解释为“使用 Unix 套接字”。这意味着 MySQL 不会连接到 127.0.0.1:3306,而是会使用 /var/run/mysqld/mysqld.sock

$ mysql -h localhost
mysql> \s
--------------
mysql  Ver 14.12 Distrib 5.0.22, for redhat-linux-gnu (i386) using readline 5.0
[...]
Current user:           sylvain@localhost
[...]
Connection:             Localhost via UNIX socket
[...]
UNIX socket:            /var/lib/mysql/mysql.sock

如果您确实需要通过 TCP/IP 连接到本地主机上的 MySQL,而无需使用 Unix 套接字,那么请指定“127.0.0.1”而不是“localhost”

$ mysql -h 127.0.0.1
mysql> \s
--------------
mysql  Ver 14.12 Distrib 5.0.22, for redhat-linux-gnu (i386) using readline 5.0
[...]
Current user:           sylvain@localhost
[...]
Connection:             127.0.0.1 via TCP/IP
[...]
TCP port:               3306

在这两种情况下,MySQL 都将您的机器名称理解为“localhost”(这在权限系统中使用)。

配置 /etc/mysql/my.cnf - 用于负载很重的数据库,用于大型数据库...;不同类型的连接(Unix 套接字,带或不带 SSL 的 TCP/IP,MySQL+SSL 许可问题)

更改 root 密码

[编辑 | 编辑源代码]
$ mysql -u root
mysql> SET PASSWORD = PASSWORD('PassRoot');

更多信息请参见#SET_PASSWORD部分。

网络配置

[编辑 | 编辑源代码]
--bind-address=127.0.0.1 # localhost only
--bind-address=0.0.0.0 # listen on all interfaces
--bind-address=192.168.1.120 # listen on that IP only

skip-networking

[编辑 | 编辑源代码]

当你在配置文件中指定skip-networking时,MySQL将不会监听任何端口,甚至包括本地主机(127.0.0.1)。这意味着只有与MySQL服务器运行在同一台机器上的程序才能连接到它。这在专用服务器上是一种常见的设置。

联系MySQL的唯一方法是使用本地Unix套接字,例如/var/run/mysqld/mysqld.sock(Debian)或/var/lib/mysql/mysql.sock(FC5)。你可以使用配置文件[mysqld]部分的socket参数指定套接字的位置。

[mysqld]
...
socket=/var/lib/mysql/mysql.sock

MySQL权限系统。

MySQL要求你在连接到数据库时进行身份验证。你需要提供以下凭据:

  • 身份,由以下组成:
    • 用户名
    • 机器名或IP地址(由服务器自动检测)
  • 密码,用于证明你的身份

通常,支持MySQL的应用程序还会要求你提供数据库名称,但这不是凭据的一部分,因为它与你的身份无关。

然后,MySQL会将权限与这些凭据关联起来;例如,查询给定数据库、向另一个数据库添加数据、创建其他数据库或删除现有数据库等的权限。

我是谁?

[编辑 | 编辑源代码]

连接后,不一定能明显地知道MySQL认为你是谁。CURRENT_USER()可以提供此信息。

mysql> SELECT CURRENT_USER();
+----------------+
| CURRENT_USER() |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)

SHOW GRANTS

[编辑 | 编辑源代码]

原型

SHOW GRANTS FOR user
SHOW GRANTS --current user

SHOW GRANTS允许你检查给定用户的当前权限。例如,以下是用户root的默认权限:

mysql> SHOW GRANTS FOR 'root'@'localhost';
+---------------------------------------------------------------------+
| Grants for root@localhost                                           |
+---------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION |
+---------------------------------------------------------------------+
1 row in set (0.00 sec)

你也可以使用SHOW GRANTS;检查当前用户的权限。

GRANT命令允许你授予(GRANT)给定用户权限。

GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, REFERENCES, database.* 
TO 'user'@'localhost';

DROP USER

[编辑 | 编辑源代码]
DROP USER 'mediawiki';
DROP USER 'mediawiki'@'host';

从v5.0.2开始,这也会删除关联的权限。

在早期版本中,你还需要手动REVOKE其权限。

REVOKE ALL PRIVILEGES ON database.* FROM 'user'@'host';
REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'user'@'host';

SET PASSWORD

[编辑 | 编辑源代码]

原型

SET PASSWORD [FOR user] = PASSWORD('your_password')

如果未指定user,则使用当前用户(这在使用命令行连接到mysql时很有用)。

带有显式用户的示例

SET PASSWORD FOR 'mediawiki'@'localhost' = PASSWORD('ifda8GQg');


有一个命令行同义词

mysqladmin password 'your_password'

(带有通常的连接选项-h -u-p

但是,在命令行中使用密码存在安全风险。例如,如果root更改了他的MySQL密码

root# mysqladmin password 'K2ekiEk3'

那么另一个用户可以通过查看进程列表来监视他

user$ ps aux | grep mysqladmin
root      7768  0.0  0.1   7044  1516 pts/1    S+   16:57   0:00 mysqladmin password K2ekiEk3

结论:不要使用mysqladmin password


如果你正在寻找生成密码的方法,无论是安全的还是易于记忆的,请尝试使用pwgen程序(有一个Debian包可用)

$ pwgen
ooGoo7ba ir4Raeje Ya2veigh zaXeero8 Dae8aiqu rai9ooYi phoTi6gu Yeingo9r
tho9aeDa Ohjoh6ai Aem8chee aheich8A Aelaeph3 eu4Owudo koh6Iema oH6ufuya
[...]
$ pwgen -s # secure
zCRhn8LH EJtzzLRE G4Ezb5BX e7hQ88In TB8hE6nn f8IqdMVQ t7BBDWTH ZZMhZyhR
gbsXdIes hCQMbPE6 XD8Owd0b xitloisw XCWKX9B3 MEATkWHH vW2Y7HnA 3V5ubf6B
[...]

如果你管理很多帐户,这将非常方便!

MySQL 4.1密码问题

[编辑 | 编辑源代码]

从4.1版本开始,MySQL引入了一个与密码相关的更改。

你将通过以下错误体验到这一点:客户端不支持服务器请求的身份验证协议;请考虑升级MySQL客户端[1]

如果你希望支持较旧的客户端程序,你需要以这种方式定义MySQL帐户密码

SET PASSWORD [FOR user] = OLD_PASSWORD('your_pass');

显然,无法使用旧的密码与GRANT ... IDENTIFIED BY 'password'语法一起使用。

或者,你可以在服务器的my.cnf文件中使用old_passwords配置选项。这意味着新的密码将使用旧式、更短、安全性更低的格式进行编码。例如,在Debian Sarge和FC5中,MySQL默认配置强制使用旧式密码,以保持与旧客户端的向后兼容性

[mysqld]
...
old_passwords=1
  1. 例如,你可能在Debian Sarge的apache+libapache_mod_php4+php4-mysql上遇到此错误,后者依赖于libmysqlclient12,即MySQL 4.0(ldd /usr/lib/php4/20020429/mysql.so显示libmysqlclient.so.12 => /usr/lib/libmysqlclient.so.12)。如果你依赖libmysqlclient14或更高版本,那么你的应用程序将同时支持旧密码格式和新密码格式。

MySQL提供了一种类似于Unix的方式来显示当前的服务器线程并终止它们。

SHOW PROCESSLIST

[编辑 | 编辑源代码]

这是一个正常的MySQL服务器

mysql> SHOW PROCESSLIST;
+----+-----------+-----------+-----------+---------+------+-------+------------------+
| Id | User      | Host      | db        | Command | Time | State | Info             |
+----+-----------+-----------+-----------+---------+------+-------+------------------+
| 34 | monddprod | localhost | monddprod | Sleep   | 1328 |       | NULL             |
| 43 | root      | localhost | NULL      | Query   |    0 | NULL  | SHOW PROCESSLIST |
+----+-----------+-----------+-----------+---------+------+-------+------------------+
2 rows in set (0.00 sec)

mysqladmin提供了一个命令行同义词

$ mysqladmin processlist
+----+-----------+-----------+-----------+---------+------+-------+------------------+
| Id | User      | Host      | db        | Command | Time | State | Info             |
+----+-----------+-----------+-----------+---------+------+-------+------------------+
| 34 | monddprod | localhost | monddprod | Sleep   | 1368 |       |                  |
| 44 | root      | localhost |           | Query   | 0    |       | show processlist |
+----+-----------+-----------+-----------+---------+------+-------+------------------+

如果一个繁重的、糟糕的查询在你的服务器上消耗了太多资源,你需要关闭它。

TODO: Add a sample SHOW PROCESSLIST output here

最直接的方法是重启服务器

/etc/init.d/mysql restart

一种更巧妙的方法是使用SHOW PROCESSLIST来识别糟糕的查询,并将其独立于其他服务器线程终止。

mysql> KILL 342;
Query OK, 0 rows affected (0.00 sec)

还有一个命令行同义词

$ mysqladmin kill 342

安全性

[编辑 | 编辑源代码]

基本安全性:防火墙(iptables)、SELinux?另外,一些关于以下内容的说明:不要以明文形式存储密码

备份/恢复和导入/导出技术。

mysqldump

[编辑 | 编辑源代码]
mysqldump --opt -h 192.168.2.105 -u john -p'****' mybase | gzip > mybase-`date +%Y%m%d`.sql.gz

这将创建mybase-20061027.sql.gz文件。

--opt是一个神奇的选项,它使用所有通常有用的选项。在最近版本的mysqldump中,它甚至默认启用,因此你无需键入它。--opt表示--add-drop-table --add-locks --create-options --disable-keys --extended-insert --lock-tables --quick --set-charset - 所以它将在备份期间锁定表以确保一致性,添加DROP TABLE语句,以便可以在不清理目标数据库的情况下应用转储,将使用最有效的方式执行INSERT操作并指定使用的字符集(latin1、Unicode/UTF-8...)。

如果你没有为mysqldump提供数据库,你将获得一个包含所有数据库的备份 - 这在以后恢复单个数据库时不太方便。

使用logrotate每天轮换mysqldump

[编辑 | 编辑源代码]

我们以一种略微非标准的方式使用logrotate来保留一批转储文件。每天,logrotate都会循环转储文件以保留最后N个转储文件,自动删除旧的备份,并通过一个postrotate钩子立即生成新的转储文件。

以下配置保留了2个月的每日备份

/dumps/mybase.sql.gz {
        rotate 60
        dateext
        dateyesterday
        daily
        nocompress
        nocopytruncate
        postrotate
          HOME=/root mysqldump --opt mybase | gzip > /dumps/mybase.sql.gz
        endscript
}

有关更多信息,请参阅GNU/Linux手册页中的logrotate(8)。

备份所有数据库的变体

/dumps/*/*.sql.gz {
        daily
        rotate 20
        dateext
        dateyesterday
        nocompress
        sharedscripts
        create
        postrotate
                export HOME=/root
                for i in $(mysql --batch --skip-column-names -e 'SHOW DATABASES' | grep -vE '^information_schema|performance_schema$'); do
                        if [ ! -e /dumps/$i ]; then mkdir -m 700 /dumps/$i; fi
                        mysqldump --events $i | gzip -c > /dumps/$i/$i.sql.gz
                done
        endscript
}

设置

  • 为无密码数据库访问创建你的~/.my.cnf
  • 将上面的logrotate配置文件放置在/etc/logrotate.d/目录中
  • 引导第一个转储
    • mkdir -m 700 /dumps
    • mkdir -m 700 /dumps/mybase
    • touch /dumps/mybase/mybase.sql.gz
    • logrotate -f /etc/logrotate.d/mysql-dumps
  • 使用 zcat /dumps/mybase.sql.gz 检查转储。


代码注释:对于在 cron 中设置 HOME=/ 的系统(例如 FC5),需要使用 HOME=/root,以防止 mysqldump 找不到 .my.cnf 配置文件。我们还使用 | gzip 而不是 logrotate 的 compress 选项,以提高磁盘 I/O 效率(单步操作)。


在生产环境中,您将获得类似以下内容

# ls -lt /dumps
total 16520
-rw-r----- 1 root clisscom 2819533 mar  2 06:25 clisscom.sql.gz
-rw-r----- 1 root clisscom 2815193 mar  1 06:25 clisscom.sql.gz-20100302
-rw-r----- 1 root clisscom 2813579 fév 28 06:26 clisscom.sql.gz-20100301
-rw-r----- 1 root clisscom 2812251 fév 27 06:25 clisscom.sql.gz-20100228
-rw-r----- 1 root clisscom 2810803 fév 26 06:25 clisscom.sql.gz-20100227
-rw-r----- 1 root clisscom 2808785 fév 25 06:25 clisscom.sql.gz-20100226
...

请注意,文件名中的日期是轮换日期,而不是转储日期。使用 dateext 有助于远程备份,因为文件名不会每天更改,因此您无需每次都重新下载所有 /dumps

使用 CGI 进行远程 mysqldump

[编辑 | 编辑源代码]

有时可以在共享主机设施中找到 mysqldump。您可以使用简单的 CGI 脚本获取直接转储

#!/bin/sh

echo "Content-Type: application/x-tar"
echo "Content-Encoding: x-gzip"
echo ""

mysqldump --host=mysql.hosting.com --user=john --password=XXXXX my_base | gzip 2>&1

然后,您可以使用浏览器或 wget 获取它

$ wget -O- --quiet https://127.0.0.1/~sylvain/test2.cgi > base-`date +%Y%m%d`.sql.gz

您甚至可以在本地测试数据库中实时重新注入它

$ wget -O- --quiet https://127.0.0.1/~sylvain/test2.cgi | gunzip | mysql test_install -u myself -pXXXX

使用 .htaccess 保护脚本,为 wget 编写 .netrc,您将拥有一个简单、无人值守的方式来抓取备份,即使没有命令行访问权限。这允许在抓取转储时节省时间(与使用 phpMyAdmin 相比)并设置远程自动备份(无需交互)。

如果您有权访问 exec(),类似的东西应该在 PHP 中可行。

导出单个表

[编辑 | 编辑源代码]

如果您需要导入/导出表(而不是完整数据库),请查看 MySQL/Language#Import_.2F_export

二进制日志

[编辑 | 编辑源代码]

二进制日志是一种机制,用于跟踪 MySQL 服务器上发生的所有事件(取证),允许在不同的计算机(主/从复制)上或在以后的时间(崩溃恢复)上重放相同的命令序列。

在 Debian 上,它们存储在 /var/log/mysql/mysql-bin.0* 中。

要查看二进制日志中的 SQL 命令,请使用 mysqlbinlog 命令

mysqlbinlog /var/log/mysql/mysql-bin.000001

为了使崩溃恢复有用,二进制日志通常存储在不同的计算机上(例如,通过 NFS 挂载)。请注意,它旨在恢复整个 mysql 服务器,而不仅仅是一个数据库。您可以尝试按数据库过滤日志,但这并不简单。

因此,为了使用二进制日志作为恢复计划,您通常将它们与完整的标准备份结合使用

mysqldump -A | gzip > all.sql.gz

要同时刷新/重置日志(待办事项:测试)

mysqldump -A --master-data --flush-logs | gzip > all.sql.gz

要恢复,您只需将这两个来源合并起来(最好在恢复期间禁用服务器配置中的二进制日志记录,并在之后重新启用它)。

(zcat all.sql.gz && mysqlbinlog /var/log/mysql/mysql-bin.0*) | mysql

有趣日志的位置,常见的错误要查看。例如

tail -f /var/log/mysql.log

管理工具

[编辑 | 编辑源代码]

各种第三方图形界面和实用程序。

Web 界面

[编辑 | 编辑源代码]

桌面 GUI

[编辑 | 编辑源代码]
  • MySQL 管理员: 来自 MySQL AB。但是,如果您想创建真正的备份,请不要使用它,因为它使用客户端机器上的 at 运行备份,而客户端机器可能并非每天都在线。
华夏公益教科书