MySQL8-中文参考-四-

MySQL8 中文参考(四)

原文:docs.oracle.com/javase/tutorial/reallybigindex.html

原文:dev.mysql.com/doc/refman/8.0/en/working-with-null.html

5.3.4.6 处理 NULL 值

直到你习惯了,NULL值可能会让人感到惊讶。从概念上讲,NULL表示“缺失的未知值”,并且它与其他值的处理方式略有不同。

要测试NULL,请使用IS NULLIS NOT NULL运算符,如下所示:

mysql> SELECT 1 IS NULL, 1 IS NOT NULL;
+-----------+---------------+
| 1 IS NULL | 1 IS NOT NULL |
+-----------+---------------+
|         0 |             1 |
+-----------+---------------+

您不能使用算术比较运算符如=<<>来测试NULL。为了自己演示这一点,请尝试以下查询:

mysql> SELECT 1 = NULL, 1 <> NULL, 1 < NULL, 1 > NULL;
+----------+-----------+----------+----------+
| 1 = NULL | 1 <> NULL | 1 < NULL | 1 > NULL |
+----------+-----------+----------+----------+
|     NULL |      NULL |     NULL |     NULL |
+----------+-----------+----------+----------+

因为与NULL进行任何算术比较的结果也是NULL,所以您无法从这些比较中获得任何有意义的结果。

在 MySQL 中,0NULL表示假,而其他任何值表示真。布尔运算的默认真值为1

这种对NULL的特殊处理是为什么在前一节中需要使用death IS NOT NULL而不是death <> NULL来确定哪些动物不再活着。

两个NULL值在GROUP BY中被视为相等。

在进行ORDER BY时,如果使用ORDER BY ... ASC,则NULL值会首先呈现,如果使用ORDER BY ... DESC,则会最后呈现。

处理NULL时的一个常见错误是假设无法将零或空字符串插入定义为NOT NULL的列,但事实并非如此。这些实际上是值,而NULL表示“没有值”。您可以通过使用IS [NOT] NULL来轻松测试,如下所示:

mysql> SELECT 0 IS NULL, 0 IS NOT NULL, '' IS NULL, '' IS NOT NULL;
+-----------+---------------+------------+----------------+
| 0 IS NULL | 0 IS NOT NULL | '' IS NULL | '' IS NOT NULL |
+-----------+---------------+------------+----------------+
|         0 |             1 |          0 |              1 |
+-----------+---------------+------------+----------------+

因此,完全可以将零或空字符串插入NOT NULL列,因为这些实际上是NOT NULL。参见 Section B.3.4.3, “Problems with NULL Values”。

原文:dev.mysql.com/doc/refman/8.0/en/pattern-matching.html

5.3.4.7 模式匹配

MySQL 提供标准 SQL 模式匹配以及一种基于扩展正则表达式的模式匹配形式,类似于 Unix 实用程序(如vigrepsed)中使用的形式。

SQL 模式匹配使您可以使用_匹配任意单个字符和%匹配任意数量的字符(包括零个字符)。在 MySQL 中,默认情况下,SQL 模式是不区分大小写的。这里显示了一些示例。在使用 SQL 模式时,请不要使用=<>。请改用LIKENOT LIKE比较运算符。

要查找以b开头的名称:

mysql> SELECT * FROM pet WHERE name LIKE 'b%';
+--------+--------+---------+------+------------+------------+
| name   | owner  | species | sex  | birth      | death      |
+--------+--------+---------+------+------------+------------+
| Buffy  | Harold | dog     | f    | 1989-05-13 | NULL       |
| Bowser | Diane  | dog     | m    | 1989-08-31 | 1995-07-29 |
+--------+--------+---------+------+------------+------------+

要查找以fy结尾的名称:

mysql> SELECT * FROM pet WHERE name LIKE '%fy';
+--------+--------+---------+------+------------+-------+
| name   | owner  | species | sex  | birth      | death |
+--------+--------+---------+------+------------+-------+
| Fluffy | Harold | cat     | f    | 1993-02-04 | NULL  |
| Buffy  | Harold | dog     | f    | 1989-05-13 | NULL  |
+--------+--------+---------+------+------------+-------+

要查找包含w的名称:

mysql> SELECT * FROM pet WHERE name LIKE '%w%';
+----------+-------+---------+------+------------+------------+
| name     | owner | species | sex  | birth      | death      |
+----------+-------+---------+------+------------+------------+
| Claws    | Gwen  | cat     | m    | 1994-03-17 | NULL       |
| Bowser   | Diane | dog     | m    | 1989-08-31 | 1995-07-29 |
| Whistler | Gwen  | bird    | NULL | 1997-12-09 | NULL       |
+----------+-------+---------+------+------------+------------+

要查找包含正好五个字符的名称,请使用五个_模式字符的实例:

mysql> SELECT * FROM pet WHERE name LIKE '_____';
+-------+--------+---------+------+------------+-------+
| name  | owner  | species | sex  | birth      | death |
+-------+--------+---------+------+------------+-------+
| Claws | Gwen   | cat     | m    | 1994-03-17 | NULL  |
| Buffy | Harold | dog     | f    | 1989-05-13 | NULL  |
+-------+--------+---------+------+------------+-------+

MySQL 提供的另一种模式匹配类型使用扩展正则表达式。当您测试此类型模式的匹配时,请使用REGEXP_LIKE()函数(或REGEXPRLIKE运算符,它们是REGEXP_LIKE()的同义词)。

以下列表描述了扩展正则表达式的一些特征:

  • .匹配任意单个字符。

  • 字符类[...]匹配括号内的任何字符。例如,[abc]匹配abc。要命名一系列字符,请使用短划线。[a-z]匹配任何字母,而[0-9]匹配任何数字。

  • *匹配其前面的内容的零个或多个实例。例如,x*匹配任意数量的x字符,[0-9]*匹配任意数量的数字,.*匹配任意数量的任何内容。

  • 如果正则表达式模式匹配值的任何位置,则正则表达式模式匹配成功。(这与LIKE模式匹配不同,后者仅在模式完全匹配值时才成功。)

  • 要锚定模式,使其必须匹配值的开头或结尾,请在模式的开头使用^或在结尾使用$

为了演示扩展正则表达式的工作原理,先前显示的LIKE查询在这里重新编写为使用REGEXP_LIKE()

要查找以b开头的名称,请使用^匹配名称的开头:

mysql> SELECT * FROM pet WHERE REGEXP_LIKE(name, '^b');
+--------+--------+---------+------+------------+------------+
| name   | owner  | species | sex  | birth      | death      |
+--------+--------+---------+------+------------+------------+
| Buffy  | Harold | dog     | f    | 1989-05-13 | NULL       |
| Bowser | Diane  | dog     | m    | 1979-08-31 | 1995-07-29 |
+--------+--------+---------+------+------------+------------+

要强制正则表达式比较区分大小写,请使用区分大小写的排序规则,或使用BINARY关键字使其中一个字符串成为二进制字符串,或指定c匹配控制字符。每个查询仅匹配名称开头的小写b

SELECT * FROM pet WHERE REGEXP_LIKE(name, '^b' COLLATE utf8mb4_0900_as_cs);
SELECT * FROM pet WHERE REGEXP_LIKE(name, BINARY '^b');
SELECT * FROM pet WHERE REGEXP_LIKE(name, '^b', 'c');

要查找以fy结尾的名称,请使用$来匹配名称的结尾:

mysql> SELECT * FROM pet WHERE REGEXP_LIKE(name, 'fy$');
+--------+--------+---------+------+------------+-------+
| name   | owner  | species | sex  | birth      | death |
+--------+--------+---------+------+------------+-------+
| Fluffy | Harold | cat     | f    | 1993-02-04 | NULL  |
| Buffy  | Harold | dog     | f    | 1989-05-13 | NULL  |
+--------+--------+---------+------+------------+-------+

要查找包含w的名称,请使用此查询:

mysql> SELECT * FROM pet WHERE REGEXP_LIKE(name, 'w');
+----------+-------+---------+------+------------+------------+
| name     | owner | species | sex  | birth      | death      |
+----------+-------+---------+------+------------+------------+
| Claws    | Gwen  | cat     | m    | 1994-03-17 | NULL       |
| Bowser   | Diane | dog     | m    | 1989-08-31 | 1995-07-29 |
| Whistler | Gwen  | bird    | NULL | 1997-12-09 | NULL       |
+----------+-------+---------+------+------------+------------+

因为正则表达式模式匹配的是值中的任何位置,所以在前面的查询中,不需要在模式的两侧放置通配符来使其匹配整个值,这与 SQL 模式不同。

要查找恰好包含五个字符的名称,请使用^$来匹配名称的开头和结尾,并在中间使用五个.的实例:

mysql> SELECT * FROM pet WHERE REGEXP_LIKE(name, '^.....$');
+-------+--------+---------+------+------------+-------+
| name  | owner  | species | sex  | birth      | death |
+-------+--------+---------+------+------------+-------+
| Claws | Gwen   | cat     | m    | 1994-03-17 | NULL  |
| Buffy | Harold | dog     | f    | 1989-05-13 | NULL  |
+-------+--------+---------+------+------------+-------+

使用{*n*}(“重复-n-次”)操作符,你也可以编写前面的查询:

mysql> SELECT * FROM pet WHERE REGEXP_LIKE(name, '^.{5}$');
+-------+--------+---------+------+------------+-------+
| name  | owner  | species | sex  | birth      | death |
+-------+--------+---------+------+------------+-------+
| Claws | Gwen   | cat     | m    | 1994-03-17 | NULL  |
| Buffy | Harold | dog     | f    | 1989-05-13 | NULL  |
+-------+--------+---------+------+------------+-------+

有关正则表达式语法的更多信息,请参见第 14.8.2 节,“正则表达式”。

译文:dev.mysql.com/doc/refman/8.0/en/counting-rows.html

5.3.4.8 计算行数

数据库经常用于回答问题,“表中某种类型的数据发生多少次?” 例如,您可能想知道您有多少宠物,或每个所有者有多少宠物,或者您可能想对您的动物执行各种普查操作。

计算您拥有的动物总数与“pet 表中有多少行?”是同一个问题,因为每只宠物有一条记录。COUNT(*) 计算行数,因此计算您的动物的查询如下所示:

mysql> SELECT COUNT(*) FROM pet;
+----------+
| COUNT(*) |
+----------+
|        9 |
+----------+

之前,您检索了拥有宠物的人的姓名。如果您想知道每个所有者有多少宠物,可以使用 COUNT()

mysql> SELECT owner, COUNT(*) FROM pet GROUP BY owner;
+--------+----------+
| owner  | COUNT(*) |
+--------+----------+
| Benny  |        2 |
| Diane  |        2 |
| Gwen   |        3 |
| Harold |        2 |
+--------+----------+

前面的查询使用 GROUP BY 将每个 owner 的所有记录分组。与 GROUP BY 结合使用 COUNT() 有助于对各种分组下的数据进行表征。以下示例展示了执行动物普查操作的不同方法。

每种物种的动物数量:

mysql> SELECT species, COUNT(*) FROM pet GROUP BY species;
+---------+----------+
| species | COUNT(*) |
+---------+----------+
| bird    |        2 |
| cat     |        2 |
| dog     |        3 |
| hamster |        1 |
| snake   |        1 |
+---------+----------+

每种性别的动物数量:

mysql> SELECT sex, COUNT(*) FROM pet GROUP BY sex;
+------+----------+
| sex  | COUNT(*) |
+------+----------+
| NULL |        1 |
| f    |        4 |
| m    |        4 |
+------+----------+

(在此输出中,NULL 表示性别未知。)

每种物种和性别组合的动物数量:

mysql> SELECT species, sex, COUNT(*) FROM pet GROUP BY species, sex;
+---------+------+----------+
| species | sex  | COUNT(*) |
+---------+------+----------+
| bird    | NULL |        1 |
| bird    | f    |        1 |
| cat     | f    |        1 |
| cat     | m    |        1 |
| dog     | f    |        1 |
| dog     | m    |        2 |
| hamster | f    |        1 |
| snake   | m    |        1 |
+---------+------+----------+

当使用 COUNT() 时,您无需检索整个表。例如,仅对狗和猫执行上一个查询时,如下所示:

mysql> SELECT species, sex, COUNT(*) FROM pet
       WHERE species = 'dog' OR species = 'cat'
       GROUP BY species, sex;
+---------+------+----------+
| species | sex  | COUNT(*) |
+---------+------+----------+
| cat     | f    |        1 |
| cat     | m    |        1 |
| dog     | f    |        1 |
| dog     | m    |        2 |
+---------+------+----------+

或者,如果您只想知道已知性别的动物每种性别的数量:

mysql> SELECT species, sex, COUNT(*) FROM pet
       WHERE sex IS NOT NULL
       GROUP BY species, sex;
+---------+------+----------+
| species | sex  | COUNT(*) |
+---------+------+----------+
| bird    | f    |        1 |
| cat     | f    |        1 |
| cat     | m    |        1 |
| dog     | f    |        1 |
| dog     | m    |        2 |
| hamster | f    |        1 |
| snake   | m    |        1 |
+---------+------+----------+

如果您在选择要选择的列时还命名了列以外的 COUNT() 值,则应该存在一个包含命名相同列的 GROUP BY 子句。否则,将发生以下情况:

  • 如果启用了 ONLY_FULL_GROUP_BY SQL 模式,则会出现错误:

    mysql> SET sql_mode = 'ONLY_FULL_GROUP_BY';
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> SELECT owner, COUNT(*) FROM pet;
    ERROR 1140 (42000): In aggregated query without GROUP BY, expression
    #1 of SELECT list contains nonaggregated column 'menagerie.pet.owner';
    this is incompatible with sql_mode=only_full_group_by
    
  • 如果未启用 ONLY_FULL_GROUP_BY,则查询将通过将所有行视为单个组来处理,但为每个命名列选择的值是不确定的。服务器可以从任何行中选择值:

    mysql> SET sql_mode = '';
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> SELECT owner, COUNT(*) FROM pet;
    +--------+----------+
    | owner  | COUNT(*) |
    +--------+----------+
    | Harold |        8 |
    +--------+----------+
    1 row in set (0.00 sec)
    

参见 第 14.19.3 节,“MySQL 对 GROUP BY 的处理”。有关 COUNT(*expr*) 的行为和相关优化,请参见 第 14.19.1 节,“聚合函数描述”。

原文:dev.mysql.com/doc/refman/8.0/en/multiple-tables.html

5.3.4.9 使用多个表

pet表记录了你拥有的宠物。如果你想记录关于它们的其他信息,比如它们生活中的事件,比如去兽医那里或者生产幼崽的时间,你需要另一个表。这个表应该是什么样子?它需要包含以下信息:

  • 宠物名称,以便你知道每个事件涉及哪个动物。

  • 一个日期,以便你知道事件发生的时间。

  • 一个描述事件的字段。

  • 一个事件类型字段,如果你想对事件进行分类。

鉴于这些考虑,event表的CREATE TABLE语句可能如下所示:

mysql> CREATE TABLE event (name VARCHAR(20), date DATE,
       type VARCHAR(15), remark VARCHAR(255));

pet表一样,最简单的方法是通过创建一个包含以下信息的制表符分隔文本文件来加载初始记录。

名称 日期 类型 备注
绒绒 1995-05-15 分娩 4 只小猫,3 只雌性,1 只雄性
巴菲 1993-06-23 分娩 5 只小狗,2 只雌性,3 只雄性
巴菲 1994-06-19 分娩 3 只小狗,3 只雌性
啁啾 1999-03-21 兽医 需要修直喙
苗条 1997-08-03 兽医 肋骨骨折
鲍泽 1991-10-12 狗舍
方格 1991-10-12 狗舍
方格 1998-08-28 生日 给了他一个新的咬咬玩具
爪子 1998-03-17 生日 给了他一个新的跳蚤项圈
威斯勒 1998-12-09 生日 第一个生日
名称 日期 类型 备注

加载记录如下:

mysql> LOAD DATA LOCAL INFILE 'event.txt' INTO TABLE event;

根据你在pet表上运行的查询所学到的知识,你应该能够在event表中执行检索;原则是相同的。但是event表本身何时不足以回答你可能提出的问题?

假设你想找出每只宠物产下幼崽时的年龄。我们之前看到如何从两个日期计算年龄。母亲的产仔日期在event表中,但要计算她在那天的年龄,你需要她的出生日期,这个日期存储在pet表中。这意味着查询需要两个表:

mysql> SELECT pet.name,
       TIMESTAMPDIFF(YEAR,birth,date) AS age,
       remark
       FROM pet INNER JOIN event
         ON pet.name = event.name
       WHERE event.type = 'litter';
+--------+------+-----------------------------+
| name   | age  | remark                      |
+--------+------+-----------------------------+
| Fluffy |    2 | 4 kittens, 3 female, 1 male |
| Buffy  |    4 | 5 puppies, 2 female, 3 male |
| Buffy  |    5 | 3 puppies, 3 female         |
+--------+------+-----------------------------+

关于这个查询有几点需要注意:

  • FROM子句连接了两个表,因为查询需要从两个表中提取信息。

  • 当从多个表中合并(连接)信息时,你需要指定如何将一个表中的记录与另一个表中的记录匹配。这很容易,因为它们都有一个name列。查询使用ON子句根据name值匹配两个表中的记录。

    查询使用INNER JOIN来合并这两个表。INNER JOIN允许只有当两个表都满足ON子句中指定的条件时,才能在结果中出现来自任一表的行。在这个例子中,ON子句指定pet表中的name列必须与event表中的name列匹配。如果一个名字出现在一个表中而在另一个表中没有出现,那么该行不会出现在结果中,因为ON子句中的条件不满足。

  • 因为name列在两个表中都存在,所以在引用该列时必须明确指定是指哪个表。这可以通过在列名前加上表名来实现。

执行连接操作并不一定需要两个不同的表。有时,如果要比较表中的记录与该表中的其他记录,则将表与自身连接是有用的。例如,要找出你的宠物中的配对,你可以将pet表与自身连接,以生成相同物种的活体雄性和雌性的候选配对:

mysql> SELECT p1.name, p1.sex, p2.name, p2.sex, p1.species
       FROM pet AS p1 INNER JOIN pet AS p2
         ON p1.species = p2.species
         AND p1.sex = 'f' AND p1.death IS NULL
         AND p2.sex = 'm' AND p2.death IS NULL;
+--------+------+-------+------+---------+
| name   | sex  | name  | sex  | species |
+--------+------+-------+------+---------+
| Fluffy | f    | Claws | m    | cat     |
| Buffy  | f    | Fang  | m    | dog     |
+--------+------+-------+------+---------+

在这个查询中,我们为表名指定别名,以便引用列并清楚地知道每个列引用与哪个表实例相关联。

5.4 获取有关数据库和表的信息

原文:dev.mysql.com/doc/refman/8.0/en/getting-information.html

如果您忘记了数据库或表的名称,或者给定表的结构是什么(例如,其列叫什么)?MySQL 通过几个语句解决了这个问题,这些语句提供有关其支持的数据库和表的信息。

您之前已经看到SHOW DATABASES,它列出了服务器管理的数据库。要找出当前选择的数据库是哪个,请使用DATABASE()函数:

mysql> SELECT DATABASE();
+------------+
| DATABASE() |
+------------+
| menagerie  |
+------------+

如果您尚未选择任何数据库,则结果为NULL

要查找默认数据库包含哪些表(例如,当您不确定表名时),请使用此语句:

mysql> SHOW TABLES;
+---------------------+
| Tables_in_menagerie |
+---------------------+
| event               |
| pet                 |
+---------------------+

该语句生成的输出中列的名称始终为Tables_in_*db_name*,其中db_name是数据库的名称。有关更多信息,请参阅 Section 15.7.7.39, “SHOW TABLES Statement”。

如果您想了解表的结构,DESCRIBE语句很有用;它显示表的每个列的信息:

mysql> DESCRIBE pet;
+---------+-------------+------+-----+---------+-------+
| Field   | Type        | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| name    | varchar(20) | YES  |     | NULL    |       |
| owner   | varchar(20) | YES  |     | NULL    |       |
| species | varchar(20) | YES  |     | NULL    |       |
| sex     | char(1)     | YES  |     | NULL    |       |
| birth   | date        | YES  |     | NULL    |       |
| death   | date        | YES  |     | NULL    |       |
+---------+-------------+------+-----+---------+-------+

Field表示列名,Type是列的数据类型,NULL指示列是否可以包含NULL值,Key指示列是否已索引,Default指定列的默认值。Extra显示有关列的特殊信息:如果使用AUTO_INCREMENT选项创建列,则值为auto_increment而不是空。

DESCDESCRIBE语句的简写形式。有关更多信息,请参阅 Section 15.8.1, “DESCRIBE Statement”。

您可以使用SHOW CREATE TABLE语句获取创建现有表所需的CREATE TABLE语句。请参阅 Section 15.7.7.10, “SHOW CREATE TABLE Statement”。

如果表上有索引,则SHOW INDEX FROM *tbl_name*会提供有关它们的信息。有关此语句的更多信息,请参阅 Section 15.7.7.22, “SHOW INDEX Statement”。

5.5 在批处理模式下使用 mysql

译文:dev.mysql.com/doc/refman/8.0/en/batch-mode.html

在前面的章节中,你以交互方式使用mysql输入语句并查看结果。你也可以以批处理模式运行mysql。要做到这一点,将你想要运行的语句放在一个文件中,然后告诉mysql从文件中读取输入:

$> mysql < *batch-file*

如果你在 Windows 下运行mysql并且文件中有一些导致问题的特殊字符,你可以这样做:

C:\> mysql -e "source *batch-file*"

如果你需要在命令行上指定连接参数,命令可能如下所示:

$> mysql -h *host* -u *user* -p < *batch-file*
Enter password: ********

当你以这种方式使用mysql时,你正在创建一个脚本文件,然后执行该脚本。

如果你希望脚本在其中的某些语句产生错误时继续运行,你应该使用--force命令行选项。

为什么要使用脚本?以下是一些原因:

  • 如果你重复运行一个查询(比如,每天或每周一次),将其制作成脚本可以避免每次执行时重新输入它。

  • 你可以通过复制和编辑脚本文件从现有类似的查询生成新的查询。

  • 在开发查询时,批处理模式也很有用,特别是对于多行语句或多语句序列。如果出现错误,你不必重新输入所有内容。只需编辑你的脚本以纠正错误,然后告诉mysql再次执行它。

  • 如果你有一个产生大量输出的查询,你可以通过一个分页器运行输出,而不是看着它从屏幕顶部滚动出去:

    $> mysql < *batch-file* | more
    
  • 你可以将输出捕获到一个文件中以供进一步处理:

    $> mysql < *batch-file* > mysql.out
    
  • 你可以将你的脚本分发给其他人,这样他们也可以运行这些语句。

  • 有些情况不允许交互使用,例如,当你从cron作业中运行查询时。在这种情况下,你必须使用批处理模式。

当你以批处理模式运行mysql时,默认的输出格式与交互式使用时不��(更简洁)。例如,当在交互式模式下运行mysql时,SELECT DISTINCT species FROM pet的输出如下:

+---------+
| species |
+---------+
| bird    |
| cat     |
| dog     |
| hamster |
| snake   |
+---------+

在批处理模式下,输出看起来像这样:

species
bird
cat
dog
hamster
snake

如果你想在批处理模式下获得交互式输出格式,使用mysql -t。要将执行的语句回显到输出中,使用mysql -v

你也可以在mysql提示符下使用source命令或\.命令来运行脚本:

mysql> source *filename*;
mysql> \. *filename*

查看第 6.5.1.5 节,“从文本文件执行 SQL 语句”,获取更多信息。

5.6 常见查询示例

原文:dev.mysql.com/doc/refman/8.0/en/examples.html

5.6.1 列的最大值

5.6.2 某列最大值所在的行

5.6.3 每组列的最大值

5.6.4 某列的分组最大值所在的行

5.6.5 使用用户定义变量

5.6.6 使用外键

5.6.7 在两个键上搜索

5.6.8 计算每天的访问量

5.6.9 使用 AUTO_INCREMENT

这里是如何使用 MySQL 解决一些常见问题的示例。

一些示例使用表shop来保存每个文章(物品编号)对于某些交易商(经销商)的价格。假设每个交易商对于每篇文章有一个固定价格,那么(article, dealer)是记录的主键。

启动命令行工具mysql并选择一个数据库:

$> mysql *your-database-name*

要创建和填充示例表,请使用以下语句:

CREATE TABLE shop (
    article INT UNSIGNED  DEFAULT '0000' NOT NULL,
    dealer  CHAR(20)      DEFAULT ''     NOT NULL,
    price   DECIMAL(16,2) DEFAULT '0.00' NOT NULL,
    PRIMARY KEY(article, dealer));
INSERT INTO shop VALUES
    (1,'A',3.45),(1,'B',3.99),(2,'A',10.99),(3,'B',1.45),
    (3,'C',1.69),(3,'D',1.25),(4,'D',19.95);

执行完这些语句后,表应该包含以下内容:

SELECT * FROM shop ORDER BY article;

+---------+--------+-------+
| article | dealer | price |
+---------+--------+-------+
|       1 | A      |  3.45 |
|       1 | B      |  3.99 |
|       2 | A      | 10.99 |
|       3 | B      |  1.45 |
|       3 | C      |  1.69 |
|       3 | D      |  1.25 |
|       4 | D      | 19.95 |
+---------+--------+-------+

5.6.1 列的最大值

原文:dev.mysql.com/doc/refman/8.0/en/example-maximum-column.html

“最高的项目编号是多少?”

SELECT MAX(article) AS article FROM shop;

+---------+
| article |
+---------+
|       4 |
+---------+

5.6.2 持有某一列最大值的行

原文:dev.mysql.com/doc/refman/8.0/en/example-maximum-row.html

任务:找到最贵文章的编号、经销商和价格。

这可以通过子查询轻松完成:

SELECT article, dealer, price
FROM   shop
WHERE  price=(SELECT MAX(price) FROM shop);

+---------+--------+-------+
| article | dealer | price |
+---------+--------+-------+
|    0004 | D      | 19.95 |
+---------+--------+-------+

另一个解决方案是使用LEFT JOIN,如下所示:

SELECT s1.article, s1.dealer, s1.price
FROM shop s1
LEFT JOIN shop s2 ON s1.price < s2.price
WHERE s2.article IS NULL;

你也可以通过按价格降序排序所有行,并使用 MySQL 特定的LIMIT子句仅获取第一行,像这样:

SELECT article, dealer, price
FROM shop
ORDER BY price DESC
LIMIT 1;

注意

如果有几篇价格都是 19.95 的最贵文章,使用LIMIT解决方案只会显示其中一篇。

- 5.6.3 每组的列最大值

  • 任务:找到每篇文章的最高价格。
SELECT article, MAX(price) AS price
FROM   shop
GROUP BY article
ORDER BY article;

+---------+-------+
| article | price |
+---------+-------+
|    0001 |  3.99 |
|    0002 | 10.99 |
|    0003 |  1.69 |
|    0004 | 19.95 |
+---------+-------+

5.6.4 持有某一列分组最大值的行

原文:dev.mysql.com/doc/refman/8.0/en/example-maximum-column-group-row.html

任务:对于每篇文章,找到价格最高的经销商或经销商。

这个问题可以通过这样的子查询来解决:

SELECT article, dealer, price
FROM   shop s1
WHERE  price=(SELECT MAX(s2.price)
              FROM shop s2
              WHERE s1.article = s2.article)
ORDER BY article;

+---------+--------+-------+
| article | dealer | price |
+---------+--------+-------+
|    0001 | B      |  3.99 |
|    0002 | A      | 10.99 |
|    0003 | C      |  1.69 |
|    0004 | D      | 19.95 |
+---------+--------+-------+

前面的示例使用了相关子查询,这可能效率低下(参见 Section 15.2.15.7, “Correlated Subqueries”)。解决问题的其他可能性包括在 FROM 子句中使用无关联子查询、LEFT JOIN 或具有窗口函数的公共表达式。

无关联子查询:

SELECT s1.article, dealer, s1.price
FROM shop s1
JOIN (
  SELECT article, MAX(price) AS price
  FROM shop
  GROUP BY article) AS s2
  ON s1.article = s2.article AND s1.price = s2.price
ORDER BY article;

LEFT JOIN

SELECT s1.article, s1.dealer, s1.price
FROM shop s1
LEFT JOIN shop s2 ON s1.article = s2.article AND s1.price < s2.price
WHERE s2.article IS NULL
ORDER BY s1.article;

LEFT JOIN 的工作原理是,当 s1.price 达到最大值时,没有比它更大的 s2.price,因此对应的 s2.article 值为 NULL。参见 Section 15.2.13.2, “JOIN Clause”。

具有窗口函数的公共表达式:

WITH s1 AS (
   SELECT article, dealer, price,
          RANK() OVER (PARTITION BY article
                           ORDER BY price DESC
                      ) AS `Rank`
     FROM shop
)
SELECT article, dealer, price
  FROM s1
  WHERE `Rank` = 1
ORDER BY article;

5.6.5 使用用户定义变量

原文:dev.mysql.com/doc/refman/8.0/en/example-user-variables.html

你可以使用 MySQL 用户变量来记住结果,而无需将它们存储在客户端的临时变量中。(参见第 11.4 节,“用户定义变量”.)

例如,要找到价格最高和最低的文章,可以这样做:

mysql> SELECT @min_price:=MIN(price),@max_price:=MAX(price) FROM shop;
mysql> SELECT * FROM shop WHERE price=@min_price OR price=@max_price;
+---------+--------+-------+
| article | dealer | price |
+---------+--------+-------+
|    0003 | D      |  1.25 |
|    0004 | D      | 19.95 |
+---------+--------+-------+

注意

也可以将数据库对象的名称(如表或列)存储在用户变量中,然后在 SQL 语句中使用这个变量;但是,这需要使用准备语句。更多信息请参见第 15.5 节,“准备语句”。

5.6.6 使用外键

原文:dev.mysql.com/doc/refman/8.0/en/example-foreign-keys.html

MySQL 支持外键,允许跨表引用相关数据,并支持外键约束,有助于保持相关数据的一致性。

外键关系涉及一个持有初始列值的父表,以及一个引用父列值的子表。外键约束定义在子表上。

以下示例通过单列外键关联parentchild表,并展示了外键约束如何强制执行引用完整性。

使用以下 SQL 语句创建父表和子表:

CREATE TABLE parent (
    id INT NOT NULL,
    PRIMARY KEY (id)
) ENGINE=INNODB;

CREATE TABLE child (
    id INT,
    parent_id INT,
    INDEX par_ind (parent_id),
    FOREIGN KEY (parent_id)
        REFERENCES parent(id)
) ENGINE=INNODB;

插入一行到父表中,如下所示:

mysql> INSERT INTO parent (id) VALUES ROW(1);

验证数据是否已插入。你可以通过简单地选择所有parent表中的行来做到这一点,如下所示:

mysql> TABLE parent;
+----+
| id |
+----+
|  1 |
+----+

使用以下 SQL 语句向子表中插入一行:

mysql> INSERT INTO child (id,parent_id) VALUES ROW(1,1);

插入操作成功是因为parent_id 1 存在于父表中。

尝试将具有在父表中不存在的parent_id值的行插入到子表中会被拒绝,并显示错误,如下所示:

mysql> INSERT INTO child (id,parent_id) VALUES ROW(2,2);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails 
(`test`.`child`, CONSTRAINT `child_ibfk_1` FOREIGN KEY (`parent_id`) 
REFERENCES `parent` (`id`))

这个操作失败是因为指定的parent_id值在父表中不存在。

尝试删除先前插入到父表中的行也会失败,如下所示:

mysql> DELETE FROM parent WHERE id = 1;
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails 
(`test`.`child`, CONSTRAINT `child_ibfk_1` FOREIGN KEY (`parent_id`) 
REFERENCES `parent` (`id`))

这个操作失败是因为子表中的记录包含了引用的 id(parent_id)值。

当一个操作影响到父表中具有匹配行的键值时,结果取决于FOREIGN KEY子句的ON UPDATEON DELETE子句指定的引用动作。省略ON DELETEON UPDATE子句(如当前子表定义中)等同于指定RESTRICT选项,它拒绝影响父表中具有匹配行的键值的操作。

为了演示ON DELETEON UPDATE引用动作,删除子表并重新创建它以包括带有CASCADE选项的ON UPDATEON DELETE子句。CASCADE选项在删除或更新父表中的行时,会自动删除或更新子表中匹配的行。

DROP TABLE child;

CREATE TABLE child (
    id INT,
    parent_id INT,
    INDEX par_ind (parent_id),
    FOREIGN KEY (parent_id)
        REFERENCES parent(id)
        ON UPDATE CASCADE
        ON DELETE CASCADE
) ENGINE=INNODB;

使用下面显示的语句向子表中插入一些行:

mysql> INSERT INTO child (id,parent_id) VALUES ROW(1,1), ROW(2,1), ROW(3,1);

验证数据是否已插入,如下所示:

mysql> TABLE child;
+------+-----------+
| id   | parent_id |
+------+-----------+
|    1 |         1 |
|    2 |         1 |
|    3 |         1 |
+------+-----------+

更新父表中的 ID,将其从 1 更改为 2,使用下面显示的 SQL 语句:

mysql> UPDATE parent SET id = 2 WHERE id = 1;

通过选择所有父表中的行来验证更新是否成功,如下所示:

mysql> TABLE parent;
+----+
| id |
+----+
|  2 |
+----+

验证ON UPDATE CASCADE引用动作是否已更新子表,如下所示:

mysql> TABLE child;
+------+-----------+
| id   | parent_id |
+------+-----------+
|    1 |         2 |
|    2 |         2 |
|    3 |         2 |
+------+-----------+

为了演示ON DELETE CASCADE引用动作,删除父表中parent_id = 2的记录;这将删除父表中的所有记录。

mysql> DELETE FROM parent WHERE id = 2;

因为子表中的所有记录都与parent_id = 2相关联,所以ON DELETE CASCADE参照操作会从子表中删除所有记录,如下所示:

mysql> TABLE child;
Empty set (0.00 sec)

关于外键约束的更多信息,请参见第 15.1.20.5 节,“外键约束”。

5.6.7 在两个键上进行搜索

原文:dev.mysql.com/doc/refman/8.0/en/searching-on-two-keys.html

使用单个键的OR是经过良好优化的,处理AND也是如此。

唯一棘手的情况是在两个不同键上结合使用OR进行搜索:

SELECT field1_index, field2_index FROM test_table
WHERE field1_index = '1' OR  field2_index = '1'

这个案例已经优化。参见第 10.2.1.3 节,“索引合并优化”。

你也可以通过使用UNION来高效解决这个问题,它结合了两个单独的SELECT语句的输出。参见第 15.2.18 节,“UNION Clause”。

每个SELECT只搜索一个键,并且可以进行优化:

SELECT field1_index, field2_index
    FROM test_table WHERE field1_index = '1'
UNION
SELECT field1_index, field2_index
    FROM test_table WHERE field2_index = '1';

5.6.8 计算每日访问量

原文:dev.mysql.com/doc/refman/8.0/en/calculating-days.html

以下示例展示了如何使用位组函数来计算用户每月访问网页的天数。

CREATE TABLE t1 (year YEAR, month INT UNSIGNED,
             day INT UNSIGNED);
INSERT INTO t1 VALUES(2000,1,1),(2000,1,20),(2000,1,30),(2000,2,2),
            (2000,2,23),(2000,2,23);

示例表包含表示用户访问页面的年-月-日值。要确定每个月这些访问发生在多少不同的天数,请使用以下查询:

SELECT year,month,BIT_COUNT(BIT_OR(1<<day)) AS days FROM t1
       GROUP BY year,month;

返回结果为:

+------+-------+------+
| year | month | days |
+------+-------+------+
| 2000 |     1 |    3 |
| 2000 |     2 |    2 |
+------+-------+------+

该查询计算表中每个年/月组合出现多少不同的天数,自动去除重复条目。

5.6.9 使用 AUTO_INCREMENT

原文:dev.mysql.com/doc/refman/8.0/en/example-auto-increment.html

AUTO_INCREMENT属性可用于为新行生成唯一标识:

CREATE TABLE animals (
     id MEDIUMINT NOT NULL AUTO_INCREMENT,
     name CHAR(30) NOT NULL,
     PRIMARY KEY (id)
);

INSERT INTO animals (name) VALUES
    ('dog'),('cat'),('penguin'),
    ('lax'),('whale'),('ostrich');

SELECT * FROM animals;

返回:

+----+---------+
| id | name    |
+----+---------+
|  1 | dog     |
|  2 | cat     |
|  3 | penguin |
|  4 | lax     |
|  5 | whale   |
|  6 | ostrich |
+----+---------+

未为AUTO_INCREMENT列指定值,因此 MySQL 会自动分配序列号。您也可以显式地将 0 分配给该列以生成序列号,除非启用了NO_AUTO_VALUE_ON_ZERO SQL 模式。例如:

INSERT INTO animals (id,name) VALUES(0,'groundhog');

如果列声明为NOT NULL,也可以将NULL分配给该列以生成序列号。例如:

INSERT INTO animals (id,name) VALUES(NULL,'squirrel');

当您向AUTO_INCREMENT列插入任何其他值时,该列将设置为该值,并且序列将被重置,以便下一个自动生成的值从最大列值顺序生成。例如:

INSERT INTO animals (id,name) VALUES(100,'rabbit');
INSERT INTO animals (id,name) VALUES(NULL,'mouse');
SELECT * FROM animals;
+-----+-----------+
| id  | name      |
+-----+-----------+
|   1 | dog       |
|   2 | cat       |
|   3 | penguin   |
|   4 | lax       |
|   5 | whale     |
|   6 | ostrich   |
|   7 | groundhog |
|   8 | squirrel  |
| 100 | rabbit    |
| 101 | mouse     |
+-----+-----------+

更新现有的AUTO_INCREMENT列值也会重置AUTO_INCREMENT序列。

您可以使用LAST_INSERT_ID() SQL 函数或mysql_insert_id() C API 函数检索最近自动生成的AUTO_INCREMENT值。这些函数是特定于连接的,因此它们的返回值不受另一个执行插入操作的连接的影响。

对于AUTO_INCREMENT列,请使用足够大以容纳所需最大序列值的最小整数数据类型。当列达到数据类型的上限时,下一次尝试生成序列号将失败。如果可能的话,请使用UNSIGNED属性以允许更大的范围。例如,如果使用TINYINT - INTEGER, INT, SMALLINT, TINYINT, MEDIUMINT, BIGINT"),则最大允许的序列号为 127。对于TINYINT UNSIGNED - INTEGER, INT, SMALLINT, TINYINT, MEDIUMINT, BIGINT"),最大值为 255。请参阅第 13.1.2 节,“整数类型(精确值) - INTEGER、INT、SMALLINT、TINYINT、MEDIUMINT、BIGINT” - INTEGER, INT, SMALLINT, TINYINT, MEDIUMINT, BIGINT")以获取所有整数类型的范围。

注意

对于多行插入,LAST_INSERT_ID()mysql_insert_id() 实际上返回插入行中第一个AUTO_INCREMENT键。这使得可以在复制设置中的其他服务器上正确重现多行插入。

要从 1 开始的AUTO_INCREMENT值,可以使用CREATE TABLEALTER TABLE 设置该值,如下所示:

mysql> ALTER TABLE tbl AUTO_INCREMENT = 100;

InnoDB 注意事项

有关特定于InnoDBAUTO_INCREMENT用法的信息,请参阅第 17.6.1.6 节,“InnoDB 中的 AUTO_INCREMENT 处理”。

MyISAM 注意事项

  • 对于MyISAM表,您可以在多列索引中的辅助列上指定AUTO_INCREMENT。在这种情况下,AUTO_INCREMENT列的生成值计算为MAX(*auto_increment_column*) + 1 WHERE prefix=*given-prefix*。当您想要将数据放入有序组时,这是很有用的。

    CREATE TABLE animals (
        grp ENUM('fish','mammal','bird') NOT NULL,
        id MEDIUMINT NOT NULL AUTO_INCREMENT,
        name CHAR(30) NOT NULL,
        PRIMARY KEY (grp,id)
    ) ENGINE=MyISAM;
    
    INSERT INTO animals (grp,name) VALUES
        ('mammal','dog'),('mammal','cat'),
        ('bird','penguin'),('fish','lax'),('mammal','whale'),
        ('bird','ostrich');
    
    SELECT * FROM animals ORDER BY grp,id;
    

    返回:

    +--------+----+---------+
    | grp    | id | name    |
    +--------+----+---------+
    | fish   |  1 | lax     |
    | mammal |  1 | dog     |
    | mammal |  2 | cat     |
    | mammal |  3 | whale   |
    | bird   |  1 | penguin |
    | bird   |  2 | ostrich |
    +--------+----+---------+
    

    在这种情况下(当AUTO_INCREMENT列是多列索引的一部分时),如果删除任何组中具有最大AUTO_INCREMENT值的行,则AUTO_INCREMENT值将被重用。即使对于通常不会重用AUTO_INCREMENT值的MyISAM表也是如此。

  • 如果AUTO_INCREMENT列是多个索引的一部分,MySQL 会使用以AUTO_INCREMENT列开头的索引生成序列值(如果有的话)。例如,如果animals表包含索引PRIMARY KEY (grp, id)INDEX (id),MySQL 会忽略PRIMARY KEY来生成序列值。因此,表中将包含一个单一序列,而不是每个grp值一个序列。

进一步阅读

有关AUTO_INCREMENT的更多信息,请参阅此��:

  • 如何将AUTO_INCREMENT属性分配给列:第 15.1.20 节,“CREATE TABLE 语句”和第 15.1.9 节,“ALTER TABLE 语句”。

  • 根据NO_AUTO_VALUE_ON_ZERO SQL 模式,AUTO_INCREMENT的行为如何:第 7.1.11 节,“服务器 SQL 模式”。

  • 如何使用LAST_INSERT_ID()函数找到包含最新AUTO_INCREMENT值的行:第 14.15 节,“信息函数”。

  • 设置要使用的AUTO_INCREMENT值:第 7.1.8 节,“服务器系统变量”。

  • 第 17.6.1.6 节,“InnoDB 中的 AUTO_INCREMENT 处理”

  • AUTO_INCREMENT和复制:第 19.5.1.1 节,“复制和 AUTO_INCREMENT”。

  • AUTO_INCREMENT相关的服务器系统变量(auto_increment_incrementauto_increment_offset)可用于复制:第 7.1.8 节,“服务器系统变量”。

5.7 使用 MySQL 与 Apache

原文:dev.mysql.com/doc/refman/8.0/en/apache.html

有些程序可以让您从 MySQL 数据库验证用户,并将日志文件写入 MySQL 表中。

将 Apache 日志格式更改为 MySQL 易读的方法是将以下内容放入 Apache 配置文件中:

LogFormat \
        "\"%h\",%{%Y%m%d%H%M%S}t,%>s,\"%b\",\"%{Content-Type}o\",  \
        \"%U\",\"%{Referer}i\",\"%{User-Agent}i\""

要将以该格式的日志文件加载到 MySQL 中,可以使用类似以下语句的语句:

LOAD DATA INFILE '*/local/access_log*' INTO TABLE *tbl_name*
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' ESCAPED BY '\\'

应创建一个命名表,其列应对应LogFormat行写入日志文件的列。

第六章 MySQL 程序

原文:dev.mysql.com/doc/refman/8.0/en/programs.html

目录

6.1 MySQL 程序概述

6.2 使用 MySQL 程序

6.2.1 调用 MySQL 程序

6.2.2 指定程序选项

6.2.3 连接到服务器的命令选项

6.2.4 使用命令选项连接到 MySQL 服务器

6.2.5 使用类似 URI 字符串或键值对连接到服务器

6.2.6 使用 DNS SRV 记录连接到服务器

6.2.7 连接传输协议

6.2.8 连接压缩控制

6.2.9 设置环境变量

6.3 服务器和服务器启动程序

6.3.1 mysqld — MySQL 服务器

6.3.2 mysqld_safe — MySQL 服务器启动脚本

6.3.3 mysql.server — MySQL 服务器启动脚本

6.3.4 mysqld_multi — 管理多个 MySQL 服务器

6.4 与安装相关的程序

6.4.1 comp_err — 编译 MySQL 错误消息文件

6.4.2 mysql_secure_installation — 改善 MySQL 安装安全性

6.4.3 mysql_ssl_rsa_setup — 创建 SSL/RSA 文件

6.4.4 mysql_tzinfo_to_sql — 加载时区表

6.4.5 mysql_upgrade — 检查和升级 MySQL 表

6.5 客户端程序

6.5.1 mysql — MySQL 命令行客户端

6.5.2 mysqladmin — 一个 MySQL 服务器管理程序

6.5.3 mysqlcheck — 一个表维护程序

6.5.4 mysqldump — 一个数据库备份程序

6.5.5 mysqlimport — 一个数据导入程序

6.5.6 mysqlpump — 一个数据库备份程序

6.5.7 mysqlshow — 显示数据库、表和列信息

6.5.8 mysqlslap — 一个负载仿真客户端

6.6 管理和实用程序

6.6.1 ibd2sdi — InnoDB 表空间 SDI 提取工具

6.6.2 innochecksum — 离线 InnoDB 文件校验工具

6.6.3 myisam_ftdump — 显示全文索引信息

6.6.4 myisamchk — MyISAM 表维护工具

6.6.5 myisamlog — 显示 MyISAM 日志文件内容

6.6.6 myisampack — 生成压缩的只读 MyISAM 表

6.6.7 mysql_config_editor — MySQL 配置工具

6.6.8 mysql_migrate_keyring — 密钥环键迁移实用程序

6.6.9 mysqlbinlog — 用于处理二进制日志文件的实用程序

6.6.10 mysqldumpslow — 汇总慢查询日志文件

6.7 程序开发工具

6.7.1 mysql_config — 显示用于编译客户端的选项

6.7.2 my_print_defaults — 显示选项文件中的选项

6.8 杂项程序

6.8.1 lz4_decompress — 解压缩 mysqlpump LZ4 压缩输出

6.8.2 perror — 显示 MySQL 错误消息信息

6.8.3 zlib_decompress — 解压缩 mysqlpump ZLIB 压缩输出

6.9 环境变量

6.10 MySQL 中的 Unix 信号处理

本章简要概述了由 Oracle Corporation 提供的 MySQL 命令行程序。它还讨论了在运行这些程序时指定选项的一般语法。大多数程序具有特定于其自身操作的选项,但所有这些程序的选项语法都是相似的。最后,本章提供了对各个程序的更详细描述,包括它们识别的选项。

6.1 MySQL 程序概述

原文:dev.mysql.com/doc/refman/8.0/en/programs-overview.html

在 MySQL 安装中有许多不同的程序。本节提供了它们的简要概述。后续章节将更详细地描述每个程序,除了 NDB 集群程序。每个程序的描述都指示了其调用语法和支持的选项。第 25.5 节,“NDB 集群程序”描述了专用于 NDB 集群的程序。

大多数 MySQL 发行版都包含所有这些程序,除了那些特定于平台的程序。(例如,服务器启动脚本在 Windows 上不使用。)例外是 RPM 发行版更加专业化。服务器有一个 RPM,另一个是客户端程序,依此类推。如果您似乎缺少一个或多个程序,请参见第二章,“安装 MySQL”,了解发行版类型及其包含内容的信息。可能是您使用的发行版不包含所有程序,您需要安装额外的软件包。

每个 MySQL 程序都有许多不同的选项。大多数程序提供一个--help选项,您可以使用它来获取程序不同选项的描述。例如,尝试mysql --help

您可以通过在命令行或选项文件中指定选项来覆盖 MySQL 程序的默认选项值。有关调用程序和指定程序选项的一般信息,请参见第 6.2 节,“使用 MySQL 程序”。

MySQL 服务器,mysqld,是 MySQL 安装中大部分工作都由其完成的主要程序。服务器附带几个相关脚本,帮助您启动和停止服务器:

  • mysqld

    SQL 守护程序(即 MySQL 服务器)。要使用客户端程序,mysqld必须在运行,因为客户端通过连接到服务器来访问数据库。参见第 6.3.1 节,“mysqld — MySQL 服务器”。

  • mysqld_safe

    一个服务器启动脚本。mysqld_safe尝试启动mysqld。参见第 6.3.2 节,“mysqld_safe — MySQL 服务器启动脚本”。

  • mysql.server

    一个服务器启动脚本。该脚本用于使用包含启动特定运行级别系统服务的脚本的 System V 风格运行目录的系统。它调用mysqld_safe来启动 MySQL 服务器。参见第 6.3.3 节,“mysql.server — MySQL 服务器启动脚本”。

  • mysqld_multi

    一个服务器启动脚本,可以启动或停止系统上安装的多个服务器。参见第 6.3.4 节,“mysqld_multi — 管理多个 MySQL 服务器”。

几个程序在 MySQL 安装或升级过程中执行设置操作:

  • comp_err

    该程序在 MySQL 构建/安装过程中使用。它从错误源文件编译错误消息文件。参见第 6.4.1 节,“comp_err — 编译 MySQL 错误消息文件”。

  • mysql_secure_installation

    该程序使您能够提高 MySQL 安装的安全性。参见第 6.4.2 节,“mysql_secure_installation — 改善 MySQL 安装安全性”。

  • mysql_ssl_rsa_setup

    注意

    mysql_ssl_rsa_setup在 MySQL 8.0.34 中已弃用。

    该程序创建 SSL 证书和密钥文件以及 RSA 密钥对文件,以支持安全连接,如果这些文件丢失。由mysql_ssl_rsa_setup创建的文件可用于使用 SSL 或 RSA 进行安全连接。参见第 6.4.3 节,“mysql_ssl_rsa_setup — 创建 SSL/RSA 文件”。

  • mysql_tzinfo_to_sql

    该程序使用主机系统 zoneinfo 数据库的内容(描述时区的文件集)加载mysql数据库中的时区表。参见第 6.4.4 节,“mysql_tzinfo_to_sql — 加载时区表”。

  • mysql_upgrade

    在 MySQL 8.0.16 之前,此程序用于 MySQL 升级操作之后。它会根据 MySQL 新版本中所做的任何更改更新授权表,并在必要时检查表的不兼容性并修复它们。参见 Section 6.4.5,“mysql_upgrade — 检查和升级 MySQL 表”。

    从 MySQL 8.0.16 开始,MySQL 服务器执行先前由mysql_upgrade处理的升级任务(有关详细信息,请参见 Section 3.4,“MySQL 升级过程升级了什么”)。

连接到 MySQL 服务器的 MySQL 客户端程序:

  • mysql

    用于交互式输入 SQL 语句或从文件中批处理执行的命令行工具。参见 Section 6.5.1,“mysql — MySQL 命令行客户端”。

  • mysqladmin

    执行管理操作的客户端,例如创建或删除数据库、重新加载授权表、将表刷新到磁盘以及重新打开日志文件。也可以使用mysqladmin从服务器检索版本、进程和状态信息。参见 Section 6.5.2,“mysqladmin — MySQL 服务器管理程序”。

  • mysqlcheck

    一个表维护客户端,用于检查、修复、分析和优化表。参见 Section 6.5.3,“mysqlcheck — 表维护程序”。

  • mysqldump

    将 MySQL 数据库转储为 SQL、文本或 XML 文件的客户端。参见 Section 6.5.4,“mysqldump — 数据库备份程序”。

  • mysqlimport

    将文本文件导入到各自的表中的客户端,使用LOAD DATA。参见 Section 6.5.5,“mysqlimport — 数据导入程序”。

  • mysqlpump

    将 MySQL 数据库转储为 SQL 文件的客户端。参见 Section 6.5.6,“mysqlpump — 数据库备份程序”。

  • mysqlsh

    MySQL Shell 是用于 MySQL 服务器的高级客户端和代码编辑器。参见 MySQL Shell 8.0。除了提供的 SQL 功能外,类似于mysql,MySQL Shell 还提供了 JavaScript 和 Python 的脚本功能,并包括用于与 MySQL 一起工作的 API。X DevAPI 使您能够处理关系型和文档数据,参见第二十二章,“将 MySQL 用作文档存储”。AdminAPI 使您能够处理 InnoDB 集群,参见 MySQL AdminAPI。

  • mysqlshow

    一个用于显示数据库、表、列和索引信息的客户端。参见第 6.5.7 节,“mysqlshow — 显示数据库、表和列信息”。

  • mysqlslap

    一个旨在模拟 MySQL 服务器的客户端负载并报告每个阶段的时间的客户端。它的工作方式就像多个客户端正在访问服务器一样。参见第 6.5.8 节,“mysqlslap — 负载仿真客户端”。

MySQL 管理和实用程序:

  • innochecksum

    一个离线的InnoDB离线文件校验工具。参见第 6.6.2 节,“innochecksum — 离线 InnoDB 文件校验工具”。

  • myisam_ftdump

    一个用于显示MyISAM表中全文索引信息的实用程序。参见第 6.6.3 节,“myisam_ftdump — 显示全文索引信息”。

  • myisamchk

    一个用于描述、检查、优化和修复MyISAM表的实用程序。参见第 6.6.4 节,“myisamchk — MyISAM 表维护实用程序”。

  • myisamlog

    一个处理MyISAM日志文件内容的实用程序。参见第 6.6.5 节,“myisamlog — 显示 MyISAM 日志文件内容”。

  • myisampack

    一个用于压缩MyISAM表以生成更小的只读表的实用程序。参见第 6.6.6 节,“myisampack — 生成压缩的只读 MyISAM 表”。

  • mysql_config_editor

    一个实用程序,可以让您将身份验证凭据存储在一个名为.mylogin.cnf的安全、加密的登录路径文件中。参见第 6.6.7 节,“mysql_config_editor — MySQL 配置实用程序”。

  • mysql_migrate_keyring

    一个用于在一个密钥环组件和另一个之间迁移密钥的实用程序。参见第 6.6.8 节,“mysql_migrate_keyring — 密钥环密钥迁移实用程序”。

  • mysqlbinlog

    一个用于从二进制日志中读取语句的实用程序。二进制日志文件中包含的执行语句日志可用于帮助从崩溃中恢复。参见第 6.6.9 节,“mysqlbinlog — 用于处理二进制日志文件的实用程序”。

  • mysqldumpslow

    一个用于读取和总结慢查询日志内容的实用程序。参见第 6.6.10 节,“mysqldumpslow — 总结慢查询日志文件”。

MySQL 程序开发实用程序:

  • mysql_config

    一个生成编译 MySQL 程序所需选项值的 shell 脚本。参见第 6.7.1 节,“mysql_config — 显示编译客户端选项”。

  • my_print_defaults

    一个显示选项文件中选项组中存在哪些选项的实用程序。参见第 6.7.2 节,“my_print_defaults — 显示选项文件中的选项”。

杂项实用程序:

  • lz4_decompress

    一个解压缩使用 LZ4 压缩创建的mysqlpump输出的实用程序。参见第 6.8.1 节,“lz4_decompress — 解压 mysqlpump LZ4 压缩输出”。

  • perror

    一个显示系统或 MySQL 错误代码含义的实用程序。参见第 6.8.2 节,“perror — 显示 MySQL 错误消息信息”。

  • zlib_decompress

    用于解压缩使用 ZLIB 压缩创建的mysqlpump输出的实用程序。请参见第 6.8.3 节“zlib_decompress — 解压缩 mysqlpump ZLIB 压缩输出”。

Oracle 公司还提供了 MySQL Workbench GUI 工具,用于管理 MySQL 服务器和数据库,创建、执行和评估查询,并将模式和数据从其他关系数据库管理系统迁移到 MySQL 中使用。

MySQL 客户端程序使用 MySQL 客户端/服务器库与服务器通信,使用以下环境变量。

环境变量 含义
MYSQL_UNIX_PORT 默认的 Unix 套接字文件;用于连接到localhost
MYSQL_TCP_PORT 默认端口号;用于 TCP/IP 连接
MYSQL_DEBUG 调试时的调试跟踪选项
TMPDIR 创建临时表和文件的目录

要查看 MySQL 程序使用的所有环境变量列表,请参见第 6.9 节“环境变量”。

6.2 使用 MySQL 程序

原文:dev.mysql.com/doc/refman/8.0/en/programs-using.html

6.2.1 调用 MySQL 程序

6.2.2 指定程序选项

6.2.3 连接到服务器的命令选项

6.2.4 使用命令选项连接到 MySQL 服务器

6.2.5 使用类似 URI 或键值对连接到服务器

6.2.6 使用 DNS SRV 记录连接到服务器

6.2.7 连接传输协议

6.2.8 连接压缩控制

6.2.9 设置环境变量

6.2.1 调用 MySQL 程序

原文:dev.mysql.com/doc/refman/8.0/en/invoking-programs.html

要从命令行(即从您的 shell 或命令提示符)调用 MySQL 程序,请输入程序名称,然后输入任何选项或其他参数,以指示程序您希望它执行的操作。以下命令显示了一些示例程序调用。$>表示您的命令解释器的提示符;它不是您键入的一部分。您看到的特定提示取决于您的命令解释器。典型的提示是$用于shkshbash%用于cshtcsh,以及C:\>用于 Windows 的command.comcmd.exe命令解释器。

$> mysql --user=root test
$> mysqladmin extended-status variables
$> mysqlshow --help
$> mysqldump -u root personnel

以单个或双破折号(---)开头的参数指定程序选项。选项通常指示程序应该与服务器建立何种类型的连接或影响其操作模式。选项语法在第 6.2.2 节,“指定程序选项”中描述。

非选项参数(没有前导破折号的参数)向程序提供附加信息。例如,mysql程序将第一个非选项参数解释为数据库名称,因此命令mysql --user=root test表示您要使用test数据库。

描述各个程序的后续部分会指示程序支持哪些选项,并描述任何额外的非选项参数的含义。

一些选项适用于多个程序。其中最常用的是--host(或-h)、--user(或-u)和--password(或-p)选项,用于指定连接参数。它们表示 MySQL 服务器运行的主机,以及您的 MySQL 账户的用户名和密码。所有 MySQL 客户端程序都理解这些选项;它们使您能够指定要连接的服务器和在该服务器上要使用的账户。其他连接选项包括--port(或-P)用于指定 TCP/IP 端口号,以及--socket(或-S)用于指定 Unix 上的套接字文件(或 Windows 上的命名管道名称)。有关指定连接选项的更多信息,请参见第 6.2.4 节,“使用命令选项连接到 MySQL 服务器”。

如果您在尝试从bin目录以外的任何目录运行 MySQL 程序时都收到“找不到程序”错误,可能需要使用安装它们的bin目录的路径名来调用 MySQL 程序。为了更方便地使用 MySQL,您可以将bin目录的路径名添加到您的PATH环境变量设置中。这样可以通过仅输入程序名称而不是整个路径名来运行程序。例如,如果mysql安装在/usr/local/mysql/bin中,您可以通过调用mysql来运行该程序,而不需要调用/usr/local/mysql/bin/mysql

请查阅您的命令解释器文档,了解如何设置您的PATH变量。设置环境变量的语法是特定于解释器的。(一些信息在第 6.2.9 节,“设置环境变量”中给出。)修改PATH设置后,在 Windows 上打开一个新的控制台窗口,或者在 Unix 上重新登录以使设置生效。

6.2.2 指定程序选项

原文:dev.mysql.com/doc/refman/8.0/en/program-options.html

6.2.2.1 在命令行上使用选项

6.2.2.2 使用选项文件

6.2.2.3 影响选项文件处理的命令行选项

6.2.2.4 程序选项修饰符

6.2.2.5 使用选项设置程序变量

6.2.2.6 选项默认值,期望值的选项和=符号

有几种方法可以为 MySQL 程序指定选项:

  • 在程序名称后面列出命令行上的选项。这对于适用于程序特定调用的选项很常见。

  • 在程序启动时读取的选项文件中列出选项。这对于您希望程序每次运行时使用的选项很常见。

  • 在环境变量中列出选项(参见第 6.2.9 节,“设置环境变量”)。这种方法适用于您希望每次程序运行时应用的选项。在实践中,选项文件更常用于此目的,但第 7.8.3 节,“在 Unix 上运行多个 MySQL 实例”讨论了一种情况,其中环境变量可以非常有用。它描述了一种使用这些变量指定服务器和客户端程序的 TCP/IP 端口号和 Unix 套接字文件的方便技术。

选项按顺序处理,因此如果一个选项被多次指定,最后一次出现的选项优先。以下命令使mysql连接到运行在localhost上的服务器:

mysql -h example.com -h localhost

有一个例外情况:对于mysqld,第一个--user选项实例被用作安全预防措施,以防止在选项文件中指定的用户被在命令行上覆盖。

如果给出冲突或相关选项,后续选项优先于先前选项。以下命令以“无列名”模式运行mysql

mysql --column-names --skip-column-names

MySQL 程序通过检查环境变量确定首先给出哪些选项,然后通过处理选项文件,最后通过检查命令行。因为后续选项优先于先前选项,处理顺序意味着环境变量具有最低优先级,命令行选项具有最高优先级。

对于服务器,有一个例外情况:数据目录中的mysqld-auto.cnf选项文件最后处理,因此甚至优先于命令行选项。

你可以利用 MySQL 程序处理选项的方式,通过在选项文件中指定程序的默认选项值。这样一来,你就可以避免每次运行程序时都输入它们,同时又可以通过使用命令行选项在必要时覆盖默认值。

原文:dev.mysql.com/doc/refman/8.0/en/command-line-options.html

6.2.2.1 在命令行上使用选项

在命令行上指定的程序选项遵循以下规则:

  • 选项在命令名称之后给出。

  • 选项参数以一个短横线或两个短横线开头,取决于它是选项名称的短格式还是长格式。许多选项都有短格式和长格式。例如,-?--help是指示 MySQL 程序显示帮助消息的选项的短格式和长格式。

  • 选项名称区分大小写。-v-V都是合法的,并且具有不同的含义(它们是--verbose--version选项的相应短格式)。

  • 一些选项在选项名称后面需要一个值。例如,-h localhost--host=localhost表示 MySQL 服务器主机给客户端程序。选项值告诉程序 MySQL 服务器运行的主机名称。

  • 对于需要值的长选项,选项名称和值之间用=符号分隔。对于需要值的短选项,选项值可以紧跟在选项字母后面,或者选项字母后面可以有一个空格:-hlocalhost-h localhost是等效的。一个例外是用于指定 MySQL 密码的选项。这个选项可以以长格式给出,如--password=*pass_val*,也可以作为--password。在后一种情况下(没有给出密码值),程序会交互式提示您输入密码。密码选项也可以以短格式给出,如-p*pass_val*-p。但是,对于短格式,如果给出了密码值,必须紧跟在选项字母后面,不能有空格:如果选项字母后面有空格,程序无法判断后面的参数是密码值还是其他类型的参数。因此,以下两个命令具有完全不同的含义:

    mysql -ptest
    mysql -p test
    

    第一个命令指示mysql使用密码值test,但没有指定默认数据库。第二个命令指示mysql提示输入密码值,并将test作为默认数据库。

  • 在选项名称中,短横线(-)和下划线(_)在大多数情况下可以互换使用,尽管前导短横线不能用下划线表示。例如,--skip-grant-tables--skip_grant_tables是等效的。

    在本手册中,我们在选项名称中使用破折号,除非下划线具有特殊意义。例如,--log-bin--log_bin 是不同的选项。我们鼓励您也这样做。

  • MySQL 服务器有一些只能在启动时指定的命令选项,以及一组系统变量,其中一些可以在启动时、运行时或两者同时设置。系统变量名称使用下划线而不是破折号,并且在运行时引用时(例如,使用SETSELECT语句),必须使用下划线写成:

    SET GLOBAL general_log = ON;
    SELECT @@GLOBAL.general_log;
    

    在服务器启动时,系统变量的语法与命令选项相同,因此在变量名称中,破折号和下划线可以互换使用。例如,--general_log=ON--general-log=ON 是等效的。(这也适用于在选项文件中设置的系统变量。)

  • 对于需要数字值的选项,值可以附加KMG后缀,以表示 1024、1024² 或 1024³ 的倍数。从 MySQL 8.0.14 开始,后缀也可以是TPE,表示 1024⁴、1024⁵ 或 1024⁶ 的倍数。后缀字母可以是大写或小写。

    例如,以下命令告诉mysqladmin向服务器发送 1024 次 ping,每次 ping 之间间隔 10 秒:

    mysqladmin --count=1K --sleep=10 ping
    
  • 当指定文件名作为选项值时,避免使用~ shell 元字符。它可能不会被解释为你期望的那样。

在命令行中给出包含空格的选项值时,必须用引号引起来。例如,--execute(或 -e)选项可与mysql一起使用,将一个或多个以分号分隔的 SQL 语句传递给服务器。当使用此选项时,mysql执行选项值中的语句并退出。语句必须用引号括起来。例如:

$> mysql -u root -p -e "SELECT VERSION();SELECT NOW()"
Enter password: ******
+------------+
| VERSION()  |
+------------+
| 8.0.19     |
+------------+
+---------------------+
| NOW()               |
+---------------------+
| 2019-09-03 10:36:48 |
+---------------------+
$>

注意

长格式(--execute)后跟等号(=)。

要在语句中使用带引号的值,你必须要么转义内部的引号,要么在语句中使用与引用语句本身不同类型的引号。你的命令处理器的功能决定了你可以使用单引号还是双引号以及转义引号字符的语法。例如,如果你的命令处理器支持使用单引号或双引号进行引用,你可以在语句周围使用双引号,并在语句中使用单引号引用任何值。

原文:dev.mysql.com/doc/refman/8.0/en/option-files.html

6.2.2.2 使用选项文件

大多数 MySQL 程序可以从选项文件(有时称为配置文件)中读取启动选项。选项文件提供了一种方便的方式来指定常用选项,这样每次运行程序时就不需要在命令行中输入它们。

要确定一个程序是否读取选项文件,请使用--help选项调用它。(对于mysqld,使用--verbose--help。)如果程序读取选项文件,帮助消息会指示它查找哪些文件以及识别哪些选项组。

注意

使用--no-defaults选项启动的 MySQL 程序不会读取除.mylogin.cnf之外的任何选项文件。

禁用persisted_globals_load系统变量启动的服务器不会读取mysqld-auto.cnf

许多选项文件都是纯文本文件,可以使用任何文本编辑器创建。例外情况包括:

  • 包含登录路径选项的.mylogin.cnf文件。这是由mysql_config_editor实用程序创建的加密文件。参见第 6.6.7 节,“mysql_config_editor — MySQL 配置实用程序”。“登录路径”是一个只允许特定选项的选项组:hostuserpasswordportsocket。客户端程序使用--login-path选项指定从.mylogin.cnf中读取哪个登录路径。

    要指定替代的登录路径文件名,请设置MYSQL_TEST_LOGIN_FILE环境变量。这个变量被mysql-test-run.pl测试实用程序使用,但也被mysql_config_editor和 MySQL 客户端(如mysqlmysqladmin等)所识别。

  • 数据目录中的mysqld-auto.cnf文件。这个 JSON 格式的文件包含持久化的系统变量设置。它是由服务器在执行SET PERSISTSET PERSIST_ONLY语句时创建的。参见第 7.1.9.3 节,“持久化系统变量”。mysqld-auto.cnf的管理应该交给服务器处理,不要手动执行。

  • 选项文件处理顺序

  • 选项文件语法

  • 选项文件包含

选项文件处理顺序

MySQL 按照以下讨论中描述的顺序查找选项文件并读取存在的任何选项文件。如果要使用的选项文件不存在,请使用适当的方法创建,如前文所述。

注意

有关与 NDB Cluster 程序一起使用的选项文件的信息,请参见第 25.4 节,“NDB Cluster 的配置”。

在 Windows 上,MySQL 程序按照以下表格中显示的顺序读取启动选项(先读取列出的文件,后读取的文件优先)。

表 6.1 Windows 系统上读取的选项文件

文件名 目的
%WINDIR%`\my.ini`, %WINDIR%\my.cnf 全局选项
C:\my.ini, C:\my.cnf 全局选项
*BASEDIR*\my.ini, *BASEDIR*\my.cnf 全局选项
defaults-extra-file 使用--defaults-extra-file指定的文件(如果有)
``%APPDATA%\MySQL\.mylogin.cnf 登录路径选项(仅限客户端)
*DATADIR*\mysqld-auto.cnf 使用SET PERSISTSET PERSIST_ONLY持久化的系统变量(仅限服务器)

在上表中,%WINDIR%代表 Windows 目录的位置。通常为C:\WINDOWS。使用以下命令根据WINDIR环境变量的值确定其确切位置:

C:\> echo %WINDIR%

%APPDATA%代表 Windows 应用程序数据目录的值。使用以下命令根据APPDATA环境变量的值确定其确切位置:

C:\> echo %APPDATA%

BASEDIR代表 MySQL 基本安装目录。当使用 MySQL Installer 安装 MySQL 8.0 时,这通常是C:\*PROGRAMDIR*\MySQL\MySQL Server 8.0,其中PROGRAMDIR代表程序目录(通常为英语版 Windows 的Program Files)。参见第 2.3.3 节,“Windows 上的 MySQL Installer”。

重要提示

尽管 MySQL Installer 将大多数文件放在PROGRAMDIR下,但默认情况下会将my.ini安装在C:\ProgramData\MySQL\MySQL Server 8.0\目录下。

DATADIR代表 MySQL 数据目录。作为查找mysqld-auto.cnf的默认值是 MySQL 编译时内置的数据目录位置,但可以通过在处理mysqld-auto.cnf之前处理的选项文件或命令行选项--datadir进行更改。

在 Unix 和类 Unix 系统上,MySQL 程序按照以下表中显示的顺序从文件中读取启动选项(先列出的文件先读取,后读取的文件优先)。

注意

在 Unix 平台上,MySQL 会忽略全局可写的配置文件。这是一种有意为之的安全措施。

表 6.2 Unix 和类 Unix 系统上读取的选项文件

文件名 目的
/etc/my.cnf 全局选项
/etc/mysql/my.cnf 全局选项
*SYSCONFDIR*/my.cnf 全局选项
$MYSQL_HOME/my.cnf 服务器特定选项(仅服务器)
defaults-extra-file 通过--defaults-extra-file指定的文件(如果有)
~/.my.cnf 用户特定选项
~/.mylogin.cnf 用户特定登录路径选项(仅客户端)
*DATADIR*/mysqld-auto.cnf 使用SET PERSISTSET PERSIST_ONLY(仅服务器)持久化的系统变量

在上表中,~代表当前用户的主目录(即$HOME的值)。

SYSCONFDIR代表 MySQL 构建时使用的SYSCONFDIR选项指定的目录。默认情况下,这是编译安装目录下的etc目录。

MYSQL_HOME是一个包含服务器特定my.cnf文件所在目录路径的环境变量。如果未设置MYSQL_HOME并且使用mysqld_safe程序启动服务器,mysqld_safe会将其设置为BASEDIR,即 MySQL 基本安装目录。

DATADIR代表 MySQL 数据目录。用于查找mysqld-auto.cnf,其默认值是 MySQL 编译时内置的数据目录位置,但可以通过--datadir指定为在mysqld-auto.cnf处理之前处理的选项文件或命令行选项来更改。

如果找到给定选项的多个实例,则最后一个实例优先,但有一个例外:对于mysqld--user选项的第一个实例作为安全预防措施,防止在命令行中覆盖选项���件中指定的用户。

选项文件语法

下面对选项文件语法的描述适用于您手动编辑的文件。这不包括使用mysql_config_editor创建的加密的.mylogin.cnf文件,以及服务器以 JSON 格式创建的mysqld-auto.cnf文件。

运行 MySQL 程序时可以在命令行上给出的任何长选项也可以在选项文件中给出。要获取程序的可用选项列表,请使用--help选项运行它。(对于mysqld,使用--verbose--help。)

在选项文件中指定选项的语法类似于命令行语法(参见第 6.2.2.1 节,“在命令行上使用选项”)。但是,在选项文件中,您需要省略选项名称前面的两个破折号,并且每行只指定一个选项。例如,在命令行上的--quick--host=localhost应在选项文件中分别指定为quickhost=localhost。要在选项文件中指定形式为--loose-*opt_name*的选项,将其写为loose-*opt_name*

选项文件中的空行将被忽略。非空行可以采用以下任一形式:

  • #*comment*;*comment*

    注释行以#;开头。#注释也可以在行中间开始。

  • [*group*]

    group是您想要设置选项的程序或组的名称。在组行之后,任何设置选项的行都适用于命名组,直到选项文件结束或另一个组行出现。选项组名称不区分大小写。

  • *opt_name*

    这等同于在命令行上的--*opt_name*

  • *opt_name*=*value*

    这等同于在命令行上的--*opt_name*=*value*。在选项文件中,您可以在=字符周围有空格,这在命令行上是不成立的。值可以选择用单引号或双引号括起,如果值包含#注释字符,则这样做很有用。

选项名称和值的前导和尾随空格将自动删除。

您可以在选项值中使用转义序列\b\t\n\r\\\s来表示退格、制表符、换行符、回车符、反斜杠和空格字符。在选项文件中,这些转义规则适用:

  • 跟随有效转义序列字符的反斜杠将转换为序列表示的字符。例如,\s转换为空格。

  • 未跟随有效转义序列字符的反斜杠保持不变。例如,\S保持不变。

前述规则意味着可以将字面反斜杠表示为\\,或者如果后面没有有效的转义序列字符,则表示为\

选项文件中转义序列的规则与 SQL 语句中字符串文字中的转义序列的规则略有不同。在后一种情况下,如果“x”不是有效的转义序列字符,则 \*x* 变为“x”而不是 \*x*。参见 第 11.1.1 节,“字符串文字”。

选项文件值的转义规则对于使用 \ 作为路径名分隔符的 Windows 路径名尤为重要。如果 Windows 路径名中的分隔符后面跟着一个转义序列字符,则必须将其写为 \\。如果没有,则可以写为 \\\。另外,在 Windows 路径名中也可以使用 /,并且被视为 \。假设你想在选项文件中指定一个基本目录为 C:\Program Files\MySQL\MySQL Server 8.0,有几种方法可以实现。以下是一些示例:

basedir="C:\Program Files\MySQL\MySQL Server 8.0"
basedir="C:\\Program Files\\MySQL\\MySQL Server 8.0"
basedir="C:/Program Files/MySQL/MySQL Server 8.0"
basedir=C:\\Program\sFiles\\MySQL\\MySQL\sServer\s8.0

如果选项组名称与程序名称相同,则该组中的选项专门适用于该程序。例如,[mysqld][mysql] 组分别适用于 mysqld 服务器和 mysql 客户端程序。

[client] 选项组被 MySQL 发行版中提供的所有客户端程序读取(但不被 mysqld 读取)。要了解使用 C API 的第三方客户端程序如何使用选项文件,请参阅 mysql_options() 中的 C API 文档。

[client] 组使您能够指定适用于所有客户端的选项。例如,[client] 是指定连接到服务器的密码的适当组。 (但请确保选项文件只能被您自己访问,以防其他人发现您的密码。)确保不要将选项放在 [client] 组中,除非所有您使用的客户端程序都认识该选项。如果程序不理解该选项,则在尝试运行时会显示错误消息并退出。

首先列出更一般的选项组,然后再列出更具体的选项组。例如,[client] 组更为一般,因为所有客户端程序都会读取它,而 [mysqldump] 组只被 mysqldump 读取。后面指定的选项会覆盖先前指定的选项,因此按照 [client][mysqldump] 的顺序排列选项组可以使 mysqldump 特定的选项覆盖 [client] 的选项。

这是一个典型的全局选项文件:

[client]
port=3306
socket=/tmp/mysql.sock

[mysqld]
port=3306
socket=/tmp/mysql.sock
key_buffer_size=16M
max_allowed_packet=128M

[mysqldump]
quick

这是一个典型的用户选项文件:

[client]
# The following password is sent to all standard MySQL clients
password="my password"

[mysql]
no-auto-rehash
connect_timeout=2

要创建仅由特定 MySQL 版本系列的mysqld服务器读取的选项组,请使用名称为[mysqld-5.7][mysqld-8.0]等的组。以下组表示sql_mode设置仅适用于具有 8.0.x 版本号的 MySQL 服务器:

[mysqld-8.0]
sql_mode=TRADITIONAL
选项文件包含

可以在选项文件中使用!include指令来包含其他选项文件,使用!includedir来搜索特定目录中的选项文件。例如,要包含/home/mydir/myopt.cnf文件,请使用以下指令:

!include /home/mydir/myopt.cnf

要搜索/home/mydir目录并读取其中找到的选项文件,请使用以下指令:

!includedir /home/mydir

MySQL 不保证按目录中选项文件的顺序读取。

注意

在 Unix 操作系统上,使用!includedir指令查找和包含的任何文件必须以.cnf结尾。在 Windows 上,此指令检查具有.ini.cnf扩展名的文件。

编写包含的选项文件的内容与任何其他选项文件相同。也就是说,它应该包含一组选项,每个选项前面都有一个[*group*]行,指示选项适用于哪个程序。

在处理包含文件时,只使用当前程序正在查找的组中的选项。其他组将被忽略。假设my.cnf文件包含以下行:

!include /home/mydir/myopt.cnf

假设/home/mydir/myopt.cnf如下所示:

[mysqladmin]
force

[mysqld]
key_buffer_size=16M

如果my.cnfmysqld处理,则仅使用/home/mydir/myopt.cnf中的[mysqld]组。如果文件由mysqladmin处理,则仅使用[mysqladmin]组。如果文件由任何其他程序处理,则不使用/home/mydir/myopt.cnf中的任何选项。

!includedir指令的处理方式类似,只是会读取命名目录中的所有选项文件。

如果选项文件包含!include!includedir指令,则无论它们出现在文件中的位置如何,只要处理选项文件,就会处理这些指令命名的文件。

要使包含指令起作用,文件路径不应在引号内指定,并且不应包含转义序列。例如,在my.ini中提供的以下语句读取选项文件myopts.ini

!include C:/ProgramData/MySQL/MySQL Server/myopts.ini
!include C:\ProgramData\MySQL\MySQL Server\myopts.ini
!include C:\\ProgramData\\MySQL\\MySQL Server\\myopts.ini

在 Windows 上,如果!include */path/to/extra.ini*是文件中的最后一行,请确保在末尾添加一个换行符;否则,该行将被忽略。

原文:dev.mysql.com/doc/refman/8.0/en/option-file-options.html

6.2.2.3 影响选项文件处理的命令行选项

大多数支持选项文件的 MySQL 程序处理以下选项。由于这些选项会影响选项文件处理,因此必须在命令行中给出,而不是在选项文件中。为了正常工作,这些选项中的每一个必须在其他选项之前给出,但有以下例外:

  • --print-defaults 可以立即在--defaults-file--defaults-extra-file--login-path之后使用。

  • 在 Windows 上,如果服务器使用--defaults-file--install选项启动,则--install必须首先。请参见第 2.3.4.8 节,“将 MySQL 作为 Windows 服务启动”。

在指定文件名作为选项值时,避免使用~ shell 元字符,因为它可能不会按您的预期解释。

表 6.3 选项文件选项摘要

选项名称 描述
--defaults-extra-file 除了通常的选项文件外,还读取指定的选项文件
--defaults-file 仅读取指定的选项文件
--defaults-group-suffix 选项组后缀值
--login-path 从.mylogin.cnf 中读取登录路径选项
--no-defaults 不读取任何选项文件
  • --defaults-extra-file=*file_name*

    命令行格式 --defaults-extra-file=filename
    类型 文件名
    默认值 [none]

    读取此选项文件在全局选项文件之后,但(在 Unix 上)在用户选项文件之前,并且(在所有平台上)在登录路径文件之前。(有关选项文件使用顺序的信息,请参见第 6.2.2.2 节,“使用选项文件”。)如果文件不存在或无法访问,将会出现错误。如果file_name不是绝对路径名,则将其解释为相对于当前目录。

    请参阅本节开头有关此选项可能指定位置的限制。

  • --defaults-file=*file_name*

    命令行格式 --defaults-file=filename
    类型 文件名
    默认值 [none]

    仅读取给定的选项文件。如果文件不存在或无法访问,则会出现错误。file_name如果作为相对路径名而不是完整路径名给出,则会相对于当前目录进行解释。

    例外情况:即使使用--defaults-filemysqld会读取mysqld-auto.cnf,客户端程序会读取.mylogin.cnf

    请参阅本节介绍有关此选项可能指定的位置的约束。

  • --defaults-group-suffix=*str*

    命令行格式 --defaults-group-suffix=string
    类型 字符串
    默认值 [none]

    不仅读取通常的选项组,还读取具有通常名称和后缀str的组。例如,mysql客户端通常会读取[client][mysql]组。如果将此选项给出为--defaults-group-suffix=_othermysql还会读取[client_other][mysql_other]组。

  • --login-path=*name*

    命令行格式 --login-path=name
    类型 字符串
    默认值 [none]

    .mylogin.cnf登录路径文件中的命名登录路径读取选项。 “登录路径”是一个包含指定要连接到哪个 MySQL 服务器以及要进行身份验证的帐户的选项组。要创建或修改登录路径文件,请使用mysql_config_editor实用程序。请参阅第 6.6.7 节,“mysql_config_editor — MySQL Configuration Utility”。

    客户端程序读取与命名登录路径对应的选项组,以及程序默认读取的选项组。考虑以下命令:

    mysql --login-path=mypath
    

    默认情况下,mysql客户端读取[client][mysql]选项组。因此,对于所示的命令,mysql从其他选项文件读取[client][mysql],并从登录路径文件中读取[client][mysql][mypath]

    即使使用--no-defaults选项,客户端程序也会读取登录路径文件。

    要指定替代的登录路径文件名,请设置MYSQL_TEST_LOGIN_FILE环境变量。

    请参阅本节介绍有关此选项可能指定的位置的约束。

  • --no-defaults

    命令行格式 --no-defaults
    类型 布尔值
    默认值 false

    不要读取任何选项文件。如果由于从选项文件中读取未知选项而导致程序启动失败,则可以使用--no-defaults来防止读取它们。

    例外情况是,即使使用了--no-defaults,客户端程序仍会读取.mylogin.cnf登录路径文件(如果存在)。这样即使存在--no-defaults,也可以以比在命令行上更安全的方式指定密码。要创建.mylogin.cnf,请使用mysql_config_editor实用程序。请参阅第 6.6.7 节,“mysql_config_editor — MySQL 配置实用程序”。

  • --print-defaults

    命令行格式 --print-defaults
    类型 布尔值
    默认值 false

    打印程序名称以及从选项文件获取的所有选项。密码值被掩码。

    请参阅本节开头有关此选项可能被指定的位置的限制。

原文:dev.mysql.com/doc/refman/8.0/en/option-modifiers.html

6.2.2.4 程序选项修饰符

一些选项是“布尔”类型的,控制可以打开或关闭的行为。例如,mysql 客户端支持一个 --column-names 选项,用于确定是否在查询结果开头显示一行列名。默认情况下,此选项已启用。但是,在某些情况下,您可能希望禁用它,例如当将 mysql 的输出发送到另一个只期望看到数据而不是初始标题行的程序时。

要禁用列名,可以使用以下任何形式指定该选项:

--disable-column-names
--skip-column-names
--column-names=0

--disable--skip 前缀以及 =0 后缀都具有相同的效果:它们关闭选项。

选项的“启用”形式可以通过以下任何方式指定:

--column-names
--enable-column-names
--column-names=1

对于布尔选项,值 ONTRUEOFFFALSE 也被识别(不区分大小写)。

如果一个选项以 --loose 为前缀,程序在不识别该选项时不会退出,而是只发出警告:

$> mysql --loose-no-such-option
mysql: WARNING: unknown option '--loose-no-such-option'

当您在同一台机器上从多个 MySQL 安装运行程序并在选项文件中列出选项时,--loose 前缀可能很有用。可以使用 --loose 前缀(或选项文件中的 loose)提供可能不被所有程序版本识别的选项。识别该选项的程序版本会正常处理它,而不识别它的版本会发出警告并忽略它。

--maximum 前缀仅适用于 mysqld,允许限制客户端程序设置会话系统变量的大小。要实现这一点,使用带有变量名的 --maximum 前缀。例如,--maximum-max_heap_table_size=32M 防止任何客户端将堆表大小限制设置为大于 32M。

--maximum 前缀用于具有会话值的系统变量。如果应用于仅具有全局值的系统变量,将会出现错误。例如,使用 --maximum-back_log=200,服务器会产生此错误:

Maximum value of 'back_log' cannot be set

原文:dev.mysql.com/doc/refman/8.0/en/program-variables.html

6.2.2.5 使用选项设置程序变量

许多 MySQL 程序具有内部变量,可以使用SET语句在运行时设置。参见 Section 15.7.6.1, “SET Syntax for Variable Assignment”,以及 Section 7.1.9, “Using System Variables”。

这些程序变量中的大多数也可以通过使用适用于指定程序选项的相同语法在服务器启动时设置。例如,mysql有一个max_allowed_packet变量,控制其通信缓冲区的最大大小。要将mysqlmax_allowed_packet变量设置为 16MB 的值,请使用以下任一命令:

mysql --max_allowed_packet=16777216
mysql --max_allowed_packet=16M

第一个命令以字节为单位指定值。第二个以兆字节为单位指定值。对于需要数字值的变量,值可以附加KMG后缀,表示 1024、1024²或 1024³的倍增器。(例如,用于设置max_allowed_packet时,后缀表示千字节、兆字节或千兆字节的单位。)从 MySQL 8.0.14 开始,后缀也可以是TPE,表示 1024⁴、1024⁵或 1024⁶的倍增器。后缀字母可以是大写或小写。

在选项文件中,变量设置不带前导破折号:

[mysql]
max_allowed_packet=16777216

或:

[mysql]
max_allowed_packet=16M

如果愿意,选项名称中的下划线可以指定为破折号。以下选项组是等效的。两者都将服务器的键缓冲区大小设置为 512MB:

[mysqld]
key_buffer_size=512M

[mysqld]
key-buffer-size=512M

使用后缀来指定值的倍增器可以在程序调用时设置变量,但不能在运行时使用SET来设置值。另一方面,使用SET,你可以使用表达式来赋值变量的值,在服务器启动时设置变量时不适用这一点。例如,以下行中的第一行在程序调用时是合法的,但第二行不是:

$> mysql --max_allowed_packet=16M
$> mysql --max_allowed_packet=16*1024*1024

相反,以下行中的第二行在运行时是合法的,但第一行不是:

mysql> SET GLOBAL max_allowed_packet=16M;
mysql> SET GLOBAL max_allowed_packet=16*1024*1024;

dev.mysql.com/doc/refman/8.0/en/option-defaults-equals.html

6.2.2.6 选项默认值、期望值的选项和等号

按照惯例,分配值的长形式选项使用等号(=)符号编写,就像这样:

mysql --host=tonfisk --user=jon

对于需要值的选项(即没有默认值的选项),等号是不需要的,因此以下内容也是有效的:

mysql --host tonfisk --user jon

在这两种情况下,mysql客户端尝试连接到名为“tonfisk”的主机上运行的 MySQL 服务器,使用用户名“jon”。

由于这种行为,当某个期望值的选项没有提供值时,有时会出现问题。考虑以下示例,用户连接到运行在主机tonfisk上的 MySQL 服务器,用户名为jon

$> mysql --host 85.224.35.45 --user jon
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 8.0.36 Source distribution

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

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

省略其中一个选项所需的值会导致错误,如下所示:

$> mysql --host 85.224.35.45 --user
mysql: option '--user' requires an argument

在这种情况下,mysql无法找到跟在--user选项后面的值,因为在命令行中它后面没有内容。然而,如果你省略了不是最后一个要使用的选项的值,你会得到一个不同的错误,可能不是你期望的:

$> mysql --host --user jon
ERROR 2005 (HY000): Unknown MySQL server host '--user' (1)

因为mysql假定在命令行中跟在--host后面的任何字符串都是主机名,--host --user被解释为--host=--user,客户端尝试连���到名为--user的 MySQL 服务器。

具有默认值的选项在分配值时总是需要等号;如果不这样做会导致错误。例如,MySQL 服务器的--log-error选项具有默认值*host_name*.err,其中host_name是 MySQL 正在运行的主机的名称。假设你正在一台名为“tonfisk”的计算机上运行 MySQL,并考虑以下对mysqld_safe的调用:

$> mysqld_safe &
[1] 11699
$> 080112 12:53:40 mysqld_safe Logging to '/usr/local/mysql/var/tonfisk.err'.
080112 12:53:40 mysqld_safe Starting mysqld daemon with databases from /usr/local/mysql/var
$>

关闭服务器后,按以下方式重新启动:

$> mysqld_safe --log-error &
[1] 11699
$> 080112 12:53:40 mysqld_safe Logging to '/usr/local/mysql/var/tonfisk.err'.
080112 12:53:40 mysqld_safe Starting mysqld daemon with databases from /usr/local/mysql/var
$>

结果是相同的,因为--log-error后面没有跟任何其他内容,它提供了自己的默认值。(&字符告诉操作系统在后台运行 MySQL;MySQL 本身会忽略它。)现在假设你希望将错误日志记录到名为my-errors.err的文件中。你可能尝试使用--log-error my-errors来启动服务器,但这并没有产生预期的效果,如下所示:

$> mysqld_safe --log-error my-errors &
[1] 31357
$> 080111 22:53:31 mysqld_safe Logging to '/usr/local/mysql/var/tonfisk.err'.
080111 22:53:32 mysqld_safe Starting mysqld daemon with databases from /usr/local/mysql/var
080111 22:53:34 mysqld_safe mysqld from pid file /usr/local/mysql/var/tonfisk.pid ended

[1]+  Done                    ./mysqld_safe --log-error my-errors

服务器尝试使用/usr/local/mysql/var/tonfisk.err作为错误日志启动,但随后关闭。检查这个文件的最后几行显示了原因:

$> tail /usr/local/mysql/var/tonfisk.err
2013-09-24T15:36:22.278034Z 0 [ERROR] Too many arguments (first extra is 'my-errors').
2013-09-24T15:36:22.278059Z 0 [Note] Use --verbose --help to get a list of available options!
2013-09-24T15:36:22.278076Z 0 [ERROR] Aborting
2013-09-24T15:36:22.279704Z 0 [Note] InnoDB: Starting shutdown...
2013-09-24T15:36:23.777471Z 0 [Note] InnoDB: Shutdown completed; log sequence number 2319086
2013-09-24T15:36:23.780134Z 0 [Note] mysqld: Shutdown complete

因为--log-error选项提供了默认值,你必须使用等号来分配不同的值,如下所示:

$> mysqld_safe --log-error=my-errors &
[1] 31437
$> 080111 22:54:15 mysqld_safe Logging to '/usr/local/mysql/var/my-errors.err'.
080111 22:54:15 mysqld_safe Starting mysqld daemon with databases from /usr/local/mysql/var

$>

现在服务器已成功启动,并将错误记录到文件/usr/local/mysql/var/my-errors.err中。

在选项文件中指定选项值时可能会出现类似的问题。例如,考虑一个包含以下内容的my.cnf文件:

[mysql]

host
user

mysql客户端读取这个文件时,这些条目会被解析为--host --user--host=--user,结果如下所示:

$> mysql
ERROR 2005 (HY000): Unknown MySQL server host '--user' (1)

然而,在选项文件中,并不会默认使用等号。假设my.cnf文件如下所示:

[mysql]

user jon

在这种情况下尝试启动mysql会导致不同的错误:

$> mysql
mysql: unknown option '--user jon'

如果你在选项文件中写入host tonfisk而不是host=tonfisk,就会发生类似的错误。你必须使用等号:

[mysql]

user=jon

现在登录尝试成功了:

$> mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 5
Server version: 8.0.36 Source distribution

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

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

这与在命令行中的行为不同,命令行中不需要等号:

$> mysql --user jon --host tonfisk
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 6
Server version: 8.0.36 Source distribution

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> SELECT USER();
+---------------+
| USER()        |
+---------------+
| jon@tonfisk   |
+---------------+
1 row in set (0.00 sec)

在选项文件中指定需要值但没有值的选项会导致服务器出现错误而中止。

6.2.3 连接到服务器的命令选项

原文:dev.mysql.com/doc/refman/8.0/en/connection-options.html

本节描述了大多数 MySQL 客户端程序支持的选项,用于控制客户端程序如何与服务器建立连接,连接是否加密以及连接是否压缩。这些选项可以在命令行或选项文件中指定。

  • 连接建立的命令选项

  • 加密连接的命令选项

  • 连接压缩的命令选项

连接建立的命令选项

本节描述了控制客户端程序如何与服务器建立连接的选项。有关更多信息和示例,请参见第 6.2.4 节,“使用命令选项连接到 MySQL 服务器”。

表 6.4 连接建立选项摘要

选项名称 描述 引入版本
--default-auth 要使用的身份验证插件
--host MySQL 服务器所在的主机
--password 连接到服务器时要使用的密码
--password1 连接到服务器时要使用的第一个多因素身份验证密码 8.0.27
--password2 连接到服务器时要使用的第二个多因素身份验证密码 8.0.27
--password3 连接到服务器时要使用的第三个多因素身份验证密码 8.0.27
--pipe 使用命名管道连接到服务器(仅限 Windows)
--plugin-dir 安装插件的目录
--port 连接的 TCP/IP 端口号
--protocol 要使用的传输协议
--shared-memory-base-name 共享内存连接的共享内存名称(仅限 Windows)
--socket 要使用的 Unix 套接字文件或 Windows 命名管道
--user 连接到服务器时要使用的 MySQL 用户名
选项名称 描述 引入版本
  • --default-auth=*plugin*

    命令行格式 --default-auth=plugin
    类型 字符串

    提示使用哪个客户端端身份验证插件。参见第 8.2.17 节,“可插拔身份验证”。

  • --host=*host_name*, -h *host_name*

    命令行格式 --host=host_name
    类型 字符串
    默认值 localhost

    MySQL 服务器运行的主机。该值可以是主机名、IPv4 地址或 IPv6 地址。默认值为localhost

  • --password[=*pass_val*], -p[*pass_val*]

    命令行格式 --password[=password]
    类型 字符串
    默认值 [none]

    用于连接到服务器的 MySQL 帐户的密码。密码值是可选的。如果未提供,则客户端程序会提示输入密码。如果提供了密码,则--password=-p后面必须没有空格。如果未指定密码选项,则默认情况是不发送密码。

    在命令行上指定密码应被视为不安全。为了避免在命令行上提供密码,请使用选项文件。参见第 8.1.2.1 节,“密码安全的最终用户指南”。

    要明确指定没有密码,且客户端程序不应提示输入密码,请使用--skip-password选项。

  • --password1[=*pass_val*]

    命令行格式 --password1[=password]
    引入版本 8.0.27
    类型 字符串

    用于连接到服务器的 MySQL 帐户的多因素身份验证因子 1 的密码。密码值是可选的。如果未提供,则客户端程序会提示输入密码。如果提供了密码,则--password1=后面必须没有空格。如果未指定密码选项,则默认情况是不发送密码。

    在命令行上指定密码应被视为不安全。为了避免在命令行上提供密码,请使用选项文件。参见第 8.1.2.1 节,“密码安全的最终用户指南”。

    要明确指定没有密码,且客户端程序不应提示输入密码,请使用--skip-password1选项。

    --password1--password是同义词,--skip-password1--skip-password也是同义词。

  • --password2[=*pass_val*]

    命令行格式 --password2[=password]
    引入版本 8.0.27
    类型 字符串

    用于连接到服务器的 MySQL 帐户的多因素认证因子 2 的密码。此选项的语义类似于--password1的语义;有关详细信息,请参阅该选项的描述。

  • --password3[=*pass_val*]

    命令行格式 --password3[=password]
    引入版本 8.0.27
    类型 字符串

    用于连接到服务器的 MySQL 帐户的多因素认证因子 3 的密码。此选项的语义类似于--password1的语义;有关详细信息,请参阅该选项的描述。

  • --pipe, -W

    命令行格式 --pipe
    类型 字符串

    在 Windows 上,使用命名管道连接到服务器。此选项仅在服务器启动时启用了named_pipe系统变量以支持命名管道连接时适用。此外,进行连接的用户必须是由named_pipe_full_access_group系统变量指定的 Windows 组的成员。

  • --plugin-dir=*dir_name*

    命令行格式 --plugin-dir=dir_name
    类型 目录名称

    查找插件的目录。如果使用--default-auth选项指定了身份验证插件但客户端程序找不到它,请指定此选项。请参阅第 8.2.17 节,“可插拔认证”。

  • --port=*port_num*, -P *port_num*

    命令行格式 --port=port_num
    类型 数字
    默认值 3306

    对于 TCP/IP 连接,要使用的端口号。默认端口号为 3306。

  • --protocol={TCP|SOCKET|PIPE|MEMORY}

    命令行格式 --protocol=type
    类型 字符串
    默认值 [见文本]
    有效值 TCP``SOCKET``PIPE``MEMORY

    此选项明确指定用于连接到服务器的传输协议。当其他连接参数通常导致使用不希望使用的协议时,这很有用。例如,默认情况下,在 Unix 上连接到localhost时会使用 Unix 套接字文件:

    mysql --host=localhost
    

    要强制使用 TCP/IP 传输,请指定--protocol选项:

    mysql --host=localhost --protocol=TCP
    

    以下表格显示了允许的--protocol选项值,并指示每个值适用的平台。这些值不区分大小写。

    --protocol 使用的传输协议 适用的平台
    TCP TCP/IP 传输到本地或远程服务器 所有
    SOCKET Unix 套接字文件传输到本地服务器 Unix 和类 Unix 系统
    PIPE 命名管道传输到本地服务器 Windows
    MEMORY 共享内存传输到本地服务器 Windows

    另请参阅第 6.2.7 节,“连接传输协议”

  • --shared-memory-base-name=*name*

    命令行格式 --shared-memory-base-name=name
    平台特定 Windows

    在 Windows 上,用于使用共享内存连接到本地服务器的共享内存名称。默认值为MYSQL。共享内存名称区分大小写。

    此选项仅在服务器启动时启用了shared_memory系统变量以支持共享内存连接时才适用。

  • --socket=*path*, -S *path*

    命令行格式 --socket={file_name&#124;pipe_name}
    类型 字符串

    在 Unix 上,用于使用命名管道连接到本地服务器的 Unix 套接字文件的名称。默认的 Unix 套接字文件名为/tmp/mysql.sock

    在 Windows 上,用于连接到本地服务器的命名管道的名称。默认的 Windows 管道名称为MySQL。管道名称不区分大小写。

    在 Windows 上,只有在服务器启动时启用了named_pipe系统变量以支持命名管道连接时,此选项才适用。此外,进行连接的用户必须是由named_pipe_full_access_group系统变量指定的 Windows 组的成员。

  • --user=*user_name*, -u *user_name*

    命令行格式 --user=user_name
    类型 字符串

    用于连接到服务器的 MySQL 帐户的用户名。在 Windows 上,默认用户名为ODBC,在 Unix 上为您的 Unix 登录名。

加密连接的命令选项

本节描述了客户端程序的选项,指定是否使用加密连接到服务器,证书和密钥文件的名称,以及与加密连接支持相关的其他参数。有关建议用法示例以及如何检查连接是否加密,请参阅 8.3.1 节,“配置 MySQL 使用加密连接”。

注意

这些选项仅对使用加密传输协议的连接有效;即 TCP/IP 和 Unix 套接字文件连接。请参阅 6.2.7 节,“连接传输协议”

有关从 MySQL C API 使用加密连接的信息,请参阅 支持加密连接。

表 6.5 连接加密选项摘要

选项名称 描述 引入版本 废弃版本
--get-server-public-key 从服务器请求 RSA 公钥
--server-public-key-path 包含 RSA 公钥的文件路径名
--ssl-ca 包含受信任的 SSL 证书颁发机构列表的文件
--ssl-capath 包含受信任的 SSL 证书颁发机构证书文件的目录
--ssl-cert 包含 X.509 证书的文件
--ssl-cipher 连接加密的允许密码
--ssl-crl 包含证书吊销列表的文件
--ssl-crlpath 包含证书吊销列表文件的目录
--ssl-fips-mode 是否在客户端启用 FIPS 模式 8.0.34
--ssl-key 包含 X.509 密钥的文件
--ssl-mode 与服务器连接的期望安全状态
--ssl-session-data 包含 SSL 会话数据的文件 8.0.29
--ssl-session-data-continue-on-failed-reuse 如果会话重用失败是否建立连接 8.0.29
--tls-ciphersuites 用于加密连接的允许的 TLSv1.3 密码套件 8.0.16
--tls-version 加密连接的允许 TLS 协议
选项名称 描述 引入 废弃
  • --get-server-public-key

    命令行格式 --get-server-public-key
    类型 布尔值

    从服务器请求用于 RSA 密钥对密码交换所需的公钥。此选项适用于使用caching_sha2_password认证插件进行身份验证的客户端。对于该插件,除非请求,否则服务器不会发送公钥。对于不使用该插件进行身份验证的帐户,此选项将被忽略。如果不使用基于 RSA 的密码交换(例如客户端使用安全连接连接到服务器时),则也会被忽略。

    如果--server-public-key-path=*file_name*被指定并指定了有效的公钥文件,则优先于--get-server-public-key

    有关caching_sha2_password插件的信息,请参见第 8.4.1.2 节,“缓存 SHA-2 可插拔认证”。

  • --server-public-key-path=*file_name*

    命令行格式 --server-public-key-path=file_name
    类型 文件名

    包含客户端端的用于 RSA 密钥对密码交换所需的服务器端公钥的 PEM 格式文件的路径名。此选项适用于使用sha256_passwordcaching_sha2_password认证插件进行身份验证的客户端。对于不使用这些插件进行身份验证的帐户,此选项将被忽略。如果不使用基于 RSA 的密码交换(例如客户端使用安全连接连接到服务器时),则也会被忽略。

    如果--server-public-key-path=*file_name*被指定并指定了有效的公钥文件,则优先于--get-server-public-key

    此选项仅在使用 OpenSSL 构建 MySQL 时可用。

    有关sha256_passwordcaching_sha2_password插件的信息,请参见第 8.4.1.3 节,“SHA-256 可插拔认证”,以及第 8.4.1.2 节,“缓存 SHA-2 可插拔认证”。

  • --ssl-ca=*file_name*

    命令行格式 --ssl-ca=file_name
    类型 文件名

    包含受信任 SSL 证书颁发机构(CA)证书文件的路径名。该文件包含一组受信任的 SSL 证书颁发机构。

    要告诉客户端在与服务器建立加密连接时不验证服务器证书,请同时指定--ssl-ca--ssl-capath。服务器仍然根据客户端账户的任何适用要求验证客户端,并且仍然使用服务器端指定的任何ssl_cassl_capath系统变量值。

    要为服务器指定 CA 文件,请设置ssl_ca系统变量。

  • --ssl-capath=*dir_name*

    命令行格式 --ssl-capath=dir_name
    类型 目录名

    包含受信任 SSL 证书颁发机构(CA)证书文件的目录路径名,格式为 PEM。

    要告诉客户端在与服务器建立加密连接时不验证服务器证书,请同时指定--ssl-ca--ssl-capath。服务器仍然根据客户端账户的任何适用要求验证客户端,并且仍然使用服务器端指定的任何ssl_cassl_capath系统变量值。

    要为服务器指定 CA 目录,请设置ssl_capath系统变量。

  • --ssl-cert=*file_name*

    命令行格式 --ssl-cert=file_name
    类型 文件名

    包含客户端 SSL 公钥证书文件的路径名,格式为 PEM。

    要指定服务器 SSL 公钥证书文件,请设置ssl_cert系统变量。

    注意

    链式 SSL 证书支持在 v8.0.30 中添加;之前只读取第一个证书。

  • --ssl-cipher=*cipher_list*

    命令行格式 --ssl-cipher=name
    类型 字符串

    允许加密连接使用 TLS 协议直至 TLSv1.2 的加密密码列表。如果列表中没有支持的密码,使用这些 TLS 协议的加密连接将无法工作。

    为了最大的可移植性,cipher_list应该是一个或多个密码名称的列表,用冒号分隔。例如:

    --ssl-cipher=AES128-SHA
    --ssl-cipher=DHE-RSA-AES128-GCM-SHA256:AES128-SHA
    

    OpenSSL 支持在www.openssl.org/docs/manmaster/man1/ciphers.html中描述的指定密码的语法。

    有关 MySQL 支持的加密密码,请参阅第 8.3.2 节,“加密连接 TLS 协议和密码”。

    要为服务器指定加密密码,设置ssl_cipher系统变量。

  • --ssl-crl=*file_name*

    命令行格式 --ssl-crl=file_name
    类型 文件名

    包含以 PEM 格式的证书吊销列表的文件路径名。

    如果既没有提供--ssl-crl也没有提供--ssl-crlpath,则不执行 CRL 检查,即使 CA 路径包含证书吊销列表。

    要为服务器指定吊销列表文件,设置ssl_crl系统变量。

  • --ssl-crlpath=*dir_name*

    命令行格式 --ssl-crlpath=dir_name
    类型 目录名

    包含以 PEM 格式的证书吊销列表文件的目录路径名。

    如果既没有提供--ssl-crl也没有提供--ssl-crlpath,则不执行 CRL 检查,即使 CA 路径包含证书吊销列表。

    要为服务器指定吊销列表目录,设置ssl_crlpath系统变量。

  • --ssl-fips-mode={OFF|ON|STRICT}

    命令行格式 --ssl-fips-mode={OFF&#124;ON&#124;STRICT}
    已弃用 8.0.34
    类型 枚举
    默认值 OFF
    有效值 OFF``ON``STRICT

    控制是否在客户端端启用 FIPS 模式。--ssl-fips-mode选项与其他--ssl-*xxx*选项不同,它不用于建立加密连接,而是用于影响允许的加密操作。请参阅第 8.8 节,“FIPS 支持”。

    这些--ssl-fips-mode值是允许的:

    • OFF: 禁用 FIPS 模式。

    • ON: 启用 FIPS 模式。

    • STRICT: 启用“严格”FIPS 模式。

    注意

    如果 OpenSSL FIPS 对象模块不可用,则--ssl-fips-mode的唯一允许值为OFF。在这种情况下,将--ssl-fips-mode设置为ONSTRICT会导致客户端在启动时产生警告并在非 FIPS 模式下运行。

    要为服务器指定 FIPS 模式,设置ssl_fips_mode系统变量。

  • --ssl-key=*file_name*

    命令行格式 --ssl-key=file_name
    类型 文件名

    客户端 SSL 私钥文件的 PEM 格式路径名。为了更好的安全性,请使用至少 2048 位的 RSA 密钥大小的证书。

    如果密钥文件受密码保护,则客户端程序会提示用户输入密码。密码必须以交互方式给出;不能存储在文件中。如果密码不正确,则程序会继续,就好像无法读取密钥一样。

    要指定服务器 SSL 私钥文件,请设置 ssl_key 系统变量。

  • --ssl-mode=*mode*

    命令行格式 --ssl-mode=mode
    类型 枚举
    默认值 PREFERRED
    有效值 DISABLED``PREFERRED``REQUIRED``VERIFY_CA``VERIFY_IDENTITY

    此选项指定与服务器的连接所需的安全状态。这些模式值是允许的,按照严格程度递增的顺序:

    • DISABLED: 建立一个未加密的连接。

    • PREFERRED: 如果服务器支持加密连接,则建立加密连接,如果无法建立加密连接,则回退到未加密连接。如果未指定 --ssl-mode,则默认为此选项。

      通过 Unix 套接字文件进行的连接不会使用 PREFERRED 模式进行加密。要强制对 Unix 套接字文件连接进行加密,请使用 REQUIRED 或更严格的模式。(但是,默认情况下,套接字文件传输是安全的,因此加密套接字文件连接不会增加安全性,反而会增加 CPU 负载。)

    • REQUIRED: 如果服务器支持加密连接,则建立加密连接。如果无法建立加密连接,则连接尝试失败。

    • VERIFY_CA: 类似于 REQUIRED,但还会根据配置的 CA 证书验证服务器证书颁发机构(CA)证书。如果找不到有效的匹配 CA 证书,则连接尝试失败。

    • VERIFY_IDENTITY: 类似于 VERIFY_CA,但还通过检查客户端用于连接到服务器的主机名与服务器发送给客户端的证书中的标识进行主机名身份验证:

      • 从 MySQL 8.0.12 开始,如果客户端使用 OpenSSL 1.0.2 或更高版本,则客户端会检查用于连接的主机名是否与服务器证书中的主题备用名称值或通用名称值匹配。主机名身份验证也适用于使用通配符指定通用名称的证书。

      • 否则,客户端会检查用于连接的主机名是否与服务器证书中的通用名称值匹配。

      如果存在不匹配,连接将失败。对于加密连接,此选项有助于防止中间人攻击。

      注意

      使用VERIFY_IDENTITY进行主机名身份验证无法与由服务器自动创建或使用mysql_ssl_rsa_setup(请参见 8.3.3.1 节,“使用 MySQL 创建 SSL 和 RSA 证书和密钥”会在其他默认设置不变的情况下产生加密连接。然而,为了防止复杂的中间人攻击,客户端验证服务器的身份非常重要。设置--ssl-mode=VERIFY_CA--ssl-mode=VERIFY_IDENTITY比默认设置更好,以帮助防止这种类型的攻击。要实施这些设置之一,必须首先确保服务器的 CA 证书可靠地提供给所有在您的环境中使用它的客户端,否则将导致可用性问题。因此,它们不是默认设置。

    --ssl-mode选项与 CA 证书选项的交互如下:

    • 如果未显式设置--ssl-mode,则使用--ssl-ca--ssl-capath意味着--ssl-mode=VERIFY_CA

    • 对于VERIFY_CAVERIFY_IDENTITY--ssl-mode值,还需要--ssl-ca--ssl-capath,以提供与服务器使用的 CA 证书匹配的 CA 证书。

    • 具有值不是VERIFY_CAVERIFY_IDENTITY的显式--ssl-mode选项,以及显式--ssl-ca--ssl-capath选项,会产生警告,表明尽管指定了 CA 证书选项,但不会执行对服务器证书的验证。

    要求 MySQL 帐户使用加密连接,请使用 CREATE USER 创建带有 REQUIRE SSL 子句的帐户,或者对现有帐户使用 ALTER USER 添加 REQUIRE SSL 子句。这将导致使用该帐户的客户端的连接尝试被拒绝,除非 MySQL 支持加密连接并且可以建立加密连接。

    REQUIRE 子句允许其他与加密相关的选项,这些选项可用于强制执行比 REQUIRE SSL 更严格的安全要求。有关客户端连接时必须或可以指定的命令选项的详细信息,请参阅 CREATE USER SSL/TLS 选项。

  • --ssl-session-data=*file_name*

    命令行格式 --ssl-session-data=file_name
    引入版本 8.0.29
    类型 文件名

    客户端 SSL 会话数据文件的 PEM 格式路径名,用于会话重用。

    当您使用 --ssl-session-data 选项调用 MySQL 客户端程序时,如果提供了文件,客户端会尝试从文件中反序列化会话数据,然后使用它来建立新连接。如果您提供了一个文件,但会话未被重用,则连接将失败,除非您在调用客户端程序时在命令行上还指定了 --ssl-session-data-continue-on-failed-reuse 选项。

    mysql 命令 ssl_session_data_print 生成会话数据文件(参见 Section 6.5.1.2, “mysql Client Commands”)。

  • ssl-session-data-continue-on-failed-reuse

    命令行格式 --ssl-session-data-continue-on-failed-reuse
    引入版本 8.0.29
    类型 布尔值
    默认值 OFF

    控制是否启动新连接以替换尝试但未能重用使用 --ssl-session-data 命令行选项指定的会话数据的连接。默认情况下,--ssl-session-data-continue-on-failed-reuse 命令行选项关闭,这会导致当提供会话数据但未重用时,客户端程序返回连接失败。

    为了确保在会话重用失败后静默打开新的不相关连接,请使用--ssl-session-data--ssl-session-data-continue-on-failed-reuse命令行选项调用 MySQL 客户端程序。

  • --tls-ciphersuites=*ciphersuite_list*

    命令行格式 --tls-ciphersuites=ciphersuite_list
    引入版本 8.0.16
    类型 字符串
    默认值 空字符串

    此选项指定客户端允许使用 TLSv1.3 的加密连接的密码套件。该值是一个或多个以冒号分隔的密码套件名称列表。例如:

    mysql --tls-ciphersuites="*suite1*:*suite2*:*suite3*"
    

    可以为此选项命名的密码套件取决于用于编译 MySQL 的 SSL 库。如果未设置此选项,则客户端允许默认密码套件。如果将选项设置为空字符串,则不启用任何密码套件,无法建立加密连接。有关更多信息,请参见第 8.3.2 节,“加密连接 TLS 协议和密码套件”。

    此选项在 MySQL 8.0.16 中添加。

    要指定服务器允许的密码套件,设置tls_ciphersuites系统变量。

  • --tls-version=*protocol_list*

    命令行格式 --tls-version=protocol_list
    类型 字符串
    默认值(≥ 8.0.16) TLSv1,TLSv1.1,TLSv1.2,TLSv1.3(OpenSSL 1.1.1 或更高版本)TLSv1,TLSv1.1,TLSv1.2(否则)
    默认值(≤ 8.0.15) TLSv1,TLSv1.1,TLSv1.2

    此选项指定客户端允许用于加密连接的 TLS 协议。该值是一个或多个逗号分隔的协议版本列表。例如:

    mysql --tls-version="TLSv1.2,TLSv1.3"
    

    可以为此选项命名的协议取决于用于编译 MySQL 的 SSL 库以及 MySQL Server 的发布版本。

    重要

    • 从 MySQL 8.0.28 开始,MySQL 服务器移除了对 TLSv1 和 TLSv1.1 连接协议的支持。这些协议从 MySQL 8.0.26 开始被弃用,尽管 MySQL 服务器客户端在使用弃用的 TLS 协议版本时不会向用户返回警告。从 MySQL 8.0.28 开始,支持--tls-version选项的客户端,包括 MySQL Shell,不能使用将协议设置为 TLSv1 或 TLSv1.1 的 TLS/SSL 连接。如果客户端尝试使用这些协议进行连接,对于 TCP 连接,连接将失败,并向客户端返回错误。对于套接字连接,如果--ssl-mode设置为REQUIRED,连接将失败,否则连接将建立但 TLS/SSL 被禁用。有关更多信息,请参阅移除对 TLSv1 和 TLSv1.1 协议的支持。

    • 从 MySQL 8.0.16 开始,MySQL 服务器支持 TLSv1.3 协议,前提是 MySQL 服务器使用了 OpenSSL 1.1.1 或更高版本进行编译。服务器在启动时检查 OpenSSL 的版本,如果低于 1.1.1,则将从与 TLS 版本相关的服务器系统变量的默认值中移除 TLSv1.3(例如tls_version系统变量)。

    允许的协议应该被选择,以避免在列表中留下“漏洞”。例如,这些值没有漏洞:

    --tls-version="TLSv1,TLSv1.1,TLSv1.2,TLSv1.3"
    --tls-version="TLSv1.1,TLSv1.2,TLSv1.3"
    --tls-version="TLSv1.2,TLSv1.3"
    --tls-version="TLSv1.3"
    
    From MySQL 8.0.28, only the last two values are suitable.
    

    这些值有漏洞,不应该使用:

    --tls-version="TLSv1,TLSv1.2"
    --tls-version="TLSv1.1,TLSv1.3"
    

    有关详细信息,请参阅第 8.3.2 节,“加密连接 TLS 协议和密码”。

    要指定服务器允许的 TLS 协议,设置tls_version系统变量。

连接压缩的命令选项

本节描述了使客户端程序能够控制与服务器连接中压缩使用的选项。有关更多信息和示例,请参阅第 6.2.8 节,“连接压缩控制”。

表 6.6 连接压缩选项摘要

选项名称 描述 引入版本 弃用版本
--compress 压缩客户端和服务器之间发送的所有信息 8.0.18
--compression-algorithms 连接到服务器的允许的压缩算法 8.0.18
--zstd-compression-level 使用 zstd 压缩连接到服务器的压缩级别 8.0.18
  • --compress, -C

    命令行格式 --compress[={OFF&#124;ON}]
    废弃 8.0.18
    类型 布尔值
    默认值 OFF

    如果可能的话,压缩客户端和服务器之间发送的所有信息。

    从 MySQL 8.0.18 开始,此选项已被废弃。预计在未来的 MySQL 版本中将会移除。请参阅配置传统连接压缩。

  • --compression-algorithms=*value*

    命令行格式 --compression-algorithms=value
    引入版本 8.0.18
    类型 集合
    默认值 uncompressed
    有效值 zlib``zstd``uncompressed

    用于连接到服务器的允许的压缩算法。可用的算法与protocol_compression_algorithms系统变量相同。默认值为uncompressed

    此选项在 MySQL 8.0.18 中添加。

  • --zstd-compression-level=*level*

    命令行格式 --zstd-compression-level=#
    引入版本 8.0.18
    类型 整数

    用于使用zstd压缩算法连接到服务器的连接的压缩级别。允许的级别从 1 到 22,较大的值表示较高级别的压缩。默认的zstd压缩级别为 3。压缩级别设置对不使用zstd压缩的连接没有影响。

    此选项在 MySQL 8.0.18 中添加。

6.2.4 使用命令选项连接到 MySQL 服务器

原文:dev.mysql.com/doc/refman/8.0/en/connecting.html

本节描述了使用命令行选项来指定如何建立与 MySQL 服务器的连接,适用于诸如mysqlmysqldump等客户端。有关使用类似 URI 的连接字符串或键值对建立连接的信息,适用于 MySQL Shell 等客户端,请参阅第 6.2.5 节,“使用类似 URI 的字符串或键值对连接到服务器”。如果无法连接,需要更多信息,请参阅第 8.2.22 节,“解决连接到 MySQL 的问题”。

要使客户端程序连接到 MySQL 服务器,必须使用正确的连接参数,如运行服务器的主机名以及您的 MySQL 帐户的用户名和密码。每个连接参数都有一个默认值,但您可以使用程序选项根据需要覆盖默认值,这些选项可以在命令行上指定或在选项文件中指定。

这里的示例使用mysql客户端程序,但原则适用于其他客户端,如mysqldumpmysqladminmysqlshow

此命令调用mysql而不指定任何显式连接参数:

mysql

因为没有参数选项,所以适用默认值:

  • 默认主机名是localhost。在 Unix 上,这具有特殊含义,稍后会描述。

  • 默认用户名是 Windows 上的ODBC或 Unix 上的登录名。

  • 没有发送密码,因为既没有--password也没有给出-p

  • 对于mysql,第一个非选项参数被视为默认数据库的名称。因为没有这样的参数,mysql选择不使用默认数据库。

要明确指定主机名和用户名,以及密码,请在命令行上提供适当的选项。要选择默认数据库,请添加一个数据库名称参数。示例:

mysql --host=localhost --user=myname --password=*password* mydb
mysql -h localhost -u myname -p*password* mydb

对于密码选项,密码值是可选的:

  • 如果使用--password-p选项并指定密码值,则--password=-p与其后的密码之间不能有空格

  • 如果你使用--password-p但没有指定密码值,客户端程序会提示你输入密码。在输入密码时,密码不会显示出来。这比在命令行上提供密码更安全,因为这样可能会使系统上的其他用户通过执行诸如ps之类的命令看到密码。参见第 8.1.2.1 节,“终端用户密码安全指南”。

  • 要明确指定没有密码,并且客户端程序不应提示输入密码,请使用--skip-password选项。

正如刚才提到的,将密码值包含在命令行上是一种安全风险。为了避免这种风险,请指定不带任何后续密码值的--password-p选项:

mysql --host=localhost --user=myname --password mydb
mysql -h localhost -u myname -p mydb

当使用--password-p选项时,没有密码值,客户端程序会打印提示并等待你输入密码。(在这些示例中,mydb并不被解释为密码,因为它与前面的密码选项之间有一个空格。)

在某些系统上,MySQL 用于提示密码的库例程会自动将密码限制为八个字符。这个限制是系统库的属性,而不是 MySQL 的属性。在内部,MySQL 对密码长度没有任何限制。为了解决受影响系统上的限制,可以在选项文件中指定密码(参见第 6.2.2.2 节,“使用选项文件”)。另一个解决方法是将 MySQL 密码更改为八个或更少字符的值,但这样做的缺点是较短的密码往往不够安全。

客户端程序确定要进行的连接类型如下:

  • 如果未指定主机或主机为localhost,则会连接到本地主机:

    • 在 Windows 上,如果服务器启动时启用了支持共享内存连接的shared_memory系统变量,则客户端将使用共享内存连接。

    • 在 Unix 上,MySQL 程序对主机名localhost进行了特殊处理,这与您对其他基于网络的程序的期望可能不同:客户端使用 Unix 套接字文件进行连接。可以使用--socket选项或MYSQL_UNIX_PORT环境变量来指定套接字名称。

  • 在 Windows 上,如果host.(句点),或者未启用 TCP/IP 并且未指定--socket或主机名为空,则客户端将使用命名管道连接,如果服务器启用了named_pipe系统变量以支持命名管道连接。如果不支持命名管道连接,或者进行连接��用户不是由named_pipe_full_access_group系统变量指定的 Windows 组的成员,则会发生错误。

  • 否则,连接将使用 TCP/IP。

--protocol选项使您能够即使其他选项通常会导致使用不同协议,也可以使用特定传输协议。也就是说,--protocol明确指定传输协议并覆盖前述规则,即使是对于localhost

只有与所选传输协议相关的连接选项才会被使用或检查。其他连接选项将被忽略。例如,在 Unix 上使用--host=localhost,客户端尝试使用 Unix 套接字文件连接到本地服务器,即使给定了--port-P选项来指定 TCP/IP 端口号。

为确保客户端与本地服务器建立 TCP/IP 连接,请使用--host-h来指定主机名值为127.0.0.1(而不是localhost),或本地服务器的 IP 地址或名称。您还可以明确指定传输协议,即使是对于localhost,也可以使用--protocol=TCP选项。示例:

mysql --host=127.0.0.1
mysql --protocol=TCP

如果服务器配置为接受 IPv6 连接,则客户端可以使用--host=::1通过 IPv6 连接到本地服务器。请参阅第 7.1.13 节,“IPv6 支持”。

在 Windows 上,要强制 MySQL 客户端使用命名管道连接,请指定--pipe--protocol=PIPE选项,或将.(句点)作为主机名。如果服务器未启用named_pipe系统变量以支持命名管道连接,或者进行连接的用户不是由named_pipe_full_access_group系统变量指定的 Windows 组的成员,则会发生错误。如果不想使用默认管道名称,请使用--socket选项指定管道的名称。

连接到远程服务器使用 TCP/IP。此命令连接到运行在remote.example.com上的服务器,使用默认端口号(3306):

mysql --host=remote.example.com

要明确指定端口号,请使用--port-P选项:

mysql --host=remote.example.com --port=13306

您也可以为连接到本地服务器指定端口号。但是,如前所述,在 Unix 上连接到localhost默认使用套接字文件,因此除非您像之前描述的那样强制使用 TCP/IP 连接,否则任何指定端口号的选项都将被忽略。

对于此命令,在 Unix 上程序使用套接字文件,--port选项将被忽略:

mysql --port=13306 --host=localhost

要使用端口号,请强制使用 TCP/IP 连接。例如,以以下任一种方式调用程序:

mysql --port=13306 --host=127.0.0.1
mysql --port=13306 --protocol=TCP

有关控制客户端程序如何与服务器建立连接的选项的更多信息,请参见第 6.2.3 节,“连接到服务器的命令选项”。

可以在每次调用客户端程序时指定连接参数,而无需每次在命令行中输入它们:

  • 在选项文件的[client]部分指定连接参数。文件的相关部分可能如下所示:

    [client]
    host=*host_name*
    user=*user_name*
    password=*password*
    

    查看更多信息,请参见第 6.2.2.2 节,“使用选项文件”。

  • 一些连接参数可以使用环境变量指定。例如:

    • 要指定mysql的主机,请使用MYSQL_HOST

    • 在 Windows 上,要指定 MySQL 用户名,请使用USER

    要查看支持的环境变量列表,请参见第 6.9 节,“环境变量”。

6.2.5 使用类似 URI 字符串或键值对连接到服务器

原文:dev.mysql.com/doc/refman/8.0/en/connecting-using-uri-or-key-value-pairs.html

本节描述了如何使用类似 URI 的连接字符串或键值对来指定如何建立与 MySQL 服务器的连接,适用于诸如 MySQL Shell 的客户端。有关使用命令行选项建立连接的信息,适用于诸如mysqlmysqldump等客户端,请参阅第 6.2.4 节,“使用命令选项连接到 MySQL 服务器”。如果无法连接,请参阅第 8.2.22 节,“连接到 MySQL 时出现问题的故障排除”。

注意

“类似 URI”一词表示连接字符串语法类似但不完全相同于RFC 3986定义的 URI(统一资源标识符)语法。

以下 MySQL 客户端支持使用类似 URI 连接字符串或键值对连接到 MySQL 服务器:

  • MySQL Shell

  • 实现 X DevAPI 的 MySQL 连接器

本节记录了所有有效的类似 URI 字符串和键值对连接参数,其中许多与命令行选项指定的参数类似:

  • 使用类似 URI 字符串指定的参数使用如myuser@example.com:3306/main-schema的语法。有关完整语法,请参阅使用类似 URI 连接字符串连接。

  • 使用键值对指定的参数使用如{user:'myuser', host:'example.com', port:3306, schema:'main-schema'}的语法。有关完整语法,请参阅使用键值对连接。

连接参数不区分大小写。每个参数只能��定一次。如果一个参数指定多次,将会出现错误。

本节涵盖以下主题:

  • 基本连接参数

  • 附加连接参数

  • 使用类似 URI 连接字符串连接

  • 使用键值对连接

基本连接参数

以下讨论描述了指定连接到 MySQL 时可用的参数。这些参数可以使用符合基本 URI 类似语法的字符串(请参阅使用类似 URI 的连接字符串进行连接)或作为键值对(请参阅使用键值对进行连接)来提供。

  • scheme: 要使用的传输协议。对于 X 协议连接,请使用 mysqlx,对于经典 MySQL 协议连接,请使用 mysql。如果未指定协议,服务器将尝试猜测协议。支持 DNS SRV 的连接器可以使用 mysqlx+srv 方案(请参阅使用 DNS SRV 记录进行连接)。

  • user: 提供身份验证过程中使用的 MySQL 用户账户。

  • password: 用于身份验证过程的密码。

    警告

    在连接规范中明确指定密码是不安全且不推荐的。稍后的讨论将展示如何导致出现密码的交互提示。

  • host: 运行服务器实例的主机。值可以是主机名、IPv4 地址或 IPv6 地址。如果未指定主机,则默认为 localhost

  • port: 目标 MySQL 服务器侦听连接的 TCP/IP 网络端口。如果未指定端口,则 X 协议连接的默认端口为 33060,经典 MySQL 协议连接的默认端口为 3306。

  • socket: Unix 套接字文件路径或 Windows 命名管道的名称。值为本地文件路径。在类似 URI 的字符串中,它们必须进行编码,可以使用百分号编码或用括号括起路径。括号消除了需要对字符进行百分号编码,例如 / 目录分隔符字符。例如,要使用 Unix 套接字 /tmp/mysql.sock 连接为 root@localhost,请使用百分号编码指定路径为 root@localhost?socket=%2Ftmp%2Fmysql.sock,或使用括号指定路径为 root@localhost?socket=(/tmp/mysql.sock)

  • schema: 连接的默认数据库。如果未指定数据库,则连接没有默认数据库。

在 Unix 上处理 localhost 取决于传输协议的类型。使用经典 MySQL 协议的连接将 localhost 与其他 MySQL 客户端一样处理,这意味着假定 localhost 用于基于套接字的连接。对于使用 X 协议的连接,localhost 的行为不同,它被假定代表回环地址,例如,IPv4 地址 127.0.0.1。

附加连接参数

您可以指定连接的选项,可以作为 URI 类似字符串中的属性通过附加 ?*attribute=value*,或作为键值对。以下选项可用:

  • ssl-mode: 连接的期望安全状态。以下模式是允许的:

    • DISABLED

    • PREFERRED

    • REQUIRED

    • VERIFY_CA

    • VERIFY_IDENTITY

    重要

    VERIFY_CAVERIFY_IDENTITY 比默认的PREFERRED更好,因为它们有助于防止中间人攻击。

    有关这些模式的信息,请参见加密连接的命令选项中的--ssl-mode选项描述。

  • ssl-ca: PEM 格式的 X.509 证书颁发机构文件路径。

  • ssl-capath: 包含 PEM 格式的 X.509 证书颁发机构文件的目录路径。

  • ssl-cert: PEM 格式的 X.509 证书文件路径。

  • ssl-cipher: 用于使用 TLS 协议进行连接的加密密码,直到 TLSv1.2。

  • ssl-crl: PEM 格式的包含证书吊销列表的文件路径。

  • ssl-crlpath: PEM 格式的包含证书吊销列表文件的目录路径。

  • ssl-key: PEM 格式的 X.509 密钥文件路径。

  • tls-version: 经典 MySQL 协议加密连接允许的 TLS 协议。此选项仅由 MySQL Shell 支持。tls-version(单数)的值是逗号分隔的列表,例如TLSv1.2,TLSv1.3。详情请参见第 8.3.2 节,“加密连接 TLS 协议和密码”。此选项取决于未将ssl-mode选项设置为DISABLED

  • tls-versions: 加密 X 协议连接的允许 TLS 协议。tls-versions(复数)的值是一个数组,例如[TLSv1.2,TLSv1.3]。详情请参见第 8.3.2 节,“加密连接 TLS 协议和密码”。此选项取决于未将ssl-mode选项设置为DISABLED

  • tls-ciphersuites: 允许的 TLS 密码套件。tls-ciphersuites的值是列出在TLS 密码套件中的 IANA 密码套件名称的列表。详情请参见第 8.3.2 节,“加密连接 TLS 协议和密码”。此选项取决于未将ssl-mode选项设置为DISABLED

  • auth-method: 用于连接的身份验证方法。默认值为AUTO,表示服务器会尝试猜测。以下方法是允许的:

    • AUTO

    • MYSQL41

    • SHA256_MEMORY

    • FROM_CAPABILITIES

    • FALLBACK

    • PLAIN

    对于 X 协议连接,任何配置的auth-method都会被覆盖为以下身份验证方法序列:MYSQL41SHA256_MEMORYPLAIN

  • get-server-public-key:从服务器请求所需的用于 RSA 密钥对密码交换的公钥。在使用 SSL 模式DISABLED连接到 MySQL 8.0 服务器时使用经典 MySQL 协议。在这种情况下,您必须指定协议。例如:

    mysql://user@localhost:3306?get-server-public-key=true
    

    此选项适用于使用caching_sha2_password认证插件进行身份验证的客户端。对于该插件,除非请求,否则服务器不会发送公钥。对于不使用该插件进行身份验证的帐户,此选项将被忽略。如果不使用基于 RSA 的密码交换,例如客户端使用安全连接连接到服务器时,此选项也将被忽略。

    如果server-public-key-path=*file_name*给出并指定有效的公钥文件,则优先于get-server-public-key

    关于caching_sha2_password插件的信息,请参见 Section 8.4.1.2,“缓存 SHA-2 可插拔认证”。

  • server-public-key-path:以 PEM 格式存储的文件路径名,其中包含服务器所需的用于 RSA 密钥对密码交换的客户端端公钥的副本。在使用 SSL 模式DISABLED连接到 MySQL 8.0 服务器时使用经典 MySQL 协议。

    此选项适用于使用sha256_passwordcaching_sha2_password认证插件进行身份验证的客户端。对于不使用这些插件进行身份验证的帐户,此选项将被忽略。如果不使用基于 RSA 的密码交换,例如客户端使用安全连接连接到服务器时,此选项也将被忽略。

    如果server-public-key-path=*file_name*给出并指定有效的公钥文件,则优先于get-server-public-key

    关于sha256_passwordcaching_sha2_password插件的信息,请参见 Section 8.4.1.3,“SHA-256 可插拔认证”,以及 Section 8.4.1.2,“缓存 SHA-2 可插拔认证”。

  • ssh:连接到 SSH 服务器以使用 SSH 隧道访问 MySQL 服务器实例的 URI。URI 格式为[user@]host[:port]。使用uri选项指定目标 MySQL 服务器实例的 URI。有关从 MySQL Shell 进行 SSH 隧道连接的信息,请参见使用 SSH 隧道。

  • uri:通过 SSH 隧道从由ssh选项指定的服务器访问的 MySQL 服务器实例的 URI。URI 格式为[scheme://][user@]host[:port]。不要使用基本连接参数(schemeuserhostport)来指定用于 SSH 隧道连接的 MySQL 服务器连接,只需使用uri选项。

  • ssh-password:连接到 SSH 服务器的密码。

    警告

    在连接规范中指定明确的密码是不安全且不推荐的做法。当需要密码时,MySQL Shell 会交互式地提示输入密码。

  • ssh-config-file:用于连接到 SSH 服务器的 SSH 配置文件。您可以使用 MySQL Shell 配置选项ssh.configFile来设置自定义文件作为默认文件,如果未指定此选项。如果未设置ssh.configFile,则默认为标准 SSH 配置文件~/.ssh/config

  • ssh-identity-file:用于连接到 SSH 服务器的身份文件。如果未指定此选项,则默认使用 SSH 代理中配置的任何身份文件(如果使用),或者在 SSH 配置文件中配置的身份文件,或者 SSH 配置文件夹中的标准私钥文件(~/.ssh/id_rsa)。

  • ssh-identity-pass:由ssh-identity-file选项指定的身份文件的密码。

    警告

    在连接规范中指定明确的密码是不安全且不推荐的做法。当需要密码时,MySQL Shell 会交互式地提示输入密码。

  • connect-timeout:用于配置客户端(如 MySQL Shell)等待连接到无响应的 MySQL 服务器的秒数。

  • compression:此选项请求或禁用连接的压缩。在 MySQL 8.0.19 之前,它仅适用于经典的 MySQL 协议连接,而从 MySQL 8.0.20 开始,它也适用于 X 协议连接。

    • 在 MySQL 8.0.19 之前,此选项的值为true(或 1),表示启用压缩,而默认值false(或 0)表示禁用压缩。

    • 从 MySQL 8.0.20 开始,此选项的值为required,表示请求压缩并在服务器不支持时失败;preferred表示请求压缩并在无法时回退到未压缩连接;disabled表示请求未压缩连接并在服务器不允许时失败。preferred是 X 协议连接的默认值,而disabled是经典的 MySQL 协议连接的默认值。有关 X 插件连接压缩控制的信息,请参阅第 22.5.5 节,“X 插件连接压缩”。

    请注意,不同的 MySQL 客户端以不同的方式实现对连接压缩的支持。请查阅您的客户端文档以获取详细信息。

  • compression-algorithmscompression-level:这些选项在 MySQL Shell 8.0.20 及更高版本中可用,用于更好地控制连接压缩。您可以指定它们以选择连接所使用的压缩算法,以及与该算法一起使用的数字压缩级别。您还可以使用 compression-algorithms 代替 compression 来请求连接的压缩。有关 MySQL Shell 连接压缩控制的信息,请参阅 使用压缩连接。

  • connection-attributes:控制应用程序在连接时传递给服务器的键值对。有关连接属性的一般信息,请参阅 第 29.12.9 节,“性能模式连接属性表”。客户端通常定义一组默认属性,可以禁用或启用。例如:

    mysqlx://user@host?connection-attributes
    mysqlx://user@host?connection-attributes=true
    mysqlx://user@host?connection-attributes=false
    

    默认行为是发送默认属性集。应用程序可以指定要传递的除默认属性之外的属性。您可以将额外的连接属性指定为连接字符串中的 connection-attributes 参数。connection-attributes 参数值必须为空(与指定 true 相同),是一个布尔值(truefalse 用于启用或禁用默认属性集),或者是一个由逗号分隔的零个或多个 key=value 指定器的列表(用于发送除默认属性集之外的属性)。在列表中,缺少的键值将被视为空字符串。更多示例:

    mysqlx://user@host?connection-attributes=[attr1=val1,attr2,attr3=]
    mysqlx://user@host?connection-attributes=[]
    

    应用程序定义的属性名称不能以 _ 开头,因为这些名称保留用于内部属性。

使用类似 URI 的连接字符串进行连接

您可以使用类似 URI 的字符串指定与 MySQL Server 的连接。这种字符串可以与 MySQL Shell 的 --uri 命令选项、MySQL Shell 的 \connect 命令以及实现 X DevAPI 的 MySQL 连接器一起使用。

注意

“类似 URI” 一词表示连接字符串语法类似于但不完全相同于由 RFC 3986 定义的 URI(统一资源标识符)语法。

类似 URI 的连接字符串具有以下语法:

[*scheme*://][*user*[:[*password*]]@]*host*[:*port*][/*schema*]?*attribute1=value1&attribute2=value2...*

重要

URI-like 字符串的元素中必须使用百分号编码来处理保留字符。例如,如果您指定包含 @ 字符的字符串,则该字符必须替换为 %40。如果在 IPv6 地址中包含区域 ID,则用作分隔符的 % 字符必须替换为 %25

您可以在 [基本连接参数 中描述的 URI-like 连接字符串中使用的参数。

MySQL Shell 的shell.parseUri()shell.unparseUri()方法可用于拆解和组装类似 URI 的连接字符串。给定类似 URI 的连接字符串,shell.parseUri()返回一个包含字符串中每个元素的字典。shell.unparseUri()将 URI 组件和连接选项的字典转换为用于连接到 MySQL 的有效类似 URI 连接字符串,可在 MySQL Shell 中使用,也可由实现 X DevAPI 的 MySQL 连接器使用。

如果在类似 URI 的字符串中未指定密码(建议不指定),交互式客户端会提示输入密码。以下示例展示了如何指定类似 URI 的字符串,其中包含用户名user_name。在每种情况下,都会提示输入密码。

  • 连接到监听端口 33065 的本地服务器实例的 X 协议连接。

    mysqlx://*user_name*@localhost:33065
    
  • 到监听端口 3333 的本地服务器实例的经典 MySQL 协议连接。

    mysql://*user_name*@localhost:3333
    
  • 通过主机名、IPv4 地址和 IPv6 地址连接到远程服务器实例的 X 协议连接。

    mysqlx://*user_name*@server.example.com/
    mysqlx://*user_name*@198.51.100.14:123
    mysqlx://*user_name*@[2001:db8:85a3:8d3:1319:8a2e:370:7348]
    
  • 使用套接字进行 X 协议连接,路径可以使用百分号编码或括号提供。

    mysqlx://*user_name*@/*path*%2F*to*%2F*socket.sock*
    mysqlx://*user_name*@(*/path/to/socket.sock*)
    
  • 可以指定可选路径,表示数据库。

    # use 'world' as the default database
    mysqlx://*user_name*@198.51.100.1/world
    
    # use 'world_x' as the default database, encoding _ as %5F
    mysqlx://*user_name*@198.51.100.2:33060/world%5Fx
    
  • 可以指定可选查询,由每个以*key*=*value*对或单个key给出的值组成。要指定多个值,请用,字符分隔它们。可以混合使用*key*=*value*key值。值可以是列表类型,列表值按出现顺序排序。字符串必须是百分号编码或用括号括起来。以下是等效的。

    ssluser@127.0.0.1?ssl-ca=%2Froot%2Fclientcert%2Fca-cert.pem\
    &ssl-cert=%2Froot%2Fclientcert%2Fclient-cert.pem\
    &ssl-key=%2Froot%2Fclientcert%2Fclient-key
    
    ssluser@127.0.0.1?ssl-ca=(/root/clientcert/ca-cert.pem)\
    &ssl-cert=(/root/clientcert/client-cert.pem)\
    &ssl-key=(/root/clientcert/client-key)
    
  • 指定用于加密连接的 TLS 版本和密码套件:

    mysql://*user_name*@198.51.100.2:3306/world%5Fx?\
    tls-versions=[TLSv1.2,TLSv1.3]&tls-ciphersuites=[TLS_DHE_PSK_WITH_AES_128_\
    GCM_SHA256, TLS_CHACHA20_POLY1305_SHA256]
    

前面的示例假定连接需要密码。对于交互式客户端,在登录提示符处会要求输入指定用户的密码。如果用户帐户没有密码(这是不安全且不建议的),或者正在使用套接字对等凭据认证(例如,使用 Unix 套接字连接),则必须在连接字符串中明确指定不提供密码且不需要密码提示。为此,在字符串中在user_name后面放置一个:,但不要在其后指定密码。例如:

mysqlx://*user_name*:@localhost

使用键值对进行连接

在 MySQL Shell 和一些实现 X DevAPI 的 MySQL 连接器中,您可以使用键值对指定与 MySQL 服务器的连接,这些键值对以自然语言构造的形式提供给实现。例如,您可以在 JavaScript 中以 JSON 对象的形式或在 Python 中以字典的形式提供键值对作为连接参数。无论以何种方式提供键值对,概念都是相同的:本节中描述的键可以分配用于指定连接的值。您可以在 MySQL Shell 的shell.connect()方法或 InnoDB Cluster 的dba.createCluster()方法中使用键值对指定连接,并且在一些实现 X DevAPI 的 MySQL 连接器中也可以这样做。

通常,键值对用{}字符括起来,,字符用作键值对之间的分隔符。:字符用于键和值之间的分隔,字符串必须被定界(例如,使用'字符)。与类似 URI 的连接字符串不同,不需要对字符串进行百分比编码。

以键值对形式指定的连接具有以下格式:

{ *key*: *value*, *key*: *value*, ...}

您可以用作连接键的参数在基本连接参数中进行了描述。

如果在键值对中未指定密码(建议不要指定),交互式客户端会提示输入密码。以下示例展示了如何使用用户名'*user_name*'指定连接。在每种情况下,都会提示输入密码。

  • 在本地服务器实例上监听端口 33065 的 X 协议连接。

    {user:'*user_name*', host:'localhost', port:33065}
    
  • 在本地服务器实例上监听端口 3333 的经典 MySQL 协议连接。

    {user:'*user_name*', host:'localhost', port:3333}
    
  • 使用主机名、IPv4 地址和 IPv6 地址的远程服务器实例的 X 协议连接。

    {user:'*user_name*', host:'server.example.com'}
    {user:'*user_name*', host:198.51.100.14:123}
    {user:'*user_name*', host:[2001:db8:85a3:8d3:1319:8a2e:370:7348]}
    
  • 使用套接字的 X 协议连接。

    {user:'*user_name*', socket:'*/path/to/socket/file*'}
    
  • 可以指定一个可选的模式,代表一个数据库。

    {user:'*user_name*', host:'localhost', schema:'world'}
    

前面的示例假定连接需要密码。对于交互式客户端,在登录提示符处会请求指定用户的密码。如果用户帐户没有密码(这是不安全且不推荐的),或者正在使用套接字对等凭据验证(例如,使用 Unix 套接字连接),则必须明确指定不提供密码且不需要密码提示。为此,在password键后面使用''提供一个空字符串。例如:

{user:'*user_name*', password:'', host:'localhost'}

6.2.6 使用 DNS SRV 记录连接服务器

原文:dev.mysql.com/doc/refman/8.0/en/connecting-using-dns-srv.html

在域名系统(DNS)中,SRV 记录(服务位置记录)是一种资源记录类型,使客户端能够指定指示服务、协议和域的名称。对名称进行 DNS 查找会返回一个包含提供所需服务的域中多个可用服务器名称的回复。有关 DNS SRV 的信息,包括记录如何定义列出服务器的优先顺序,请参阅 RFC 2782

MySQL 支持使用 DNS SRV 记录连接服务器。接收到 DNS SRV 查找结果的客户端会尝试按照 DNS 管理员为每个主机分配的优先级和权重的顺序连接到 MySQL 服务器。仅当客户端无法连接到任何服务器时才会发生连接失败。

当多个 MySQL 实例(例如服务器集群)为您的应用程序提供相同的服务时,DNS SRV 记录可用于帮助故障转移、负载平衡和复制服务。对于应用程序直接管理连接尝试的候选服务器集合来说是繁琐的,DNS SRV 记录提供了一种替代方案:

  • DNS SRV 记录使 DNS 管理员能够将单个 DNS 域映射到多个服务器。当服务器被添加或从配置中移除,或者它们的主机名发生更改时,DNS SRV 记录也可以由管理员在中心位置进行更新。

  • 集中管理 DNS SRV 记录消除了个别客户端在连接请求中识别每个可能主机的需求,或者连接由额外的软件组件处理的需求。应用程序可以使用 DNS SRV 记录获取关于候选 MySQL 服务器的信息,而不是自行管理服务器信息。

  • DNS SRV 记录可以与连接池结合使用,这种情况下,当不再在当前 DNS SRV 记录列表中的主机变得空闲时,连接将从池中移除。

MySQL 支持在以下情境中使用 DNS SRV 记录连接服务器:

  • 几个 MySQL 连接器实现了 DNS SRV 支持;连接器特定选项使得可以请求 DNS SRV 记录查找,无论是用于 X 协议连接还是经典的 MySQL 协议连接。有关一般信息,请参阅 使用 DNS SRV 记录连接。有关详细信息,请参阅各个 MySQL 连接器的文档。

  • C API 提供了一个mysql_real_connect_dns_srv()函数,类似于mysql_real_connect(),不同之处在于参数列表不指定要连接到的 MySQL 服务器的特定主机。而是指定一个指定一组服务器的 DNS SRV 记录。参见 mysql_real_connect_dns_srv()。

  • mysql客户端具有一个--dns-srv-name选项,用于指示指定一组服务器的 DNS SRV 记录。参见 Section 6.5.1, “mysql — The MySQL Command-Line Client”。

DNS SRV 名称由服务、协议和域组成,其中服务和协议分别以下划线为前缀:

_*service*._*protocol*.*domain*

以下 DNS SRV 记录标识了多个候选服务器,例如客户端用于建立 X 协议连接:

Name                      TTL   Class  Priority Weight Port  Target
_mysqlx._tcp.example.com. 86400 IN SRV 0        5      33060 server1.example.com.
_mysqlx._tcp.example.com. 86400 IN SRV 0        10     33060 server2.example.com.
_mysqlx._tcp.example.com. 86400 IN SRV 10       5      33060 server3.example.com.
_mysqlx._tcp.example.com. 86400 IN SRV 20       5      33060 server4.example.com.

在这里,mysqlx表示 X 协议服务,tcp表示 TCP 协议。客户端可以使用名称_mysqlx._tcp.example.com请求此 DNS SRV 记录。指定连接请求中的名称的特定语法取决于客户端类型。例如,客户端可能支持在类似 URI 的连接字符串中指定名称或作为键值对。

经典协议连接的 DNS SRV 记录可能如下所示:

Name                     TTL   Class  Priority Weight  Port Target
_mysql._tcp.example.com. 86400 IN SRV 0        5       3306 server1.example.com.
_mysql._tcp.example.com. 86400 IN SRV 0        10      3306 server2.example.com.
_mysql._tcp.example.com. 86400 IN SRV 10       5       3306 server3.example.com.
_mysql._tcp.example.com. 86400 IN SRV 20       5       3306 server4.example.com.

在这里,名称mysql指定了经典 MySQL 协议服务,端口为 3306(默认经典 MySQL 协议端口),而不是 33060(默认 X 协议端口)。

使用 DNS SRV 记录查找时,客户端通常必须遵循这些连接请求规则(可能存在客户端或连接器特定的例外情况):

  • 请求必须指定完整的 DNS SRV 记录名称,服务和协议名称前缀为下划线。

  • 请求不能指定多个主机名。

  • 请求不能指定端口号。

  • 仅支持 TCP 连接。不能使用 Unix 套接字文件、Windows 命名管道和共享内存。

有关在 X DevAPI 中使用基于 DNS SRV 的连接的更多信息,请参见使用 DNS SRV 记录进行连接。

6.2.7 连接传输协议

原文:dev.mysql.com/doc/refman/8.0/en/transport-protocols.html

对于使用 MySQL 客户端库的程序(例如,mysqlmysqldump),MySQL 支持基于几种传输协议与服务器建立连接:TCP/IP、Unix 套接字文件、命名管道和共享内存。本节描述了如何选择这些协议,以及它们之间的相似性和差异。

  • 传输协议选择

  • 本地和远程连接的传输支持

  • localhost 的解释

  • 加密和安全特性

  • 连接压缩

传输协议选择

对于给定的连接,如果未明确指定传输协议,则将隐式确定。例如,在 Unix 和类 Unix 系统上,对localhost的连接将导致套接字文件连接,否则将导致与127.0.0.1的 TCP/IP 连接。有关更多信息,请参阅第 6.2.4 节,“使用命令选项连接到 MySQL 服务器”。

要明确指定协议,请使用--protocol 命令选项。以下表格显示了--protocol 的可接受值,并指示每个值适用的平台。这些值不区分大小写。

--protocol 使用的传输协议 适用平台
TCP TCP/IP 所有
SOCKET Unix 套接字文件 Unix 和类 Unix 系统
PIPE 命名管道 Windows
MEMORY 共享内存 Windows

本地和远程连接的传输支持

TCP/IP 传输支持连接到本地或远程 MySQL 服务器。

套接字文件、命名管道和共享内存传输仅支持连接到本地 MySQL 服务器。 (命名管道传输允许远程连接,但 MySQL 中尚未实现此功能。)

localhost 的解释

如果未明确指定传输协议,则localhost将被解释如下:

  • 在 Unix 和类 Unix 系统上,对localhost的连接将导致套接字文件连接。

  • 否则,对localhost的连接将导致与127.0.0.1建立 TCP/IP 连接。

如果传输协议被明确指定,localhost 将根据该协议进行解释。例如,使用 --protocol=TCP,对 localhost 的连接在所有平台上都会导致与 127.0.0.1 的 TCP/IP 连接。

加密和安全特性

TCP/IP 和套接字文件传输受到 TLS/SSL 加密的影响,使用 加密连接的命令选项 中描述的选项。命名管道和共享内存传输不受 TLS/SSL 加密的影响。

如果通过默认安全的传输协议进行连接,则连接默认是安全的。否则,对于受 TLS/SSL 加密影响的协议,可以使用加密使连接变得安全:

  • TCP/IP 连接默认不安全,但可以进行加密以使其安全。

  • 套接字文件连接默认是安全的。它们也可以进行加密,但加密套接字文件连接并不会使其更安全,反而会增加 CPU 负载。

  • 命名管道连接默认不安全,并且不受加密的影响以使其安全。然而,named_pipe_full_access_group 系统变量可用于控制哪些 MySQL 用户被允许使用命名管道连接。

  • 共享内存连接默认是安全的。

如果启用了 require_secure_transport 系统变量,则服务器只允许使用某种形式的安全传输的连接。根据前述说明,使用 TLS/SSL 加密的 TCP/IP 连接、套接字文件或共享内存的连接是安全的连接。未使用 TLS/SSL 加密的 TCP/IP 连接和命名管道连接不安全。

另请参见 将加密连接配置为强制性。

连接压缩

所有传输协议都受到在客户端和服务器之间的流量上使用压缩的影响。如果对于给定连接同时使用了压缩和加密,压缩会在加密之前进行。更多信息,请参见 6.2.8 节,“连接压缩控制”。

6.2.8 连接压缩控制

原文:dev.mysql.com/doc/refman/8.0/en/connection-compression-control.html

与服务器的连接可以在客户端和服务器之间的流量上使用压缩,以减少连接发送的字节数。默认情况下,连接是未压缩的,但如果服务器和客户端就一个相互允许的压缩算法达成一致,则可以进行压缩。

压缩连接起源于客户端,但会影响客户端和服务器双方的 CPU 负载,因为双方都会执行压缩和解压操作。由于启用压缩会降低性能,其好处主要体现在网络带宽较低、网络传输时间主导压缩和解压操作成本、结果集较大的情况下。

本节描述了可用的压缩控制配置参数以及用于监视压缩使用的信息来源。适用于经典的 MySQL 协议连接。

压缩控制适用于客户端程序连接到服务器以及参与源/副本复制或组复制的服务器之间的连接。压缩控制不适用于 FEDERATED 表的连接。在以下讨论中,“客户端连接”是指从任何支持压缩的源发起的连接到服务器的连接,除非上下文指示特定的连接类型。

注意

MySQL 8.0.19 开始,X 协议连接到 MySQL 服务器实例支持压缩,但 X 协议连接的压缩与此处描述的经典 MySQL 协议连接的压缩独立操作,并且受到单独控制。有关 X 协议连接压缩的信息,请参见 第 22.5.5 节,“使用 X 插件进行连接压缩”。

  • 配置连接压缩

  • 配置传统连接压缩

  • 监视连接压缩

配置连接压缩

从 MySQL 8.0.18 开始,可以使用以下配置参数来控制连接压缩:

  • protocol_compression_algorithms 系统变量配置了服务器允许用于传入连接的压缩算法。

  • --compression-algorithms--zstd-compression-level 命令行选项配置了以下客户端程序所允许的压缩算法和zstd压缩级别:mysql, mysqladmin, mysqlbinlog, mysqlcheck, mysqldump, mysqlimport, mysqlpump, mysqlshow, mysqlslap, 和 mysqltest,以及 mysql_upgrade。从 MySQL 8.0.20 版本开始,MySQL Shell 也提供这些命令行选项。

  • mysql_options() 函数的 MYSQL_OPT_COMPRESSION_ALGORITHMSMYSQL_OPT_ZSTD_COMPRESSION_LEVEL 选项配置了使用 MySQL C API 的客户端程序所允许的压缩算法和zstd压缩级别。

  • CHANGE MASTER TO 语句的 MASTER_COMPRESSION_ALGORITHMSMASTER_ZSTD_COMPRESSION_LEVEL 选项配置了参与源/复制复制的副本服务器所允许的压缩算法和zstd压缩级别。从 MySQL 8.0.23 版本开始,使用 CHANGE REPLICATION SOURCE TO 语句和选项 SOURCE_COMPRESSION_ALGORITHMSSOURCE_ZSTD_COMPRESSION_LEVEL

  • group_replication_recovery_compression_algorithmsgroup_replication_recovery_zstd_compression_level 系统变量配置了在新成员加入组并连接到提供者时,Group Replication 恢复连接所允许的压缩算法和zstd压缩级别。

允许指定压缩算法的配置参数是字符串值,并接受一个或多个逗号分隔的压缩算法名称列表,顺序不限��可从以下项目中选择(不区分大小写):

  • zlib: 允许使用zlib压缩算法的连接。

  • zstd: 允许使用zstd压缩算法的连接。

  • uncompressed:允许未压缩的连接。

注意

因为uncompressed是一个可能已配置或未配置的算法名称,因此可以配置 MySQL 允许未压缩的连接。

示例:

  • 要配置服务器允许传入连接使用的压缩算法,请设置protocol_compression_algorithms系统变量。默认情况下,服务器允许所有可用算法。要在启动时明确配置该设置,请在服务器的my.cnf文件中使用以下行:

    [mysqld]
    protocol_compression_algorithms=zlib,zstd,uncompressed
    

    要在运行时设置和持久化protocol_compression_algorithms系统变量为该值,请使用以下语句:

    SET PERSIST protocol_compression_algorithms='zlib,zstd,uncompressed';
    

    SET PERSIST为运行中的 MySQL 实例设置一个值。它还保存该值,导致其在随后的服务器重新启动时保留。要更改运行中的 MySQL 实例的值,而不使其在随后的重新启动中保留,使用GLOBAL关键字而不是PERSIST。参见 Section 15.7.6.1, “SET Syntax for Variable Assignment”。

  • 要仅允许使用zstd压缩的传入连接,请在启动时像这样配置服务器:

    [mysqld]
    protocol_compression_algorithms=zstd
    

    或者,在运行时进行更改:

    SET PERSIST protocol_compression_algorithms='zstd';
    
  • 要允许mysql客户端发起zlibuncompressed连接,请这样调用它:

    mysql --compression-algorithms=zlib,uncompressed
    
  • 要配置副本使用zlibzstd连接连接到源,对于zstd连接使用压缩级别 7,请使用CHANGE REPLICATION SOURCE TO语句(从 MySQL 8.0.23 开始)或CHANGE MASTER TO语句(在 MySQL 8.0.23 之前):

    CHANGE REPLICATION SOURCE TO
      SOURCE_COMPRESSION_ALGORITHMS = 'zlib,zstd',
      SOURCE_ZSTD_COMPRESSION_LEVEL = 7;
    

    这假定replica_compressed_protocolslave_compressed_protocol系统变量已禁用,原因在配置传统连接压缩中有描述。

为了成功建立连接,连接的双方必须就一种互相允许的压缩算法达成一致。算法协商过程尝试使用zlib,然后是zstd,最后是uncompressed。如果双方找不到共同的算法,连接尝试将失败。

因为双方必须就压缩算法达成一致,而uncompressed是一个不一定被允许的算法值,所以回退到未压缩连接并不一定发生。例如,如果服务器配置为允许zstd,而客户端配置为允许zlib,uncompressed,则客户端根本无法连接。在这种情况下,双方没有共同的算法,因此连接尝试失败。

启用指定zstd压缩级别的配置参数采用从 1 到 22 的整数值,较大的值表示更高级别的压缩。默认的zstd压缩级别为 3。压缩级别设置对不使用zstd压缩的连接没有影响。

可配置的zstd压缩级别可在减少网络流量和增加 CPU 负载与增加网络流量和降低 CPU 负载之间进行选择。更高的压缩级别可以减少网络拥塞,但额外的 CPU 负载可能会降低服务器性能。

配置遗留连接压缩

在 MySQL 8.0.18 之前,这些配置参数可用于控制连接压缩:

  • 客户端程序支持--compress命令行选项,以指定与服务器的连接使用压缩。

  • 对于使用 MySQL C API 的程序,通过为mysql_options()函数启用MYSQL_OPT_COMPRESS选项,指定与服务器的连接使用压缩。

  • 对于源/副本复制,启用系统变量replica_compressed_protocol(从 MySQL 8.0.26 开始)或slave_compressed_protocol(在 MySQL 8.0.26 之前)指定副本连接到源的压缩使用。

在每种情况下,当指定使用压缩时,如果双方都允许,连接将使用zlib压缩算法,否则将回退到未压缩连接。

截至 MySQL 8.0.18,刚刚描述的压缩参数成为遗留参数,因为引入了用于更好控制连接压缩的其他压缩参数,详细信息请参阅配置连接压缩。一个例外是 MySQL Shell,在那里,--compress命令行选项仍然有效,并且可以用于请求压缩而不选择压缩算法。有关 MySQL Shell 的连接压缩控制信息,请参阅使用压缩连接。

旧压缩参数与新参数互动,并且它们的语义如下更改:

  • 遗留的--compress选项的含义取决于是否指定了--compression-algorithms

    • 当未指定--compression-algorithms时,--compress等同于指定一个客户端算法集为zlib,uncompressed

    • 当指定--compression-algorithms时,--compress等同于指定一个zlib算法集,完整的客户端算法集是zlib加上--compression-algorithms指定的算法的并集。例如,使用--compress--compression-algorithms=zlib,zstd,允许的算法集是zlib加上zlib,zstd;即,zlib,zstd。使用--compress--compression-algorithms=zstd,uncompressed,允许的算法集是zlib加上zstd,uncompressed;即,zlib,zstd,uncompressed

  • 对于mysql_options() C API 函数,遗留的MYSQL_OPT_COMPRESS选项和MYSQL_OPT_COMPRESSION_ALGORITHMS选项之间发生相同类型的交互。

  • 如果启用了replica_compressed_protocolslave_compressed_protocol系统变量,则优先于MASTER_COMPRESSION_ALGORITHMS,如果源和复制品都允许该算法,则连接到源使用zlib压缩。如果禁用了replica_compressed_protocolslave_compressed_protocol,则MASTER_COMPRESSION_ALGORITHMS的值适用。

注意

遗留的压缩控制参数自 MySQL 8.0.18 起已弃用;预计将在未来的 MySQL 版本中移除。

监控连接压缩

Compression状态变量为ONOFF,表示当前连接是否使用了压缩。

mysql客户端的\status命令显示一行,如果当前连接启用了压缩,则会显示Protocol: Compressed。如果该行不存在,则连接未压缩。

从 8.0.14 开始,MySQL Shell 的\status命令显示一个Compression:行,指示连接是否压缩,显示为DisabledEnabled

截至 MySQL 8.0.18,有以下额外的信息源可用于监视连接压缩:

  • 要监视客户端连接中使用的压缩情况,请使用Compression_algorithmCompression_level状态变量。对于当前连接,它们的值分别表示压缩算法和压缩级别。

  • 要确定服务器配置允许哪些压缩算法用于传入连接,请检查protocol_compression_algorithms系统变量。

  • 对于源/复制复制连接,配置的压缩算法和压缩级别可从多个来源获取:

    • 性能模式replication_connection_configuration表具有COMPRESSION_ALGORITHMSZSTD_COMPRESSION_LEVEL列。

    • mysql.slave_master_info系统表具有Master_compression_algorithmsMaster_zstd_compression_level列。如果存在master.info文件,则其中也包含这些值的行。

6.2.9 设置环境变量

原文:dev.mysql.com/doc/refman/8.0/en/setting-environment-variables.html

环境变量可以在命令提示符下设置以影响当前命令处理器的当前调用,或永久设置以影响将来的调用。要永久设置变量,可以将其设置在启动文件中或使用系统为此目的提供的界面。请查阅您的命令解释器的文档以获取具体细节。第 6.9 节,“环境变量”列出了影响 MySQL 程序操作的所有环境变量。

要为环境变量指定值,请使用适合您的命令处理器的语法。例如,在 Windows 上,您可以设置USER变量以指定您的 MySQL 帐户名。要这样做,请使用以下语法:

SET USER=*your_name*

Unix 上的语法取决于您的 shell。假设您想使用MYSQL_TCP_PORT变量指定 TCP/IP 端口号。典型的语法(例如对于shkshbashzsh等)如下:

MYSQL_TCP_PORT=3306
export MYSQL_TCP_PORT

第一个命令设置变量,export命令将变量导出到 shell 环境,使其值对 MySQL 和其他进程可访问。

对于cshtcsh,使用setenv使 shell 变量可用于环境:

setenv MYSQL_TCP_PORT 3306

设置环境变量的命令可以在命令提示符下立即生效,但设置仅在注销前有效。要使设置在每次登录时生效,请使用系统提供的界面或将适当的命令或命令放置在启动文件中,以便您的命令解释器每次启动时都会读取。

在 Windows 上,您可以使用系统控制面板(在高级选项下)设置环境变量。

在 Unix 上,典型的 shell 启动文件是.bashrc.bash_profile对于bash,或.tcshrc对于tcsh

假设您的 MySQL 程序安装在/usr/local/mysql/bin中,并且您希望轻松调用这些程序。为此,请将PATH环境变量的值设置为包含该目录。例如,如果您的 shell 是bash,请将以下行添加到您的.bashrc文件中:

PATH=${PATH}:/usr/local/mysql/bin

bash 对登录和非登录 shell 使用不同的启动文件,因此您可能希望为登录 shell 添加设置到.bashrc,而对于非登录 shell 添加到.bash_profile,以确保PATH被设置。

如果您的 shell 是tcsh,请将以下行添加到您的.tcshrc文件中:

setenv PATH ${PATH}:/usr/local/mysql/bin

如果您的家目录中不存在适当的启动文件,请使用文本编辑器创建它。

修改PATH设置后,在 Windows 上打开一个新的控制台窗口,或在 Unix 上重新登录,以使设置生效。

6.3 服务器和服务器启动程序

原文:dev.mysql.com/doc/refman/8.0/en/programs-server.html

6.3.1 mysqld — MySQL 服务器

6.3.2 mysqld_safe — MySQL 服务器启动脚本

6.3.3 mysql.server — MySQL 服务器启动脚本

6.3.4 mysqld_multi — 管理多个 MySQL 服务器

本节描述了mysqld,即 MySQL 服务器,以及用于启动服务器的几个程序。

6.3.1 mysqld — MySQL 服务器

原文:dev.mysql.com/doc/refman/8.0/en/mysqld.html

mysqld,也称为 MySQL 服务器,是一个单个多线程程序,它在 MySQL 安装中执行大部分工作。它不会生成其他进程。MySQL 服务器管理访问包含数据库和表的 MySQL 数据目录。数据目录也是其他信息(如日志文件和状态文件)的默认位置。

注意

一些安装包包含一个名为mysqld-debug的服务器调试版本。为了获得调试支持、内存分配检查和跟踪文件支持,请调用此版本(请参见第 7.9.1.2 节,“创建跟踪文件”),而不是mysqld

当 MySQL 服务器启动时,它会监听来自客户端程序的网络连接,并代表这些客户端管理对数据库的访问。

mysqld程序有许多可以在启动时指定的选项。要查看完整的选项列表,请运行以下命令:

mysqld --verbose --help

MySQL 服务器还有一组影响其运行的系统变量。系统变量可以在服务器启动时设置,并且其中许多可以在运行时更改以影响动态服务器重新配置。MySQL 服务器还有一组提供有关其运行情况的状态变量的状态变量。您可以监视这些状态变量以访问运行时性能特征。

对于 MySQL 服务器命令选项、系统变量和状态变量的完整描述,请参见第 7.1 节,“MySQL 服务器”。有关安装 MySQL 和设置初始配置的信息,请参见第二章,“安装 MySQL”。

6.3.2 mysqld_safe — MySQL 服务器启动脚本

原文:dev.mysql.com/doc/refman/8.0/en/mysqld-safe.html

mysqld_safe 是在 Unix 上启动 mysqld 服务器的推荐方式。mysqld_safe 添加了一些安全功能,例如在发生错误时重新启动服务器并将运行时信息记录到错误日志中。本节稍后将介绍错误日志的描述。

注意

对于某些 Linux 平台,从 RPM 或 Debian 软件包安装 MySQL 包括 systemd 支持以管理 MySQL 服务器的启动和关闭。在这些平台上,mysqld_safe 不会安装,因为这是不必要的。有关更多信息,请参见 Section 2.5.9, “使用 systemd 管理 MySQL 服务器”。

在使用 systemd 进行服务器管理的平台上不使用 mysqld_safe 的一个含义是,选项文件中使用 [mysqld_safe][safe_mysqld] 部分不受支持,可能导致意外行为。

mysqld_safe 尝试启动名为 mysqld 的可执行文件。要覆盖默认行为并明确指定要运行的服务器的名称,请在 mysqld_safe 中指定 --mysqld--mysqld-version 选项。您还可以使用 --ledir 指示 mysqld_safe 应该查找服务器的目录。

许多 mysqld_safe 的选项与 mysqld 的选项相同。请参阅 Section 7.1.7, “服务器命令选项”。

对于 mysqld_safe 不认识的选项,如果在命令行中指定,则传递给 mysqld,但如果在选项文件的 [mysqld_safe] 组中指定,则会被忽略。请参阅 Section 6.2.2.2, “使用选项文件”。

mysqld_safe 从选项文件的 [mysqld][server][mysqld_safe] 部分读取所有选项。例如,如果您指定了像这样的 [mysqld] 部分,mysqld_safe 将找到并使用 --log-error 选项:

[mysqld]
log-error=error.log

为了向后兼容,mysqld_safe 还会读取 [safe_mysqld] 部分,但为了保持最新,您应该将这些部分重命名为 [mysqld_safe]

mysqld_safe 接受命令行和选项文件中的选项,如下表所述。有关 MySQL 程序使用的选项文件的信息,请参见 6.2.2.2 使用选项文件。

表 6.7 mysqld_safe 选项

选项名称 描述
--basedir MySQL 安装目录的路径
--core-file-size mysqld 可以创建的核心文件大小
--datadir 数据目录的路径
--defaults-extra-file 除了通常的选项文件外,还读取指定的选项文件
--defaults-file 仅读取指定的选项文件
--help 显示帮助信息并退出
--ledir 服务器所在目录的路径
--log-error 将错误日志写入指定文件
--malloc-lib 用于 mysqld 的替代 malloc 库
--mysqld 要启动的服务器程序的名称(在 ledir 目录中)
--mysqld-safe-log-timestamps 用于日志记录的时间戳格式
--mysqld-version 服务器程序名称的后缀
--nice 使用 nice 程序设置服务器调度优先级
--no-defaults 不读取任何选项文件
--open-files-limit mysqld 可以打开的文件数
--pid-file 服务器进程 ID 文件的路径名
--plugin-dir 安装插件的目录
--port 用于监听 TCP/IP 连接的端口号
--skip-kill-mysqld 不尝试终止多余的 mysqld 进程
--skip-syslog 不将错误消息写入 syslog;使用错误日志文件
--socket 用于监听 Unix 套接字连接的套接字文件
--syslog 将错误消息写入 syslog
--syslog-tag 写入 syslog 的消息标签后缀
--timezone 将 TZ 时区环境变量设置为指定值
--user 以用户名user_name或数字用户 IDuser_id运行 mysqld
选项名称 描述
  • --help

    命令行格式 --help

    显示帮助消息并退出。

  • --basedir=*dir_name*

    命令行格式 --basedir=dir_name
    类型 目录名称

    MySQL 安装目录的路径。

  • --core-file-size=*size*

    命令行格式 --core-file-size=size
    类型 字符串

    mysqld应该能够创建的核心文件大小。选项值传递给ulimit -c

    注意

    innodb_buffer_pool_in_core_file变量可用于减小支持此功能的操作系统上核心文件的大小。有关更多信息,请参见第 17.8.3.7 节,“从核心文件中排除缓冲池页”。

  • --datadir=*dir_name*

    命令行格式 --datadir=dir_name
    类型 目录名称

    数据目录的路径。

  • --defaults-extra-file=*file_name*

    命令行格式 --defaults-extra-file=file_name
    类型 文件名

    除了通常的选项文件外,还读取此选项文件。如果文件不存在或无法访问,服务器将以错误退出。如果file_name不是绝对路径名,则将其解释为相对于当前目录。如果使用此选项,它必须是命令行上的第一个选项。

    有关此选项文件和其他选项文件选项的更多信息,请参见第 6.2.2.3 节,“影响选项文件处理的命令行选项”。

  • --defaults-file=*file_name*

    命令行格式 --defaults-file=file_name
    类型 文件名

    仅使用给定的选项文件。如果文件不存在或无法访问,服务器将以错误退出。如果file_name不是绝对路径名,则将其解释为相对于当前目录。如果使用此选项,它必须是命令行上的第一个选项。

    有关此选项和其他选项文件选项的更多信息,请参见第 6.2.2.3 节,“影响选项文件处理的命令行选项”。

  • --ledir=*dir_name*

    命令行格式 --ledir=dir_name
    类型 目录名

    如果mysqld_safe找不到服务器,请使用此选项指示服务器所在目录的路径名。

    此选项仅在命令行上接受,而不在选项文件中。在使用 systemd 的平台上,该值可以在MYSQLD_OPTS的值中指定。请参见第 2.5.9 节,“使用 systemd 管理 MySQL 服务器”。

  • --log-error=*file_name*

    命令行格式 --log-error=file_name
    类型 文件名

    将错误日志写入指定的文件。请参见第 7.4.2 节,“错误日志”。

  • --mysqld-safe-log-timestamps

    命令行格式 --mysqld-safe-log-timestamps=type
    类型 枚举
    默认值 utc
    有效值 system``hyphen``legacy

    此选项控制由mysqld_safe生成的日志输出中的时间戳格式。以下列表描述了允许的值。对于任何其他值,mysqld_safe会记录警告并使用UTC格式。

    • UTC, 协调世界时

      ISO 8601 UTC 格式(与服务器的--log_timestamps=UTC相同)。这是默认值。

    • SYSTEM, 系统

      ISO 8601 本地时间格式(与服务器的--log_timestamps=SYSTEM相同)。

    • HYPHEN, 连字符

      YY-MM-DD h:mm:ss 格式,如mysqld_safe用于 MySQL 5.6。

    • LEGACY, 传统

      YYMMDD hh:mm:ss 格式,如mysqld_safe在 MySQL 5.6 之前。

  • --malloc-lib=[*lib_name*]

    命令行格式 --malloc-lib=[lib-name]
    类型 字符串

    用于内存分配的库的名称,而不是系统的malloc()库。选项值必须是目录之一/usr/lib/usr/lib64/usr/lib/i386-linux-gnu/usr/lib/x86_64-linux-gnu

    --malloc-lib选项通过修改LD_PRELOAD环境值来影响动态链接,以便加载程序在运行时找到内存分配库:

    • 如果未提供该选项,或者提供的值为空(--malloc-lib=),则不会修改LD_PRELOAD,也不会尝试使用tcmalloc

    • 在 MySQL 8.0.21 之前,如果选项给定为--malloc-lib=tcmallocmysqld_safe将在/usr/lib中查找tcmalloc库。如果找到tmalloc,则将其路径名添加到mysqldLD_PRELOAD值的开头。如果未找到tcmallocmysqld_safe将因错误而中止。

      截至 MySQL 8.0.21,tcmalloc不是--malloc-lib选项的允许值。

    • 如果选项给定为--malloc-lib=*/path/to/some/library*,则该完整路径将添加到LD_PRELOAD值的开头。如果完整路径指向不存在或不可读文件,则mysqld_safe将因错误而中止。

    • 对于mysqld_safe添加路径名到LD_PRELOAD的情况,它将路径添加到变量已有值的开头。

    注意

    在使用 systemd 管理服务器的系统上,mysqld_safe不可用。相反,通过在/etc/sysconfig/mysql中设置LD_PRELOAD来指定分配库。

    Linux 用户可以通过将以下行添加到my.cnf文件,在任何已安装tcmalloc包的/usr/lib平台上使用libtcmalloc_minimal.so库:

    [mysqld_safe]
    malloc-lib=tcmalloc
    

    要使用特定的tcmalloc库,请指定其完整路径名。示例:

    [mysqld_safe]
    malloc-lib=/opt/lib/libtcmalloc_minimal.so
    
  • --mysqld=*prog_name*

    命令行格式 --mysqld=file_name
    类型 文件名

    你想要启动的服务器程序的名称(在ledir目录中)。如果你使用 MySQL 二进制发行版但数据目录在二进制发行版之外,则需要此选项。如果mysqld_safe找不到服务器,请使用--ledir选项指示服务器所在目录的路径名。

    此选项仅在命令行上接受,而不在选项文件中接受。在使用 systemd 的��台上,该值可以在MYSQLD_OPTS的值中指定。请参阅第 2.5.9 节,“使用 systemd 管理 MySQL 服务器”。

  • --mysqld-version=*suffix*

    命令行格式 --mysqld-version=suffix
    类型 字符串

    此选项类似于--mysqld选项,但您只需指定服务器程序名称的后缀。基本名称假定为mysqld。例如,如果您使用--mysqld-version=debugmysqld_safe将在ledir目录中启动mysqld-debug程序。如果--mysqld-version的参数为空,mysqld_safe将在ledir目录中使用mysqld

    此选项仅在命令行上接受,而不在选项文件中接受。在使用 systemd 的平台上,该值可以在MYSQLD_OPTS的值中指定。请参阅第 2.5.9 节,“使用 systemd 管理 MySQL 服务器”。

  • --nice=*priority*

    命令行格式 --nice=priority
    类型 数字

    使用nice程序将服务器的调度优先级设置为给定值。

  • --no-defaults

    命令行格式 --no-defaults
    类型 字符串

    不要读取任何选项文件。如果由于从选项文件中读取未知选项而导致程序启动失败,则可以使用--no-defaults来防止它们被读取。如果使用此选项,它必须是命令行上的第一个选项。

    有关此选项和其他选项文件选项的更多信息,请参见第 6.2.2.3 节,“影响选项文件处理的命令行选项”。

  • --open-files-limit=*count*

    命令行格式 --open-files-limit=count
    类型 字符串

    mysqld应该能够打开的文件数。选项值传递给ulimit -n

    注意

    你必须以root身份启动mysqld_safe才能使其正常运行。

  • --pid-file=*file_name*

    命令行格式 --pid-file=file_name
    类型 文件名

    mysqld应该用于其进程 ID 文件的路径名。

  • --plugin-dir=*dir_name*

    命令行格式 --plugin-dir=dir_name
    类型 目录名

    插件目录的路径名。

  • --port=*port_num*

    命令行格式 --port=number
    类型 数字

    服务器在监听 TCP/IP 连接时应该使用的端口号。端口号必须是 1024 或更高,除非服务器由root操作系统用户启动。

  • --skip-kill-mysqld

    命令行格式 --skip-kill-mysqld

    不要在启动时尝试终止无关的mysqld进程。此选项仅在 Linux 上有效。

  • --socket=*path*

    命令行格式 --socket=file_name
    类型 文件名

    服务器在监听本地连接时应该使用的 Unix 套接字文件。

  • --syslog, --skip-syslog

    命令行格�� --syslog
    已弃用
    命令行格式 --skip-syslog
    已弃用

    --syslog导致错误消息被发送到支持logger程序的syslog--skip-syslog抑制了syslog的使用;消息被写入错误日志文件。

    当使用syslog进行错误日志记录时,daemon.err设施/严重性用于所有日志消息。

    使用这些选项来控制mysqld的日志记录已经被弃用。要将错误日志输出写入系统日志,请使用第 7.4.2.8 节,“将错误日志记录到系统日志”中的说明。要控制设施,请使用服务器log_syslog_facility系统变量。

  • --syslog-tag=*tag*

    命令行格式 --syslog-tag=tag
    已弃用

    对于写入syslog的日志,来自mysqld_safemysqld的消息分别带有mysqld_safemysqld的标识符。要为这些标识符指定后缀,请使用--syslog-tag=*tag*,这将修改标识符为mysqld_safe-*tag*mysqld-*tag*

    使用这个选项来控制mysqld的日志记录已被弃用。请使用服务器的log_syslog_tag系统变量。参见 Section 7.4.2.8, “Error Logging to the System Log”.

  • --timezone=*timezone*

    命令行格式 --timezone=timezone
    类型 字符串

    TZ时区环境变量设置为给定的选项值。请查阅您的操作系统文档以获取合法的时区规范格式。

  • --user={*user_name*|*user_id*}

    命令行格式 --user={user_name&#124;user_id}
    类型 字符串
    类型 数值

    user_name或数字用户 ID user_id的名称运行mysqld服务器。(这里的“用户”指的是系统登录帐户,而不是在授权表中列出的 MySQL 用户。)

如果你使用--defaults-file--defaults-extra-file选项来执行mysqld_safe来命名一个选项文件,那么这个选项必须是命令行中给出的第一个选项,否则选项文件将不会被使用。例如,以下命令不会使用指定的选项文件:

mysql> mysqld_safe --port=*port_num* --defaults-file=*file_name*

相反,请使用以下命令:

mysql> mysqld_safe --defaults-file=*file_name* --port=*port_num*

mysqld_safe脚本被编写成通常可以启动从 MySQL 源或二进制发行版安装的服务器,即使这些类型的发行版通常会将服务器安装在略有不同的位置。(参见 Section 2.1.5, “Installation Layouts”.)mysqld_safe期望以下条件之一为真:

  • 服务器和数据库可以相对于工作目录(从中调用mysqld_safe的目录)找到。对于二进制发行版,mysqld_safe在其工作目录下查找bindata目录。对于源代码发行版,它查找libexecvar目录。如果您从 MySQL 安装目录(例如,对于二进制发行版为/usr/local/mysql)执行mysqld_safe,则应满足此条件。

  • 如果服务器和数据库无法相对于工作目录找到,mysqld_safe将尝试通过绝对路径名来定位它们。典型位置是/usr/local/libexec/usr/local/var。实际位置是根据构建时配置到发行版中的值确定的。如果 MySQL 安装在配置时指定的位置,则它们应该是正确的。

因为mysqld_safe试图相对于自己的工作目录找到服务器和数据库,所以您可以在任何地方安装 MySQL 的二进制发行版,只要您从 MySQL 安装目录运行mysqld_safe

cd *mysql_installation_directory*
bin/mysqld_safe &

如果mysqld_safe失败,即使从 MySQL 安装目录调用,也要指定--ledir--datadir选项,以指示服务器和数据库在系统中的位置。

mysqld_safe尝试使用sleepdate系统实用程序来确定每秒尝试启动的次数。如果这些实用程序存在,并且每秒尝试启动次数大于 5,mysqld_safe在再次启动之前等待 1 秒。这旨在防止在重复失败的情况下出现过多的 CPU 使用率。(Bug #11761530,Bug #54035)

当您使用mysqld_safe启动mysqld时,mysqld_safe会安排来自自身和mysqld的错误(和通知)消息发送到相同的目的地。

有几个用于控制这些消息目的地的mysqld_safe选项:

  • --log-error=*file_name*: 将错误消息写入指定的错误文件。

  • --syslog: 将错误消息写入支持logger程序的syslog系统。

  • --skip-syslog: 不将错误消息写入syslog。消息将被写入默认的错误日志文件(数据目录中的*host_name*.err),或者如果给定--log-error选项,则写入指定的文件。

如果没有给出这些选项中的任何一个,则默认为--skip-syslog

mysqld_safe写入消息时,通知会发送到日志目的地(syslog或错误日志文件)和stdout。错误会发送到日志目的地和stderr

注意

mysqld_safe控制mysqld日志记录已被弃用。请改用服务器的本机syslog支持。有关更多信息,请参见第 7.4.2.8 节,“将错误日志记录到系统日志”。

6.3.3 mysql.server — MySQL Server Startup Script

原文:dev.mysql.com/doc/refman/8.0/en/mysql-server.html

Unix 和类 Unix 系统上的 MySQL 发行版包含一个名为mysql.server的脚本,它使用mysqld_safe启动 MySQL 服务器。它可以在使用 System V 风格运行目录启动和停止系统服务的系统上使用,例如 Linux 和 Solaris。它还被 macOS 的 MySQL 启动项使用。

mysql.server是 MySQL 源代码树中使用的脚本名称。安装后的名称可能不同(例如,mysqldmysql)。在下面的讨论中,根据您的系统调整名称mysql.server

注意

对于某些 Linux 平台,从 RPM 或 Debian 软件包安装 MySQL 包括 systemd 支持以管理 MySQL 服务器的启动和关闭。在这些平台上,不安装mysql.servermysqld_safe,因为它们是不必要的。有关更多信息,请参见 Section 2.5.9, “使用 systemd 管理 MySQL 服务器”。

要手动启动或停止服务器,可以使用mysql.server脚本,在命令行中使用startstop参数调用它:

mysql.server start
mysql.server stop

mysql.server将位置更改为 MySQL 安装目录,然后调用mysqld_safe。要以某个特定用户身份运行服务器,请在全局/etc/my.cnf选项文件的[mysqld]组中添加适当的user选项,如本节后面所示。(如果您在非标准位置安装了 MySQL 的二进制发行版,则可能必须编辑mysql.server。修改它以在运行mysqld_safe之前将位置更改为正确的目录。如果这样做,您修改过的mysql.server版本可能会在将来升级 MySQL 时被覆盖;请制作一个您可以重新安装的编辑过的版本的副本。)

mysql.server stop 通过向服务器发送信号来停止服务器。你也可以通过执行mysqladmin shutdown来手动停止服务器。

要在服务器上自动启动和停止 MySQL,你必须在/etc/rc*文件的适当位置添加启动和停止命令:

  • 如果你使用 Linux 服务器 RPM 包(MySQL-server-*VERSION*.rpm),或者本机 Linux 包安装,mysql.server 脚本可能会安装在/etc/init.d目录中,名称为mysqldmysql。有关 Linux RPM 包的更多信息,请参阅第 2.5.4 节,“使用 Oracle 的 RPM 包在 Linux 上安装 MySQL”。

  • 如果你从源分发或使用不会自动安装mysql.server的二进制分发格式安装 MySQL,你可以手动安装该脚本。它可以在 MySQL 安装目录的support-files目录下或 MySQL 源代码树中找到。将脚本复制到/etc/init.d目录中,并命名为mysql,然后使其可执行:

    cp mysql.server /etc/init.d/mysql
    chmod +x /etc/init.d/mysql
    

    安装脚本后,激活它以在系统启动时运行所需的命令取决于你的操作系统。在 Linux 上,你可以使用 chkconfig

    chkconfig --add mysql
    

    在一些 Linux 系统上,似乎还需要以下命令才能完全启用mysql 脚本:

    chkconfig --level 345 mysql on
    
  • 在 FreeBSD 上,启动脚本通常应放在/usr/local/etc/rc.d/中。将mysql.server脚本安装为/usr/local/etc/rc.d/mysql.server.sh以启用自动启动。rc(8)手册页指出,此目录中的脚本仅在其基本名称与*.sh shell 文件名模式匹配时才会执行。目录中存在的任何其他文件或目录都会被静默忽略。

  • 作为前述设置的替代方案,一些操作系统还使用/etc/rc.local/etc/init.d/boot.local在启动时启动其他服务。要使用这种方法启动 MySQL,将类似以下命令附加到适当的启动文件中:

    /bin/sh -c 'cd /usr/local/mysql; ./bin/mysqld_safe --user=mysql &'
    
  • 对于其他系统,请查阅操作系统文档以了解如何安装启动脚本。

mysql.server 从选项文件的[mysql.server][mysqld]部分读取选项。为了向后兼容,它还会读取[mysql_server]部分,但为了保持最新,你应该将这些部分重命名为[mysql.server]

您可以在全局 /etc/my.cnf 文件中为 mysql.server 添加选项。典型的 my.cnf 文件可能如下所示:

[mysqld]
datadir=/usr/local/mysql/var
socket=/var/tmp/mysql.sock
port=3306
user=mysql

[mysql.server]
basedir=/usr/local/mysql

mysql.server 脚本支持以下表中显示的选项。如果指定,它们必须放在选项文件中,而不是在命令行上。mysql.server 仅支持 startstop 作为命令行参数。

表 6.8 mysql.server 选项文件选项

选项名称 描述 类型
basedir MySQL 安装目录的路径 目录名
datadir MySQL 数据目录的路径 目录名
pid-file 服务器应将其进程 ID 写入的文件 文件名
service-startup-timeout 等待服务器启动的时间 整数
  • basedir=*dir_name*

    MySQL 安装目录的路径。

  • datadir=*dir_name*

    MySQL 数据目录的路径。

  • pid-file=*file_name*

    服务器应将其进程 ID 写入的文件的路径名。除非给定绝对路径名以指定不同目录,否则服务器将在数据目录中创建该文件。

    如果未提供此选项,mysql.server 使用默认值 *host_name*.pid。传递给 mysqld_safe 的 PID 文件值会覆盖在 [mysqld_safe] 选项文件组中指定的任何值。因为 mysql.server 读取 [mysqld] 选项文件组而不是 [mysqld_safe] 组,您可以确保在从 mysql.server 调用时与手动调用时放置相同的 pid-file 设置在 [mysqld_safe][mysqld] 组中,以确保 mysqld_safe 获得相同的值。

  • service-startup-timeout=*seconds*

    等待服务器启动确认的秒数。如果服务器在此时间内未启动,mysql.server 将以错误退出。默认值为 900。值为 0 表示根本不等待启动。负值表示永远等待(无超时)。

6.3.4 mysqld_multi — 管理多个 MySQL 服务器

原文:dev.mysql.com/doc/refman/8.0/en/mysqld-multi.html

mysqld_multi旨在管理监听不同 Unix 套接字文件和 TCP/IP 端口上的连接的多个mysqld进程。它可以启动或停止服务器,或报告它们的当前状态。

注意

对于一些 Linux 平台,从 RPM 或 Debian 软件包安装 MySQL 包含 systemd 支持来管理 MySQL 服务器的启动和关闭。在这些平台上,因为不需要,所以不安装mysqld_multi。有关使用 systemd 处理多个 MySQL 实例的信息,请参阅 Section 2.5.9,“使用 systemd 管理 MySQL 服务器”。

mysqld_multimy.cnf(或由--defaults-file选项指定的文件)中搜索名为[mysqld*N*]的组。N可以是任何正整数。在以下讨论中,这个数字被称为选项组号,或GNR。组号将选项组彼此区分开,并用作传递给mysqld_multi的参数,以指定要启动、停止或获取状态报告的服务器。在这些组中列出的选项与用于启动mysqld[mysqld]组中使用的选项相同。(例如,参见 Section 2.9.5,“自动启动和停止 MySQL”。)但是,在使用多个服务器时,每个服务器必须使用自己的值来设置选项,例如 Unix 套接字文件和 TCP/IP 端口号。有关在多服务器环境中哪些选项必须对每个服务器唯一的更多信息,请参阅 Section 7.8,“在一台机器上运行多个 MySQL 实例”。

要调用mysqld_multi,请使用以下语法:

mysqld_multi [*options*] {start|stop|reload|report} [*GNR*[,*GNR*] ...]

startstopreload(停止和重新启动)和report表示要执行的操作。您可以根据接下来的GNR列表为单个服务器或多个服务器执行指定的操作。如果没有列表,mysqld_multi将为选项文件中的所有服务器执行操作。

每个GNR值代表一个选项组编号或一组组编号。该值应为选项文件中组名称末尾的数字。例如,名为[mysqld17]的组的GNR17。要指定一系列数字,请用短横线分隔第一个和最后一个数字。GNR10-13代表组[mysqld10][mysqld13]。可以在命令行上指定多个组或组范围,用逗号分隔。GNR列表中不能有空白字符(空格或制表符);空白字符后的任何内容都将被忽略。

此命令启动单个服务器,使用选项组[mysqld17]

mysqld_multi start 17

此命令停止多个服务器,使用选项组[mysqld8][mysqld10][mysqld13]

mysqld_multi stop 8,10-13

要了解如何设置选项文件的示例,请使用此命令:

mysqld_multi --example

mysqld_multi按以下方式搜索选项文件:

  • 使用--no-defaults,不会读取任何选项文件。

    命令行格式 --no-defaults
    类型 布尔值
    默认值 false
  • 使用--defaults-file=*file_name*,只读取指定的文件。

    命令行格式 --defaults-file=filename
    类型 文件名
    默认值 [none]
  • 否则,将读取标准位置列表中的选项文件,包括由--defaults-extra-file=*file_name*选项指定的任何文件。(如果该选项多次给出,则使用最后一个值。)

    命令行格式 --defaults-extra-file=filename
    类型 文件名
    默认值 [none]

有关这些和其他选项文件选项的更多信息,请参阅第 6.2.2.3 节,“影响选项文件处理的命令行选项”。

读取的选项文件将搜索[mysqld_multi][mysqld*N*]选项组。[mysqld_multi]组可用于为mysqld_multi本身设置选项。[mysqld*N*]组可用于传递给特定mysqld实例的选项。

[mysqld][mysqld_safe]组可用于所有mysqldmysqld_safe实例共同读取的常见选项。您可以指定一个--defaults-file=*file_name*选项,以使用不同的配置文件来为该实例设置选项,在这种情况下,该文件中的[mysqld][mysqld_safe]组将用于该实例。

mysqld_multi支持以下选项。

  • --help

    命令行格式 --help
    类型 布尔值
    默认值 false

    显示帮助消息并退出。

  • --example

    命令行格式 --example
    类型 布尔值
    默认值 false

    显示一个示例选项文件。

  • --log=*file_name*

    命令行格式 --log=path
    类型 文件名
    默认值 /var/log/mysqld_multi.log

    指定日志文件的名称。如果文件存在,则日志输出将附加到其中。

  • --mysqladmin=*prog_name*

    命令行格式 --mysqladmin=file
    类型 文件名
    默认值 [none]

    要用于停止服务器的mysqladmin二进制文件。

  • --mysqld=*prog_name*

    命令行格式 --mysqld=file
    类型 文件名
    默认值 [none]

    要使用的mysqld二进制文件。请注意,您还可以指定mysqld_safe作为此选项的值。如果您使用mysqld_safe启动服务器,您可以在相应的[mysqld*N*]选项组中包含mysqldledir选项。这些选项指示mysqld_safe应启动的服务器名称以及服务器所在目录的路径名。(请参阅第 6.3.2 节,“mysqld_safe — MySQL 服务器启动脚本”中这些选项的描述。)示例:

    [mysqld38]
    mysqld = mysqld-debug
    ledir  = /opt/local/mysql/libexec
    
  • --no-log

    命令行格式 --no-log
    类型 布尔值
    默认值 false

    将日志信息打印到stdout而不是日志文件。默认情况下,输出会写入日志文件。

  • --password=*password*

    命令行格式 --password=string
    类型 字符串
    默认值 [none]

    用于调用mysqladmin时要使用的 MySQL 帐户的密码。请注意,与其他 MySQL 程序不同,此选项的密码值是必需的。

  • --silent

    命令行格式 --silent
    类型 布尔值
    默认值 false

    静默模式;禁用警告。

  • --tcp-ip

    命令行格式 --tcp-ip
    类型 布尔值
    默认值 false

    通过 TCP/IP 端口连接到每个 MySQL 服务器,而不是通过 Unix 套接字文件。 (如果套接字文件丢失,则服务器可能仍在运行,但只能通过 TCP/IP 端口访问。)默认情况下,连接是使用 Unix 套接字文件进行的。此选项会影响stopreport操作。

  • --user=*user_name*

    命令行格式 --user=name
    类型 字符串
    默认值 root

    在调用mysqladmin时要使用的 MySQL 帐户的用户名。

  • --verbose

    命令行格式 --verbose
    类型 布尔值
    默认值 false

    更加详细。

  • --version

    命令行格式 --version
    类型 布尔值
    默认值 false

    显示版本信息并退出。

有关mysqld_multi的一些注意事项:

  • 最重要的事项:在使用mysqld_multi之前,请确保您理解传递给mysqld服务器的选项的含义以及为什么您希望拥有单独的mysqld进程。注意使用具有相同数据目录的多个mysqld服务器的危险。除非你知道你在做什么,否则请使用单独的数据目录。在线程系统中,使用具有相同数据目录的多个服务器并不会提供额外的性能。参见 Section 7.8, “Running Multiple MySQL Instances on One Machine”。

    重要提示

    确保每个服务器的数据目录对于启动特定mysqld进程的 Unix 帐户是完全可访问的。不要使用 Unix 的 root 帐户进行此操作,除非你知道你在做什么。参见 Section 8.1.5, “How to Run MySQL as a Normal User”。

  • 确保用于停止mysqld服务器(使用mysqladmin程序)的 MySQL 帐户对于每个服务器都具有相同的用户名和密码。此外,请确保该帐户具有SHUTDOWN权限。如果您要管理的服务器具有不同的管理帐户的用户名或密码,您可能希望在每个服务器上创建一个具有相同用户名和密码的帐户。例如,您可以通过为每个服务器执行以下命令来设置一个共同的multi_admin帐户:

    $> mysql -u root -S /tmp/mysql.sock -p
    Enter password:
    mysql> CREATE USER 'multi_admin'@'localhost' IDENTIFIED BY 'multipass';
    mysql> GRANT SHUTDOWN ON *.* TO 'multi_admin'@'localhost';
    

    参见第 8.2 节“访问控制和帐户管理”。您必须为每个mysqld服务器执行此操作。在连接到每个服务器时,请适当更改连接参数。请注意,帐户名的主机名部分必须允许您从要运行mysqld_multi的主机连接为multi_admin

  • Unix 套接字文件和 TCP/IP 端口号必须对于每个mysqld都不同。(或者,如果主机有多个网络地址,您可以设置bind_address系统变量,使不同的服务器监听不同的接口。)

  • 如果您使用mysqld_safe启动mysqld(例如,--mysqld=mysqld_safe),那么--pid-file选项非常重要。每个mysqld都应该有自己的进程 ID 文件。使用mysqld_safe而不是mysqld的优势在于,mysqld_safe监视其mysqld进程,并在进程因使用kill -9发送信号或由于其他原因(如分段错误)终止时重新启动它。

  • 您可能想要为mysqld使用--user选项,但要这样做,您需要以 Unix 超级用户(root)身份运行mysqld_multi脚本。在选项文件中有这个选项并不重要;如果您不是超级用户并且mysqld进程在您自己的 Unix 帐户下启动,您只会收到警告。

以下示例显示了如何为与mysqld_multi一起使用的选项文件进行设置。mysqld程序启动或停止的顺序取决于它们在选项文件中出现的顺序。组号不需要形成连续的序列。示例中故意省略了第一个和第五个[mysqld*N*]组,以说明选项文件中可以有“间隙”。这样可以提供更多的灵活性。

# This is an example of a my.cnf file for mysqld_multi.
# Usually this file is located in home dir ~/.my.cnf or /etc/my.cnf

[mysqld_multi]
mysqld     = /usr/local/mysql/bin/mysqld_safe
mysqladmin = /usr/local/mysql/bin/mysqladmin
user       = multi_admin
password   = my_password

[mysqld2]
socket     = /tmp/mysql.sock2
port       = 3307
pid-file   = /usr/local/mysql/data2/hostname.pid2
datadir    = /usr/local/mysql/data2
language   = /usr/local/mysql/share/mysql/english
user       = unix_user1

[mysqld3]
mysqld     = /path/to/mysqld_safe
ledir      = /path/to/mysqld-binary/
mysqladmin = /path/to/mysqladmin
socket     = /tmp/mysql.sock3
port       = 3308
pid-file   = /usr/local/mysql/data3/hostname.pid3
datadir    = /usr/local/mysql/data3
language   = /usr/local/mysql/share/mysql/swedish
user       = unix_user2

[mysqld4]
socket     = /tmp/mysql.sock4
port       = 3309
pid-file   = /usr/local/mysql/data4/hostname.pid4
datadir    = /usr/local/mysql/data4
language   = /usr/local/mysql/share/mysql/estonia
user       = unix_user3

[mysqld6]
socket     = /tmp/mysql.sock6
port       = 3311
pid-file   = /usr/local/mysql/data6/hostname.pid6
datadir    = /usr/local/mysql/data6
language   = /usr/local/mysql/share/mysql/japanese
user       = unix_user4

参见第 6.2.2.2 节,“使用选项文件”。

6.4 与安装相关的程序

原文:dev.mysql.com/doc/refman/8.0/en/programs-installation.html

6.4.1 comp_err — 编译 MySQL 错误消息文件

6.4.2 mysql_secure_installation — 提高 MySQL 安装安全性

6.4.3 mysql_ssl_rsa_setup — 创建 SSL/RSA 文件

6.4.4 mysql_tzinfo_to_sql — 加载时区表

6.4.5 mysql_upgrade — 检查并升级 MySQL 表

本节中的程序用于安装或升级 MySQL。

6.4.1 comp_err — 编译 MySQL 错误消息文件

原文:dev.mysql.com/doc/refman/8.0/en/comp-err.html

comp_err 创建了 errmsg.sys 文件,该文件被 mysqld 用来确定不同错误代码的错误消息显示。comp_err 通常在构建 MySQL 时会自动运行。它从 MySQL 源代码分发中的文本格式错误信息编译 errmsg.sys 文件:

  • 截至 MySQL 8.0.19,错误信息来自 share 目录中的 messages_to_error_log.txtmessages_to_clients.txt 文件。

    要了解更多关于定义错误消息的信息,请参阅这些文件中的注释,以及 errmsg_readme.txt 文件。

  • 在 MySQL 8.0.19 之前,错误信息来自 sql/share 目录中的 errmsg-utf8.txt 文件。

comp_err 还生成 mysqld_error.hmysqld_ername.hmysqld_errmsg.h 头文件。

调用 comp_err 如下:

comp_err [*options*]

comp_err 支持以下选项。

  • --help, -?

    命令行格式 --help
    类型 布尔
    默认值 false

    显示帮助消息并退出。

  • --charset=*dir_name*, -C *dir_name*

    命令行格式 --charset
    类型 字符串
    默认值 ../share/charsets

    字符集目录。默认为 ../sql/share/charsets

  • --debug=*debug_options*, -# *debug_options*

    命令行格式 --debug=options
    类型 字符串
    默认值 d:t:O,/tmp/comp_err.trace

    写入调试日志。典型的 debug_options 字符串是 d:t:O,*file_name*。默认为 d:t:O,/tmp/comp_err.trace

  • --debug-info, -T

    命令行格式 --debug-info
    类型 布尔
    默认值 false

    程序退出时打印一些调试信息。

  • --errmsg-file=*file_name*, -H *file_name*

    命令行格式 --errmsg-file=name
    类型 文件名
    默认值 mysqld_errmsg.h

    错误消息文件的名称。默认为 mysqld_errmsg.h。此选项在 MySQL 8.0.18 中添加。

  • --header-file=*file_name*, -H *file_name*

    命令行格式 --header-file=name
    类型 文件名
    默认值 mysqld_error.h

    错误头文件的名称。默认为 mysqld_error.h

  • --in-file=*file_name*, -F *file_name*

    命令行格式 --in-file=path
    类型 文件名
    默认值 [none]

    输入文件的名称。默认值为 ../share/errmsg-utf8.txt

    此选项在 MySQL 8.0.19 中被移除,并由 --in-file-errlog--in-file-toclient 选项替代。

  • --in-file-errlog=*file_name*, -e *file_name*

    命令行格式 --in-file-errlog
    类型 文件名
    默认值 ../share/messages_to_error_log.txt

    定义要写入错误日志的错误消息的输入文件名。默认值为 ../share/messages_to_error_log.txt

    此选项在 MySQL 8.0.19 中添加。

  • --in-file-toclient=*file_name*, -c *file_name*

    命令行格式 --in-file-toclient=path
    类型 文件名
    默认值 ../share/messages_to_clients.txt

    定义要写入客户端的错误消息的输入文件名。默认值为 ../share/messages_to_clients.txt

    此选项在 MySQL 8.0.19 中添加。

  • --name-file=*file_name*, -N *file_name*

    命令行格式 --name-file=name
    类型 文件名
    默认值 mysqld_ername.h

    错误名称文件的名称。默认值为 mysqld_ername.h

  • --out-dir=*dir_name*, -D *dir_name*

    命令行格式 --out-dir=path
    类型 字符串
    默认值 ../share/

    输出基本目录的名称。默认值为 ../sql/share/

  • --out-file=*file_name*, -O *file_name*

    命令行格式 --out-file=name
    类型 文件名
    默认值 errmsg.sys

    输出文件的名称。默认值为 errmsg.sys

  • --version, -V

    命令行格式 --version
    类型 布尔值
    默认值 false

    显示版本信息并退出。

6.4.2 mysql_secure_installation — 改善 MySQL 安装安全性

译文:dev.mysql.com/doc/refman/8.0/en/mysql-secure-installation.html

该程序使您能够通过以下方式改善 MySQL 安装的安全性:

  • 您可以为root帐户设置密码。

  • 您可以删除可以从本地主机外部访问的root帐户。

  • 您可以删除匿名用户帐户。

  • 您可以删除test数据库(默认情况下可以被所有用户访问,甚至是匿名用户),以及允许任何人访问以test_开头的数据库的权限。

mysql_secure_installation帮助您实施类似于第 2.9.4 节“保护初始 MySQL 帐户”中描述的安全建议。

正常使用是连接到本地 MySQL 服务器;无参数调用mysql_secure_installation

mysql_secure_installation

当执行时,mysql_secure_installation会提示您确定要执行哪些操作。

validate_password组件可用于检查密码强度。如果未安装插件,mysql_secure_installation会提示用户是否安装。稍后输入的任何密码如果启用插件,则会使用插件进行检查。

大多数常见的 MySQL 客户端选项,如--host--port可以在命令行和选项文件中使用。例如,要连接到本地服务器的 IPv6 端口 3307,请使用以下命令:

mysql_secure_installation --host=::1 --port=3307

mysql_secure_installation支持以下选项,可以在命令行或选项文件的[mysql_secure_installation][client]组中指定。有关 MySQL 程序使用的选项文件的信息,请参见第 6.2.2.2 节“使用选项文件”。

表 6.9 mysql_secure_installation 选项

选项名称 描述 引入 废弃
--defaults-extra-file 读取指定的选项文件以及通常的选项文件
--defaults-file 仅读取指定的选项文件
--defaults-group-suffix 选项组后缀值
--help 显示帮助信息并退出
--host MySQL 服务器所在的主机
--no-defaults 不读取任何选项文件
--password 被接受但始终被忽略。每当调用 mysql_secure_installation 时,用户都会被提示输入密码
--port 连接的 TCP/IP 端口号
--print-defaults 打印默认选项
--protocol 要使用的传输协议
--socket 要使用的 Unix 套接字文件或 Windows 命名管道
--ssl-ca 包含受信任的 SSL 证书颁发机构列表的文件
--ssl-capath 包含受信任的 SSL 证书颁发机构证书文件的目录
--ssl-cert 包含 X.509 证书的文件
--ssl-cipher 连接加密的允许密码
--ssl-crl 包含证书吊销列表的文件
--ssl-crlpath 包含证书吊销列表文件的目录
--ssl-fips-mode 是否在客户端启用 FIPS 模式 8.0.34
--ssl-key 包含 X.509 密钥的文件
--ssl-mode 与服务器连接的期望安全状态
--ssl-session-data 包含 SSL 会话数据的文件 8.0.29
--ssl-session-data-continue-on-failed-reuse 是否在会话重用失败时建立连接 8.0.29
--tls-ciphersuites 用于加密连接的允许的 TLSv1.3 密码套件 8.0.16
--tls-version 用于加密连接的允许的 TLS 协议
--use-default 无需用户交互执行
--user 连接到服务器时要使用的 MySQL 用户名
选项名称 描述 引入 废弃
  • --help, -?

    命令行格式 --help

    显示帮助消息并退出。

  • --defaults-extra-file=*file_name*

    命令行格式 --defaults-extra-file=file_name
    类型 文件名

    在全局选项文件之后但(在 Unix 上)在用户选项文件之前读取此选项文件。如果文件不存在或无法访问,将会出现错误。如果file_name不是绝对路径名,则将其解释为相对于当前目录的路径。

    有关此选项和其他选项文件选项的更多信息,请参见第 6.2.2.3 节,“影响选项文件处理的命令行选项”。

  • --defaults-file=*file_name*

    命令行格式 --defaults-file=file_name
    类型 文件名

    仅使用给定的选项文件。如果文件不存在或无法访问,将会出现错误。如果file_name不是绝对路径名,则将其解释为相对于当前目录的路径。

    有关此选项和其他选项文件选项的更多信息,请参见第 6.2.2.3 节,“影响选项文件处理的命令行选项”。

  • --defaults-group-suffix=*str*

    命令行格式 --defaults-group-suffix=str
    类型 字符串

    不仅读取通常的选项组,还读取具有通常名称和后缀str的组。例如,mysql_secure_installation通常会读取[client][mysql_secure_installation]组。如果将此选项指定为--defaults-group-suffix=_othermysql_secure_installation还会读取[client_other][mysql_secure_installation_other]组。

    有关此选项和其他选项文件选项的更多信息,请参见第 6.2.2.3 节,“影响选项文件处理的命令行选项”。

  • --host=*host_name*, -h *host_name*

    命令行格式 --host

    连接到给定主机上的 MySQL 服务器。

  • --no-defaults

    命令行格式 --no-defaults

    不要读取任何选项文件。如果由于从选项文件中读取未知选项而导致程序启动失败,可以使用--no-defaults来防止读取它们。

    例外情况是,无论何时都会读取.mylogin.cnf文件(如果存在)。即使使用--no-defaults,这允许以比在命令行上更安全的方式指定密码。要创建.mylogin.cnf,请使用mysql_config_editor实用程序。请参见第 6.6.7 节,“mysql_config_editor — MySQL 配置实用程序”。

    有关此选项和其他选项文件选项的更多信息,请参见第 6.2.2.3 节,“影响选项文件处理的命令行选项”。

  • --password=*password*, -p *password*

    命令行格式 --password=password
    类型 字符串
    默认值 [none]

    此选项被接受但被忽略。无论是否使用此选项,mysql_secure_installation始终提示用户输入密码。

  • --port=*port_num*, -P *port_num*

    命令行格式 --port=port_num
    类型 数值
    默认值 3306

    对于 TCP/IP 连接,要使用的端口号。

  • --print-defaults

    命令行格式 --print-defaults

    打印程序名称以及从选项文件获取的所有选项。

    有关此选项和其他选项文件选项的更多信息,请参阅第 6.2.2.3 节,“影响选项文件处理的命令行选项”。

  • --protocol={TCP|SOCKET|PIPE|MEMORY}

    命令行格式 --protocol=type
    类型 字符串
    默认值 [见文本]
    有效值 TCP``SOCKET``PIPE``MEMORY

    用于连接到服务器的传输协议。当其他连接参数通常导致使用不同于您想要的协议时,这很有用。有关允许值的详细信息,请参阅第 6.2.7 节,“连接传输协议”。

  • --socket=*路径*, -S *路径*

    命令行格式 --socket={file_name&#124;pipe_name}
    类型 字符串

    对于连接到localhost的连接,使用的 Unix 套接字文件,或者在 Windows 上使用的命名管道的名称。

    在 Windows 上,此选项仅在服务器启动时启用了支持命名管道连接的named_pipe系统变量时才适用。此外,连接必须是由named_pipe_full_access_group系统变量指定的 Windows 组的成员。

  • --ssl*

    --ssl开头的选项指定是否使用加密连接到服务器,并指示 SSL 密钥和证书的位置。请参阅加密连接的命令选项。

  • --ssl-fips-mode={OFF|ON|STRICT}

    命令行格式 --ssl-fips-mode={OFF&#124;ON&#124;STRICT}
    已弃用 8.0.34
    类型 枚举
    默认值 OFF
    有效值 OFF``ON``STRICT

    控制是否在客户端启用 FIPS 模式。--ssl-fips-mode选项与其他--ssl-*xxx*选项不同,它不用于建立加密连接,而是用于影响允许的加密操作。请参阅第 8.8 节,“FIPS 支持”。

    允许使用这些--ssl-fips-mode值:

    • OFF: 禁用 FIPS 模式。

    • ON: 启用 FIPS 模式。

    • STRICT: 启用“严格” FIPS 模式。

    注意

    如果 OpenSSL FIPS 对象模块不可用,--ssl-fips-mode 的唯一允许值为 OFF。在这种情况下,将 --ssl-fips-mode 设置为 ONSTRICT 会导致客户端在启动时产生警告并在非 FIPS 模式下运行。

    从 MySQL 8.0.34 开始,此选项已被弃用。预计在将来的 MySQL 版本中将其移除。

  • --tls-ciphersuites=*ciphersuite_list*

    命令行格式 --tls-ciphersuites=ciphersuite_list
    引入版本 8.0.16
    类型 字符串

    用于使用 TLSv1.3 的加密连接的允许的密码套件。该值是一个或多个以冒号分隔的密码套件名称列表。可以为此选项命名的密码套件取决于用于编译 MySQL 的 SSL 库。有关详细信息,请参见第 8.3.2 节,“加密连接 TLS 协议和密码”。

    此选项是在 MySQL 8.0.16 中添加的。

  • --tls-version=*protocol_list*

    命令行格式 --tls-version=protocol_list
    类型 字符串
    默认值 (≥ 8.0.16) TLSv1,TLSv1.1,TLSv1.2,TLSv1.3 (OpenSSL 1.1.1 或更高版本)TLSv1,TLSv1.1,TLSv1.2 (否则)
    默认值 (≤ 8.0.15) TLSv1,TLSv1.1,TLSv1.2

    用于加密连接的允许的 TLS 协议。该值是一个或多个逗号分隔的协议名称列表。可以为此选项命名的协议取决于用于编译 MySQL 的 SSL 库。有关详细信息,请参见第 8.3.2 节,“加密连接 TLS 协议和密码”。

  • --use-default

    命令行格式 --use-default
    类型 布尔值

    非交互执行。此选项可用于无人值守安装操作。

  • --user=*user_name*, -u *user_name*

    命令行格式 --user=user_name
    类型 字符串

    用于连接到服务器的 MySQL 帐户的用户名。

6.4.3 mysql_ssl_rsa_setup — 创建 SSL/RSA 文件

原文:dev.mysql.com/doc/refman/8.0/en/mysql-ssl-rsa-setup.html

注意

mysql_ssl_rsa_setup 在 MySQL 8.0.34 版本中已被弃用。相反,考虑使用 MySQL 服务器在启动时自动生成缺失的 SSL 和 RSA 文件(参见 Automatic SSL and RSA File Generation)。

该程序创建 SSL 证书和密钥文件以及 RSA 密钥对文件,以支持使用 SSL 进行安全连接和使用 RSA 在未加密连接上进行安全密码交换,如果这些文件丢失。mysql_ssl_rsa_setup 也可用于创建新的 SSL 文件,如果现有文件已过期。

注意

mysql_ssl_rsa_setup 使用 openssl 命令,因此��使用取决于您的机器上是否安装了 OpenSSL。

另一种生成 SSL 和 RSA 文件的方法,适用于使用 OpenSSL 编译的 MySQL 发行版,是让服务器自动生成它们。请参阅 Section 8.3.3.1, “Creating SSL and RSA Certificates and Keys using MySQL”。

重要提示

mysql_ssl_rsa_setup 通过更容易生成所需文件,降低了使用 SSL 的障碍。然而,由 mysql_ssl_rsa_setup 生成的证书是自签名的,安全性不高。在使用 mysql_ssl_rsa_setup 生成的文件获得经验后,考虑从注册的证书颁发机构获取 CA 证书。

像这样调用 mysql_ssl_rsa_setup

mysql_ssl_rsa_setup [*options*]

典型的选项包括 --datadir 用于指定创建文件的位置,以及 --verbose 用于查看 mysql_ssl_rsa_setup 执行的 openssl 命令。

mysql_ssl_rsa_setup 尝试使用默认的文件名创建 SSL 和 RSA 文件。其工作方式如下:

  1. mysql_ssl_rsa_setup 检查PATH环境变量指定的位置是否存在openssl二进制文件。如果未找到opensslmysql_ssl_rsa_setup 不执行任何操作。如果找到opensslmysql_ssl_rsa_setup 将在 MySQL 数据目录中查找默认 SSL 和 RSA 文件,该目录由--datadir选项指定,或者如果未提供--datadir选项,则查找编译的数据目录。

  2. mysql_ssl_rsa_setup 检查数据目录中具有以下名称的 SSL 文件:

    ca.pem
    server-cert.pem
    server-key.pem
    
  3. 如果这些文件中有任何一个存在,mysql_ssl_rsa_setup 将不创建 SSL 文件。否则,它会调用openssl来创建它们,以及一些额外的文件:

    ca.pem               Self-signed CA certificate
    ca-key.pem           CA private key
    server-cert.pem      Server certificate
    server-key.pem       Server private key
    client-cert.pem      Client certificate
    client-key.pem       Client private key
    

    这些文件使用 SSL 启用安全的客户端连接;参见第 8.3.1 节,“配置 MySQL 使用加密连接”。

  4. mysql_ssl_rsa_setup 检查数据目录中具有以下名称的 RSA 文件:

    private_key.pem      Private member of private/public key pair
    public_key.pem       Public member of private/public key pair
    
  5. 如果这些文件中有任何一个存在,mysql_ssl_rsa_setup 将不创建 RSA 文件。否则,它会调用openssl来创建它们。这些文件启用了通过sha256_passwordcaching_sha2_password插件进行的帐户的 RSA 在未加密连接上进行安全密码交换;参见第 8.4.1.3 节,“SHA-256 可插拔认证”,以及第 8.4.1.2 节,“缓存 SHA-2 可插拔认证”。

有关由mysql_ssl_rsa_setup创建的文件特性的信息,请参见第 8.3.3.1 节,“使用 MySQL 创建 SSL 和 RSA 证书和密钥”。

在启动时,如果没有提供除--ssl(可能还包括ssl_cipher)之外的显式 SSL 选项,则 MySQL 服务器会自动使用由mysql_ssl_rsa_setup创建的 SSL 文件来启用 SSL。如果您更喜欢明确指定文件,请在启动时使用--ssl-ca--ssl-cert--ssl-key选项来命名ca.pemserver-cert.pemserver-key.pem文件。

服务器还会自动使用由mysql_ssl_rsa_setup创建的 RSA 文件来启用 RSA,如果没有提供明确的 RSA 选项。

如果服务器启用了 SSL,则客户端默认使用 SSL 进行连接。要明确指定证书和密钥文件,请使用--ssl-ca--ssl-cert--ssl-key选项来命名ca.pemclient-cert.pemclient-key.pem文件。但是,首先可能需要一些额外的客户端设置,因为mysql_ssl_rsa_setup默认会在数据目录中创建这些文件。数据目录的权限通常只允许运行 MySQL 服务器的系统帐户访问,因此客户端程序无法使用那里的文件。为了使文件可用,请将它们复制到一个可读(但不可写)的目录中供客户端使用:

  • 对于本地客户端,可以使用 MySQL 安装目录。例如,如果数据目录是安装目录的子目录,并且您当前位置是数据目录,则可以像这样复制文件:

    cp ca.pem client-cert.pem client-key.pem ..
    
  • 对于远程客户端,请使用安全通道分发文件,以确保在传输过程中不被篡改。

如果用于 MySQL 安装的 SSL 文件已过期,您可以使用mysql_ssl_rsa_setup创建新文件:

  1. 停止服务器。

  2. 重命名或删除现有的 SSL 文件。您可能希望先备份它们。(RSA 文件不会过期,因此无需删除它们。mysql_ssl_rsa_setup会检查它们是否存在,并不会覆盖它们。)

  3. 运行mysql_ssl_rsa_setup时使用--datadir选���来指定新文件的创建位置。

  4. 重新启动服务器。

mysql_ssl_rsa_setup支持以下命令行选项,可以在命令行或选项文件的[mysql_ssl_rsa_setup][mysqld]组中指定。有关 MySQL 程序使用的选项文件的信息,请参见第 6.2.2.2 节,“使用选项文件”。

Table 6.10 mysql_ssl_rsa_setup Options

选项名称 描述
--datadir 数据目录路径
--help 显示帮助信息并退出
--suffix X.509 证书通用名称属性的后��
--uid 用于文件权限的有效用户名称
--详细 详细模式
--version 显示版本信息并退出
  • --help, ?

    命令行格式 --help

    显示帮助信息并退出。

  • --datadir=*dir_name*

    命令行格式 --datadir=dir_name
    类型 目录名称

    mysql_ssl_rsa_setup应检查默认 SSL 和 RSA 文件的目录路径,并在其中创建文件(如果缺少)。默认为编译的数据目录。

  • --suffix=*str*

    命令行格式 --suffix=str
    类型 字符串

    X.509 证书中通用名称属性的后缀。后缀值限制为 17 个字符。默认值基于 MySQL 版本号。

  • --uid=name, -v

    命令行格式 --uid=name

    应该成为任何创建文件的所有者的用户名称。该值是用户名,而不是数字用户 ID。如果没有此选项,由mysql_ssl_rsa_setup创建的文件将由执行它的用户拥有。只有在以root身份在支持chown()系统调用的系统上执行程序时,此选项才有效。

  • --verbose, -v

    命令行格式 --verbose

    详细模式。显示程序执行的更多输出。例如,程序显示运行的openssl命令,并生成输出以指示是否跳过 SSL 或 RSA 文件的创建,因为某些默认文件已经存在。

  • --version, -V

    命令行格式 --version

    显示版本信息并退出。

6.4.4 mysql_tzinfo_to_sql — 加载时区表

原文:dev.mysql.com/doc/refman/8.0/en/mysql-tzinfo-to-sql.html

mysql_tzinfo_to_sql程序加载mysql数据库中的时区表。它用于具有区域信息数据库(描述时区的文件集)的系统。这些系统的示例包括 Linux、FreeBSD、Solaris 和 macOS。这些文件的一个可能位置是/usr/share/zoneinfo目录(Solaris 上为/usr/share/lib/zoneinfo)。如果您的系统没有区域信息数据库,可以使用第 7.1.15 节“MySQL 服务器时区支持”中描述的可下载软件包。

mysql_tzinfo_to_sql可以以几种方式调用:

mysql_tzinfo_to_sql *tz_dir*
mysql_tzinfo_to_sql *tz_file tz_name*
mysql_tzinfo_to_sql --leap *tz_file*

对于第一种调用语法,将区域信息目录路径名称传递给mysql_tzinfo_to_sql,并将输出发送到mysql程序。例如:

mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql

mysql_tzinfo_to_sql读取系统的时区文件,并从中生成 SQL 语句。mysql处理这些语句以加载时区表。

第二种语法导致mysql_tzinfo_to_sql加载一个对应于时区名称tz_name的单个时区文件tz_file

mysql_tzinfo_to_sql *tz_file* *tz_name* | mysql -u root mysql

如果您的时区需要考虑闰秒,使用第三种语法调用mysql_tzinfo_to_sql,该语法初始化闰秒信息。tz_file是您的时区文件的名称:

mysql_tzinfo_to_sql --leap *tz_file* | mysql -u root mysql

运行mysql_tzinfo_to_sql后,最好重新启动服务器,以便它不继续使用任何先前缓存的时区数据。

6.4.5 mysql_upgrade — 检查和升级 MySQL 表

原文:dev.mysql.com/doc/refman/8.0/en/mysql-upgrade.html

注意

从 MySQL 8.0.16 开始,MySQL 服务器执行以前由 mysql_upgrade 处理的升级任务(有关详细信息,请参见 Section 3.4, “What the MySQL Upgrade Process Upgrades”)。因此,mysql_upgrade 不再需要,并且在该版本中已被弃用;预计在将来的 MySQL 版本中将其移除。由于 mysql_upgrade 不再执行升级任务,它无条件地以状态 0 退出。

每次升级 MySQL 时,您应该执行 mysql_upgrade,它会查找与升级后的 MySQL 服务器不兼容的地方:

  • 它升级 mysql 模式中的系统表,以便您可以利用可能已添加的新权限或功能。

  • 它升级了性能模式、INFORMATION_SCHEMAsys 模式。

  • 它检查用户模式。

如果 mysql_upgrade 发现表存在可能的不兼容性,它将执行表检查,并在发现问题时尝试进行表修复。如果表无法修复,请参见 Section 3.14, “Rebuilding or Repairing Tables or Indexes” 了解手动表修复策略。

mysql_upgrade 直接与 MySQL 服务器通信,发送执行升级所需的 SQL 语句。

警告

在执行升级之前,您应始终备份当前的 MySQL 安装。请参见 Section 9.2, “Database Backup Methods”。

一些升级不兼容性可能需要在升级 MySQL 安装和运行 mysql_upgrade 之前进行特殊处理。请参见 Chapter 3, Upgrading MySQL,了解如何确定是否有任何这样的不兼容性适用于您的安装以及如何处理它们。

使用 mysql_upgrade 如下:

  1. 确保服务器正在运行。

  2. 调用 mysql_upgrade 来升级 mysql 模式中的系统表,并检查和修复其他模式中的表:

    mysql_upgrade [*options*]
    
  3. 停止服务器并重新启动,以使任何系统表更改生效。

如果有多个要升级的 MySQL 服务器实例,请使用适合连接到每个所需服务器的连接参数调用 mysql_upgrade。例如,对于在本地主机上运行在端口 3306 到 3308 上的服务器,请通过连接到相应端口来升级它们:

mysql_upgrade --protocol=tcp -P 3306 [*other_options*]
mysql_upgrade --protocol=tcp -P 3307 [*other_options*]
mysql_upgrade --protocol=tcp -P 3308 [*other_options*]

对于 Unix 上的本地主机连接,--protocol=tcp 选项强制使用 TCP/IP 进行连接,而不是使用 Unix 套接字文件。

默认情况下,mysql_upgrade 以 MySQL root 用户身份运行。如果在运行 mysql_upgraderoot 密码已过期,则会显示密码已过期的消息,并且 mysql_upgrade 失败。要纠正这个问题,重置 root 密码以取消过期,并再次运行 mysql_upgrade。首先,以 root 身份连接到服务器:

$> mysql -u root -p
Enter password: ****  <- enter root password here

使用 ALTER USER 重置密码:

mysql> ALTER USER USER() IDENTIFIED BY '*root-password*';

然后退出 mysql 并再次运行 mysql_upgrade

$> mysql_upgrade [*options*]

注意

如果使用 disabled_storage_engines 系统变量运行服务器以禁用某些存储引擎(例如 MyISAM),mysql_upgrade 可能会因错误而失败,如下所示:

mysql_upgrade: [ERROR] 3161: Storage engine MyISAM is disabled
(Table creation is disallowed).

为了处理这个问题,重新启动服务器以禁用 disabled_storage_engines。然后你应该能够成功运行 mysql_upgrade。之后,重新启动服务器并将 disabled_storage_engines 设置为其原始值。

除非使用 --upgrade-system-tables 选项调用,mysql_upgrade 将根据需要处理所有用户模式中的所有表。表检查可能需要很长时间才能完成。每个表都会被锁定,因此在处理过程中对其他会话不可用。检查和修复操作可能需要很长时间,特别是对于大表。表检查使用 CHECK TABLE 语句的 FOR UPGRADE 选项。有关此选项的详细信息,请参见 第 15.7.3.2 节,“CHECK TABLE 语句”。

mysql_upgrade 使用当前 MySQL 版本号标记所有已检查和修复的表。这确保下次使用相同服务器版本运行 mysql_upgrade 时,可以确定是否有必要再次检查或修复给定表。

mysql_upgrade 将 MySQL 版本号保存在名为 mysql_upgrade_info 的文件中,该文件位于数据目录中。这用于快速检查是否已为此版本检查了所有表,以便可以跳过表检查。要忽略此文件并执行检查,请使用 --force 选项。

注意

mysql_upgrade_info 文件已被弃用;预计在未来的 MySQL 版本中将被移除。

mysql_upgrade 检查 mysql.user 系统表行,并对任何具有空 plugin 列的行,如果凭据使用与该插件兼容的哈希格式,则将该列设置为 'mysql_native_password'。必须手动升级具有早期 4.1 版本密码哈希的行。

mysql_upgrade 不会升级时区表或帮助表的内容。有关升级说明,请参见 第 7.1.15 节,“MySQL 服务器时区支持”,以及 第 7.1.17 节,“服务器端帮助支持”。

除非使用 --skip-sys-schema 选项调用,否则 mysql_upgrade 如果尚未安装 sys 模式,则安装它,并在其他情况下将其升级到当前版本。如果存在 sys 模式但没有 version 视图,则会发生错误,假设其不存在表示用户创建的模式:

A sys schema exists with no sys.version view. If
you have a user created sys schema, this must be renamed for the
upgrade to succeed.

在这种情况下升级,首先删除或重命名现有的sys模式。

mysql_upgrade 支持以下选项,可以在命令行或选项文件的[mysql_upgrade][client]组中指定。有关 MySQL 程序使用的选项文件的信息,请参见 Section 6.2.2.2, “使用选项文件”。

表 6.11 mysql_upgrade 选项

选项名称 描述 引入 废弃
--bind-address 使用指定的网络接口连接到 MySQL 服务器
--character-sets-dir 安装字符集的目录
--compress 压缩客户端和服务器之间发送的所有信息 8.0.18
--compression-algorithms 连接到服务器的允许压缩算法 8.0.18
--debug 写入调试日志
--debug-check 程序退出时打印调试信息
--debug-info 程序退出时打印调试信息、内存和 CPU 统计信息
--default-auth 要使用的认证插件
--default-character-set 指定默认字符集
--defaults-extra-file 除了通常的选项文件外,还读取指定的选项文件
--defaults-file 仅读取指定的选项文件
--defaults-group-suffix 选项组后缀值
--force 即使 mysql_upgrade 已经为当前 MySQL 版本执行过,也要强制执行
--get-server-public-key 从服务器请求 RSA 公钥
--help 显示帮助消息并退出
--host MySQL 服务器所在的主机
--login-path 从.mylogin.cnf 中读取登录路径选项
--max-allowed-packet 发送到服务器或从服务器接收的最大数据包长度
--net-buffer-length TCP/IP 和套接字通信的缓冲区大小
--no-defaults 不读取任何选项文件
--password 连接到服务��时要使用的密码
--pipe 使用命名管道连接服务器(仅限 Windows)
--plugin-dir 安装插件的目录
--port 连接的 TCP/IP 端口号
--print-defaults 打印默认选项
--protocol 要使用的传输协议
--server-public-key-path 包含 RSA 公钥的文件路径名
--shared-memory-base-name 共享内存连接的共享内存名称(仅限 Windows)
--skip-sys-schema 不安装或升级 sys schema
--socket 要使用的 Unix 套接字文件或 Windows 命名管道
--ssl-ca 包含受信任的 SSL 证书颁发机构列表的文件
--ssl-capath 包含受信任的 SSL 证书颁发机构证书文件的目录
--ssl-cert 包含 X.509 证书的文件
--ssl-cipher 连接加密的允许密码
--ssl-crl 包含证书吊销列表的文件
--ssl-crlpath 包含证书吊销列表文件的目录
--ssl-fips-mode 是否在客户端启用 FIPS 模式 8.0.34
--ssl-key 包含 X.509 密钥的文件
--ssl-mode 与服务器连接的期望安全状态
--ssl-session-data 包含 SSL 会话数据的文件 8.0.29
--ssl-session-data-continue-on-failed-reuse 如果会话重用失败是否建立连接 8.0.29
--tls-ciphersuites 用于加密连接的允许的 TLSv1.3 密码套件 8.0.16
--tls-version 用于加密连接的允许的 TLS 协议
--upgrade-system-tables 仅更新系统表,不更新用户模式
--user 连接到服务器时要使用的 MySQL 用户名
--verbose 详细模式
--version-check 检查正确的服务器版本
--write-binlog 将所有语句写入二进制日志
--zstd-compression-level 用于使用 zstd 压缩连接的服务器的压缩级别 8.0.18
选项名称 描述 引入 废弃
  • --help

    命令行格式 --help

    显示简短的帮助消息并退出。

  • --bind-address=*ip_address*

    命令行格式 --bind-address=ip_address

    在具有多个网络接口的计算机上,使用此选项选择连接到 MySQL 服务器的接口。

  • --character-sets-dir=*dir_name*

    命令行格式 --character-sets-dir=dir_name
    类型 目录名称

    字符集安装目录。参见第 12.15 节,“字符集配置”。

  • --compress, -C

    命令行格式 --compress[={OFF&#124;ON}]
    废弃 8.0.18
    类型 布尔值
    默认值 OFF

    尽可能压缩客户端和服务器之间发送的所有信息。参见第 6.2.8 节,“连接压缩控制”。

    从 MySQL 8.0.18 开始,此选项已被弃用。预计在将来的 MySQL 版本中将其移除。参见配置传统连接压缩。

  • --compression-algorithms=*value*

    命令行格式 --compression-algorithms=value
    引入 8.0.18
    类型 集合
    默认值 uncompressed
    有效值 zlib``zstd``uncompressed

    连接到服务器的允许的压缩算法。可用的算法与protocol_compression_algorithms系统变量相同。默认值为uncompressed

    更多信息,请参见第 6.2.8 节,“连接压缩控制”。

    此选项在 MySQL 8.0.18 中添加。

  • --debug[=*debug_options*], -# [*debug_options*]

    命令行格式 --debug[=#]
    类型 字符串
    默认值 d:t:O,/tmp/mysql_upgrade.trace

    写入调试日志。典型的debug_options字符串是d:t:o,*file_name*。默认值为d:t:O,/tmp/mysql_upgrade.trace

  • --debug-check

    命令行格式 --debug-check
    类型 布尔值

    程序退出时打印一些调试信息。

  • --debug-info, -T

    命令行格式 --debug-info
    类型 布尔值
    默认值 FALSE

    在程序退出时打印调试信息以及内存和 CPU 使用统计信息。

  • --default-auth=*plugin*

    命令行格式 --default-auth=plugin
    类型 字符串

    提示使用哪个客户端身份验证插件。参见第 8.2.17 节,“可插拔身份验证”。

  • --default-character-set=*charset_name*

    命令行格式 --default-character-set=name
    类型 字符串

    使用charset_name作为默认字符集。参见第 12.15 节,“字符集配置”。

  • --defaults-extra-file=*file_name*

    命令行格式 --defaults-extra-file=file_name
    类型 文件名

    在全局选项文件之后(在 Unix 上)但在用户选项文件之前读取此选项文件。如果文件不存在或无法访问,将出现错误。如果file_name不是绝对路径名,则将其解释为相对于当前目录。

    关于此选项文件和其他选项文件选项的更多信息,请参见第 6.2.2.3 节,“影响选项文件处理的命令行选项”。

  • --defaults-file=*file_name*

    命令行格式 --defaults-file=file_name
    类型 文件名

    仅使用给定的选项文件。如果文件不存在或无法访问,将出现错误。如果file_name不是绝对路径名,则将其解释为相对于当前目录。

    有关此选项文件选项和其他选项的更多信息,请参见第 6.2.2.3 节,“影响选项文件处理的命令行选项”。

  • --defaults-group-suffix=*str*

    命令行格式 --defaults-group-suffix=str
    类型 字符串

    读取不仅是通常的选项组,还有带有通常名称和后缀为str的组。例如,mysql_upgrade通常会读取[client][mysql_upgrade]组。如果此选项给定为--defaults-group-suffix=_othermysql_upgrade还会读取[client_other][mysql_upgrade_other]组。

    有关此选项文件选项和其他选项的更多信息,请参见第 6.2.2.3 节,“影响选项文件处理的命令行选项”。

  • --force

    命令行格式 --force
    类型 布尔值

    忽略mysql_upgrade_info文件,并强制执行,即使mysql_upgrade已经为当前版本的 MySQL 执行过。

  • --get-server-public-key

    命令行格式 --get-server-public-key
    类型 布尔值

    从服务器请求用于 RSA 密钥对密码交换所需的公钥。此选项适用于使用caching_sha2_password认证插件进行身份验证的客户端。对于该插件,除非请求,否则服务器不会发送公钥。对于不使用该插件进行身份验证的帐户,此选项将被忽略。如果不使用基于 RSA 的密码交换,例如客户端使用安全连接连接到服务器时,此选项也将被忽略。

    如果--server-public-key-path=*file_name*被给定并指定了有效的公钥文件,则优先于--get-server-public-key

    有关caching_sha2_password插件的信息,请参见第 8.4.1.2 节,“Caching SHA-2 Pluggable Authentication”。

  • --host=*host_name*, -h *host_name*

    命令行格式 --host=name
    类型 字符串

    连接到给定主机上的 MySQL 服务器。

  • --login-path=*name*

    命令行格式 --login-path=name
    类型 字符串

    .mylogin.cnf登录路径文件中的指定登录路径读取选项。 “登录路径”是一个包含指定要连接到哪个 MySQL 服务器以及要作为哪个帐户进行身份验证的选项的选项组。要创建或修改登录路径文件,请使用mysql_config_editor实用程序。请参阅 Section 6.6.7, “mysql_config_editor — MySQL Configuration Utility”。

    有关此选项和其他选项文件选项的其他信息,请参阅 Section 6.2.2.3, “Command-Line Options that Affect Option-File Handling”。

  • --max-allowed-packet=*value*

    命令行格式 --max-allowed-packet=value
    类型 整数
    默认值 25165824
    最小值 4096
    最大值 2147483648

    客户端/服务器通信缓冲区的最大大小。默认值为 24MB。最小值和最大值分别为 4KB 和 2GB。

  • --net-buffer-length=*value*

    命令行格式 --net-buffer-length=value
    类型 整数
    默认值 1047552
    最小值 4096
    最大值 16777216

    客户端/服务器通信缓冲区的初始大小。默认值为 1MB − 1KB。最小值和最大值分别为 4KB 和 16MB。

  • --no-defaults

    命令行格式 --no-defaults

    不要读取任何选项文件。如果由于从选项文件中读取未知选项而导致程序启动失败,则可以使用--no-defaults来防止读取它们。

    例外情况是,如果存在.mylogin.cnf文件,则在所有情况下都会读取该文件。即使使用--no-defaults,也可以以比在命令行上更安全的方式指定密码。要创建.mylogin.cnf,请使用mysql_config_editor实用程序。请参阅 Section 6.6.7, “mysql_config_editor — MySQL Configuration Utility”。

    有关此选项和其他选项文件选项的其他信息,请参阅 Section 6.2.2.3, “Command-Line Options that Affect Option-File Handling”。

  • --password[=*password*], -p[*password*]

    命令行格式 --password[=name]
    类型 字符串

    用于连接到服务器的 MySQL 帐户的密码。密码值是可选的。如果未提供,mysql_upgrade会提示输入密码。如果提供,--password=-p与后面的密码之间不能有空格。如果未指定密码选项,则默认不发送密码。

    在命令行上指定密码应被视为不安全。为了避免在命令行上提供密码,请使用选项文件。参见第 8.1.2.1 节,“密码安全的最终用户指南”。

    明确指定没有密码,并且mysql_upgrade不应提示输入密码,使用--skip-password选项。

  • --pipe, -W

    命令行格式 --pipe
    类型 字符串

    在 Windows 上,使用命名管道连接服务器。此选项仅在服务器启动时启用了named_pipe系统变量以支持命名管道连接时适用。此外,进行连接的用户必须是由named_pipe_full_access_group系统变量指定的 Windows 组的成员。

  • --plugin-dir=*dir_name*

    命令行格式 --plugin-dir=dir_name
    类型 目录名称

    查找插件的目录。如果使用--default-auth选项指定身份验证插件但mysql_upgrade找不到它,则指定此选项。参见第 8.2.17 节,“可插拔认证”。

  • --port=*port_num*, -P *port_num*

    命令行格式 --port=#
    类型 数字

    用于 TCP/IP 连接的端口号。

  • --print-defaults

    命令行格式 --print-defaults

    打印程序名称以及从选项文件获取的所有选项。

  • --protocol={TCP|SOCKET|PIPE|MEMORY}

    命令行格式 --protocol=name
    类型 字符串

    用于连接到服务器的传输协议。当其他连接参数通常导致使用不希望使用的协议时,这很有用。有关允许值的详细信息,请参见第 6.2.7 节,“连接传输协议”。

  • --server-public-key-path=*file_name*

    命令行格式 --server-public-key-path=file_name
    类型 文件名

    以 PEM 格式的文件路径名,其中包含服务器所需的用于 RSA 密钥对密码交换的客户端端公钥的副本。此选项适用于使用sha256_passwordcaching_sha2_password认证插件进行身份验证的客户端。对于不使用这些插件进行身份验证的帐户,此选项将被忽略。如果不使用基于 RSA 的密码交换(例如客户端使用安全连接连接到服务器时),此选项也将被忽略。

    如果--server-public-key-path=*file_name*被指定并指定了有效的公钥文件,则优先于--get-server-public-key

    对于sha256_password,此选项仅在 MySQL 使用 OpenSSL 构建时适用。

    有关sha256_passwordcaching_sha2_password插件的信息,请参见第 8.4.1.3 节,“SHA-256 可插拔认证”和第 8.4.1.2 节,“缓存 SHA-2 可插拔认证”。

  • --shared-memory-base-name=*name*

    命令行格式 --shared-memory-base-name=name
    平台特定 Windows

    在 Windows 上,用于通过共享内存连接到本地服务器的共享内存名称。默认值为MYSQL。共享内存名称区分大小写。

    仅当服务器启用了shared_memory系统变量以支持共享内存连��时,此选项才适用。

  • --skip-sys-schema

    命令行格式 --skip-sys-schema
    类型 布尔值
    默认值 FALSE

    默认情况下,mysql_upgrade如果未安装sys模式,则安装它,并将其升级到当前版本。--skip-sys-schema选项会抑制此行为。

  • --socket=*path*, -S *path*

    命令行格式 --socket={file_name&#124;pipe_name}
    类型 字符串

    对于连接到localhost的连接,要使用的 Unix 套接字文件,或者在 Windows 上,要使用的命名管道的名称。

    在 Windows 上,只有在服务器启动时启用了named_pipe系统变量以支持命名管道连接时,此选项才适用。此外,进行连接的用户必须是由named_pipe_full_access_group系统变量指定的 Windows 组的成员。

  • --ssl*

    --ssl开头的选项指定是否使用加密连接连接到服务器,并指示 SSL 密钥和证书的位置。请参见加密连接的命令选项。

  • --ssl-fips-mode={OFF|ON|STRICT}

    命令行格式 --ssl-fips-mode={OFF&#124;ON&#124;STRICT}
    已弃用 8.0.34
    类型 枚举
    默认值 OFF
    有效值 OFF``ON``STRICT

    控制是否在客户端端启用 FIPS 模式。--ssl-fips-mode选项与其他--ssl-*xxx*选项不同,它不用于建立加密连接,而是影响允许哪些加密操作。请参见第 8.8 节,“FIPS 支持”。

    允许使用这些--ssl-fips-mode值:

    • OFF:禁用 FIPS 模式。

    • ON:启用 FIPS 模式。

    • STRICT:启用“严格” FIPS 模式。

    注意

    如果 OpenSSL FIPS Object 模块不可用,则--ssl-fips-mode的唯一允许值是OFF。在这种情况下,将--ssl-fips-mode设置为ONSTRICT会导致客户端在启动时产生警告并在非 FIPS 模式下运行。

    从 MySQL 8.0.34 开始,此选项已弃用。预计在将来的 MySQL 版本中将其移除。

  • --tls-ciphersuites=*ciphersuite_list*

    命令行格式 --tls-ciphersuites=ciphersuite_list
    引入版本 8.0.16
    类型 字符串

    用于使用 TLSv1.3 的加密连接的允许密码套件。该值是一个或多个以冒号分隔的密码套件名称列表。可以为此选项命名的密码套件取决于用于编译 MySQL 的 SSL 库。有关详细信息,请参见第 8.3.2 节,“加密连接 TLS 协议和密码”。

    此选项是在 MySQL 8.0.16 中添加的。

  • --tls-version=*protocol_list*

    命令行格式 --tls-version=protocol_list
    类型 字符串
    默认值 (≥ 8.0.16) TLSv1,TLSv1.1,TLSv1.2,TLSv1.3 (OpenSSL 1.1.1 或更高版本)TLSv1,TLSv1.1,TLSv1.2 (否则)
    默认值 (≤ 8.0.15) TLSv1,TLSv1.1,TLSv1.2

    加密连接的可接受 TLS 协议。该值是一个或多个逗号分隔的协议名称列表。可以为此选项命名的协议取决于用于编译 MySQL 的 SSL 库。有关详细信息,请参见 Section 8.3.2, “Encrypted Connection TLS Protocols and Ciphers”。

  • --upgrade-system-tables, -s

    命令行格式 --upgrade-system-tables
    类型 布尔值

    仅升级 mysql 模式中的系统表,不升级用户模式。

  • --user=*user_name*, -u *user_name*

    命令行格式 --user=name
    类型 字符串

    用于连接到服务器的 MySQL 帐户的用户名。默认用户名为 root

  • --verbose

    命令行格式 --verbose
    类型 布尔值

    详细模式。打印有关程序操作的更多信息。

  • --version-check, -k

    命令行格式 --version-check
    类型 布尔值

    检查 mysql_upgrade 连接的服务器版本,以验证其与构建 mysql_upgrade 的版本相同。如果不同,mysql_upgrade 将退出。此选项默认启用;要禁用检查,请使用 --skip-version-check

  • --write-binlog

    命令行格式 --write-binlog
    类型 布尔值
    默认值 OFF

    默认情况下,mysql_upgrade 的二进制日志记录是禁用的。如果希望将其操作写入二进制日志,请使用 --write-binlog

    当服务器启用全局事务标识符(GTIDs)时(gtid_mode=ON),不要通过 mysql_upgrade 启用二进制日志记录。

  • --zstd-compression-level=*level*

    命令行格式 --zstd-compression-level=#
    引入版本 8.0.18
    类型 整数

    用于使用zstd压缩算法连接到服务器的压缩级别。允许的级别从 1 到 22,较大的值表示较高级别的压缩。默认的zstd压缩级别为 3。压缩级别设置对不使用zstd压缩的连接没有影响。

    有关更多信息,请参见第 6.2.8 节,“连接压缩控制”。

    此选项是在 MySQL 8.0.18 中添加的。

posted @ 2024-06-23 16:26  绝不原创的飞龙  阅读(3)  评论(0编辑  收藏  举报