Contents

如何使用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 特定的语句,如USESHOW 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
$

特别是监控系统,可以发现上述命令对于定期检查非常有用。

假设我们需要识别并删除一个长时间运行的查询。我们可以为此使用processlistkill

$ 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 TABLEmysqlanalize用于ANALYZE TABLEmysqloptimize用于OPTIMIZE TABLE。我们可以在MySQL文档 中找到每条语句的使用细节。