如何使用MySQL客户端和相关实用程序
1. 概述
MySQL 自二十多年前诞生以来,一直是最流行的关系数据库之一。由于是开源的,它始终是 Web 服务器解决方案和类似独立应用程序的一个选项。
安装 MySQL 后,我们将有几个可用的二进制实用程序,很容易对每个实用程序的使用感到困惑。
在本教程中,我们将了解最常用的 MySQL 实用程序的用途以及一些示例。此处的解释也适用于 MariaDB,它是 MySQL 的原始开发人员制作的流行分支。
MariaDB 的创建是因为担心 MySQL 可能不会保持开源,并打算保持与 MySQL 的高度兼容性。
2. MySQL的安装与使用
大多数 Linux 发行版都为 MySQL 提供了两个包。第一个通常称为mysql-server。该软件包包含服务器和连接到服务器的所有实用程序。第二个包称为mysql-client ,仅包含实用程序。我们可以使用它连接到位于其他地方可到达位置的服务器。
不管包是什么,我们选择安装,我们都会有几个以*“mysql”开头的命令。如果我们的发行版使用bash-completion*包,我们可以键入“mysql TAB TAB ”,我们将获得以下可能的命令:
$ mysql
mysql mysqldump mysqlrepair
mysql_config_editor mysqldumpslow mysqlreport
mysqladmin mysqlimport mysqlshow
mysqlanalyze mysqloptimize mysqlslap
mysqlcheck mysqlpump
$ mysql
让我们首先关注可能导致更多混乱的命令:mysql 和mysqladmin。
2.1. database
**mysql 是命令行客户端和连接到 MySQL 服务器的主要二进制文件。**它提供了一个 shell,我们可以在其中与 MySQL 或 MariaDB 服务器进行交互。安装mysql-server包时,我们可以通过简单地发出命令来连接:
$ sudo mysql -u root
Welcome to the MySQL monitor. Commands end with ; or \g.
...
mysql>
通过这个命令,我们可以在交互模式下访问 shell。我们可以连续输入 SQL 语句来与我们的数据库进行交互,使用相同的连接。
大多数 Linux 发行版都需要以超级用户身份运行这些实用程序,就像我们在上面使用sudo 命令所做的那样。
MySQL shell 允许使用 SQL 查询数据库。例如,我们可以查询系统数据库以获取系统上的所有用户:
mysql> select host, user from mysql.user;
+-----------+------------------+
| host | user |
+-----------+------------------+
| % | root |
...
+-----------+------------------+
6 rows in set (0.00 sec)
mysql>
我们还可以使用 MySQL 特定的语句,如USE和SHOW TABLES:
mysql> USE mysql;
...
Database changed
mysql> SHOW TABLES;
+---------------------------+
| Tables_in_mysql |
+---------------------------+
| columns_priv |
...
+---------------------------+
33 rows in set (0.01 sec)
mysql>
有几种方法可以离开 shell,但最简单的方法之一是按下CTRL+D键:
mysql> ^DBye
$
2.2. mysqladmin
**mysqladmin 是一个用于在服务器上执行管理任务的工具。**它是一个非交互式客户端,需要带有我们要执行的操作的命令。
尽管弄错这最后两个二进制文件的情况并不少见,但它们在不同的上下文中使用以获得不同的结果。
我们可能更多地使用mysql来与我们的数据库和表进行交互。另一方面,我们可能会更谨慎地使用mysqladmin来更改服务器上的某些内容。
例如,我们可以使用mysqladmin创建和删除数据库:
$ sudo mysqladmin create the_database
$
$ sudo mysqladmin drop the_database
...
Do you really want to drop the 'the_database' database [y/N] y
Database "the_database" dropped
$
更让人困惑的是,我们还可以使用mysql创建和删除数据库。但这就是比较结束的地方。我们现在将看到的所有其他操作只能通过mysqladmin来实现。
例如,让我们看看如何先使用ping然后再使用status 检查服务器的状态:
$ sudo mysqladmin ping
mysqld is alive
$
$ sudo mysqladmin status
Uptime: 89118 Threads: 2 Questions: 4379 Slow queries: 0 Opens: 7087 Flush tables: 3 Open tables: 516 Queries per second avg: 0.049
$
特别是监控系统,可以发现上述命令对于定期检查非常有用。
假设我们需要识别并删除一个长时间运行的查询。我们可以为此使用processlist和kill :
$ sudo mysqladmin processlist
+----+-----------------+-----------+----+---------+-------+------------------------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+-----------------+-----------+----+---------+-------+------------------------+------------------+
| 5 | event_scheduler | localhost | | Daemon | 89464 | Waiting on empty queue | |
| 41 | root | localhost | | Query | 51 | executing | select ... |
| 43 | root | localhost | | Query | 0 | starting | show processlist |
+----+-----------------+-----------+----+---------+-------+------------------------+------------------+
$
$ sudo mysqladmin kill 41
$
我们可以使用mysqladmin 的其他几个命令 ,例如,更改密码或重新加载权限。
2.3. mysqldump
**mysqldump 是另一个有用的实用程序。它用于备份数据库。**它输出一组 SQL 语句,执行时可以重新创建我们备份的数据库。如果我们想保存它,我们需要将输出重定向到一个文件:
$ sudo mysqldump sys > sys_database.sql
如果我们以后要恢复备份,可以使用mysql执行备份文件中的所有命令:
$ sudo mysql < sys_database.sql
当备份只包含一个数据库时,我们需要编辑它以包含语句USE database(如果数据库存在)或CREATE database(如果不存在)。如果我们不加改动地执行备份文件,我们会得到一个错误:
$ sudo mysql < sys_database.sql
ERROR 1046 (3D000) at line 22: No database selected
$
mysqldump是一个方便的工具。它产生易于理解的输出,并且该过程可能需要合理的时间来执行,即使对于大型数据库也是如此。
另一方面,恢复数据库的过程涉及大量语句的执行,每个语句都有自己的磁盘 I/O 延迟。对于大型数据库,最好执行物理备份,直接从文件系统复制。
2.4. mysqlimport
mysqlimport 是一个执行LOAD DATA语句以“以非常高的速度”插入数据的工具,正如MySQL 文档 所解释的那样。
数据需要首先使用SELECT … INTO OUTFILE语句导出,以便能够使用mysqlimport导入:
$ sudo mysql
...
mysql> SELECT * FROM the_database.the_table INTO OUTFILE '/var/lib/mysql-files/the_table.data';
Query OK, 7 rows affected (0.01 sec)
稍后,在不同的服务器或数据库上,我们可以导入数据:
$ sudo mysqlimport the_database /var/lib/mysql-files/the_table
2.5. mysqlcheck
我们要讨论的最后一个实用程序是**mysqlcheck ,这是一个执行CHECK TABLE SQL 语句的**便捷工具。与其他命令一样,我们至少需要提供要检查的数据库:
$ sudo mysqlcheck mysql
mysql.columns_priv OK
...
mysql.user OK
$
添加了指向mysqlcheck的其他符号链接 以执行其他表维护语句 — mysqlrepair用于REPAIR TABLE,mysqlanalize用于ANALYZE TABLE,mysqloptimize用于OPTIMIZE TABLE。我们可以在MySQL文档 中找到每条语句的使用细节。