MySQL/管理
包名通常是 mysql-server,要么直接使用,要么作为最新版本的过渡包。
当前的 稳定版 中有两个 Debian 包
- mysql-server: 依赖于最新版本的 MySQL
- mysql-server-5.0: MySQL 5.0
您可以使用以下命令安装它
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 会询问您是否要删除现有的数据库。请明智地回答!
包名是 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 建议您使用 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 许可问题)
$ 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
时,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 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 '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 [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 [...]
如果你管理很多帐户,这将非常方便!
从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
- ↑ 例如,你可能在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的方式来显示当前的服务器线程并终止它们。
这是一个正常的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 --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来保留一批转储文件。每天,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
。
有时可以在共享主机设施中找到 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
各种第三方图形界面和实用程序。
- phpMyAdmin (维基百科:phpMyAdmin)
- eSKUeL:phpMyAdmin 的替代方案
- 服务器上 MySQL 支持
- MySQL 管理员: 来自 MySQL AB。但是,如果您想创建真正的备份,请不要使用它,因为它使用客户端机器上的
at
运行备份,而客户端机器可能并非每天都在线。