前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MySQL8 中文参考(八)

MySQL8 中文参考(八)

作者头像
ApacheCN_飞龙
发布2024-06-26 19:11:15
920
发布2024-06-26 19:11:15
举报
文章被收录于专栏:信数据得永生信数据得永生

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

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

5.3.4.9 使用多个表

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

  • 宠物名称,以便你知道每个事件涉及哪个动物。
  • 一个日期,以便你知道事件发生的时间。
  • 一个描述事件的字段。
  • 一个事件类型字段,如果你想对事件进行分类。

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

代码语言:javascript
复制
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

生日

第一个生日

名称

日期

类型

备注

加载记录如下:

代码语言:javascript
复制
mysql> LOAD DATA LOCAL INFILE 'event.txt' INTO TABLE event;

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

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

代码语言:javascript
复制
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表与自身连接,以生成相同物种的活体雄性和雌性的候选配对:

代码语言:javascript
复制
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()函数:

代码语言:javascript
复制
mysql> SELECT DATABASE();
+------------+
| DATABASE() |
+------------+
| menagerie  |
+------------+

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

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

代码语言:javascript
复制
mysql> SHOW TABLES;
+---------------------+
| Tables_in_menagerie |
+---------------------+
| event               |
| pet                 |
+---------------------+

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

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

代码语言:javascript
复制
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从文件中读取输入:

代码语言:javascript
复制
$> mysql < *batch-file*

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

代码语言:javascript
复制
C:\> mysql -e "source *batch-file*"

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

代码语言:javascript
复制
$> mysql -h *host* -u *user* -p < *batch-file*
Enter password: ********

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

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

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

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

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

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

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

代码语言:javascript
复制
$> mysql < *batch-file* | more

你可以将输出捕获到一个文件中以供进一步处理:

代码语言:javascript
复制
$> mysql < *batch-file* > mysql.out

你可以将你的脚本分发给其他人,这样他们也可以运行这些语句。

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

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

代码语言:javascript
复制
+---------+
| species |
+---------+
| bird    |
| cat     |
| dog     |
| hamster |
| snake   |
+---------+

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

代码语言:javascript
复制
species
bird
cat
dog
hamster
snake

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

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

代码语言:javascript
复制
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并选择一个数据库:

代码语言:javascript
复制
$> mysql *your-database-name*

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

代码语言:javascript
复制
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);

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

代码语言:javascript
复制
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

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

代码语言:javascript
复制
SELECT MAX(article) AS article FROM shop;

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

5.6.2 持有某一列最大值的行

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

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

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

代码语言:javascript
复制
SELECT article, dealer, price
FROM   shop
WHERE  price=(SELECT MAX(price) FROM shop);

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

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

代码语言:javascript
复制
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子句仅获取第一行,像这样:

代码语言:javascript
复制
SELECT article, dealer, price
FROM shop
ORDER BY price DESC
LIMIT 1;

注意

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

- 5.6.3 每组的列最大值

代码语言:javascript
复制
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

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

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

代码语言:javascript
复制
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 或具有窗口函数的公共表达式。

无关联子查询:

代码语言:javascript
复制
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

代码语言:javascript
复制
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”。

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

代码语言:javascript
复制
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 节,“用户定义变量”.)

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

代码语言:javascript
复制
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 语句创建父表和子表:

代码语言:javascript
复制
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;

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

代码语言:javascript
复制
mysql> INSERT INTO parent (id) VALUES ROW(1);

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

代码语言:javascript
复制
mysql> TABLE parent;
+----+
| id |
+----+
|  1 |
+----+

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

代码语言:javascript
复制
mysql> INSERT INTO child (id,parent_id) VALUES ROW(1,1);

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

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

代码语言:javascript
复制
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值在父表中不存在。

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

代码语言:javascript
复制
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选项在删除或更新父表中的行时,会自动删除或更新子表中匹配的行。

代码语言:javascript
复制
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;

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

代码语言:javascript
复制
mysql> INSERT INTO child (id,parent_id) VALUES ROW(1,1), ROW(2,1), ROW(3,1);

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

代码语言:javascript
复制
mysql> TABLE child;
+------+-----------+
| id   | parent_id |
+------+-----------+
|    1 |         1 |
|    2 |         1 |
|    3 |         1 |
+------+-----------+

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

代码语言:javascript
复制
mysql> UPDATE parent SET id = 2 WHERE id = 1;

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

代码语言:javascript
复制
mysql> TABLE parent;
+----+
| id |
+----+
|  2 |
+----+

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

代码语言:javascript
复制
mysql> TABLE child;
+------+-----------+
| id   | parent_id |
+------+-----------+
|    1 |         2 |
|    2 |         2 |
|    3 |         2 |
+------+-----------+

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

代码语言:javascript
复制
mysql> DELETE FROM parent WHERE id = 2;

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

代码语言:javascript
复制
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进行搜索:

代码语言:javascript
复制
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只搜索一个键,并且可以进行优化:

代码语言:javascript
复制
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

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

代码语言:javascript
复制
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);

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

代码语言:javascript
复制
SELECT year,month,BIT_COUNT(BIT_OR(1<<day)) AS days FROM t1
       GROUP BY year,month;

返回结果为:

代码语言:javascript
复制
+------+-------+------+
| 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属性可用于为新行生成唯一标识:

代码语言:javascript
复制
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;

返回:

代码语言:javascript
复制
+----+---------+
| id | name    |
+----+---------+
|  1 | dog     |
|  2 | cat     |
|  3 | penguin |
|  4 | lax     |
|  5 | whale   |
|  6 | ostrich |
+----+---------+

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

代码语言:javascript
复制
INSERT INTO animals (id,name) VALUES(0,'groundhog');

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

代码语言:javascript
复制
INSERT INTO animals (id,name) VALUES(NULL,'squirrel');

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

代码语言:javascript
复制
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 设置该值,如下所示:

代码语言:javascript
复制
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*。当您想要将数据放入有序组时,这是很有用的。

代码语言:javascript
复制
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;

返回:

代码语言:javascript
复制
+--------+----+---------+
| 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 配置文件中:

代码语言:javascript
复制
LogFormat \
        "\"%h\",%{%Y%m%d%H%M%S}t,%>s,\"%b\",\"%{Content-Type}o\",  \
        \"%U\",\"%{Referer}i\",\"%{User-Agent}i\""

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

代码语言:javascript
复制
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 程序,请输入程序名称,然后输入任何选项或其他参数,以指示程序您希望它执行的操作。以下命令显示了一些示例程序调用。>表示您的命令解释器的提示符;它不是您键入的一部分。您看到的特定提示取决于您的命令解释器。典型的提示是

代码语言:javascript
复制
$> 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上的服务器:

代码语言:javascript
复制
mysql -h example.com -h localhost

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

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

代码语言:javascript
复制
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。但是,对于短格式,如果给出了密码值,必须紧跟在选项字母后面,不能有空格:如果选项字母后面有空格,程序无法判断后面的参数是密码值还是其他类型的参数。因此,以下两个命令具有完全不同的含义:

代码语言:javascript
复制
mysql -ptest
mysql -p test

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

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

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

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

代码语言:javascript
复制
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 秒:

代码语言:javascript
复制
mysqladmin --count=1K --sleep=10 ping

当指定文件名作为选项值时,避免使用~ shell 元字符。它可能不会被解释为你期望的那样。

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

代码语言:javascript
复制
$> 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 PERSIST或SET PERSIST_ONLY持久化的系统变量(仅限服务器)

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

代码语言:javascript
复制
C:\> echo %WINDIR%

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

代码语言:javascript
复制
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 PERSIST或SET 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,有几种方法可以实现。以下是一些示例:

代码语言:javascript
复制
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] 的选项。

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

代码语言:javascript
复制
[client]
port=3306
socket=/tmp/mysql.sock

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

[mysqldump]
quick

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

代码语言:javascript
复制
[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 服务器:

代码语言:javascript
复制
[mysqld-8.0]
sql_mode=TRADITIONAL
选项文件包含

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

代码语言:javascript
复制
!include /home/mydir/myopt.cnf

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

代码语言:javascript
复制
!includedir /home/mydir

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

注意

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

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

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

代码语言:javascript
复制
!include /home/mydir/myopt.cnf

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

代码语言:javascript
复制
[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

代码语言:javascript
复制
!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”。

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

代码语言:javascript
复制
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 的输出发送到另一个只期望看到数据而不是初始标题行的程序时。

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

代码语言:javascript
复制
--disable-column-names
--skip-column-names
--column-names=0

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

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

代码语言:javascript
复制
--column-names
--enable-column-names
--column-names=1

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

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

代码语言:javascript
复制
$> 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,服务器会产生此错误:

代码语言:javascript
复制
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 的值,请使用以下任一命令:

代码语言:javascript
复制
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⁶的倍增器。后缀字母可以是大写或小写。

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

代码语言:javascript
复制
[mysql]
max_allowed_packet=16777216

或:

代码语言:javascript
复制
[mysql]
max_allowed_packet=16M

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

代码语言:javascript
复制
[mysqld]
key_buffer_size=512M

[mysqld]
key-buffer-size=512M

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

代码语言:javascript
复制
$> mysql --max_allowed_packet=16M
$> mysql --max_allowed_packet=16*1024*1024

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

代码语言:javascript
复制
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 选项默认值、期望值的选项和等号

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

代码语言:javascript
复制
mysql --host=tonfisk --user=jon

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

代码语言:javascript
复制
mysql --host tonfisk --user jon

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

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

代码语言:javascript
复制
$> 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)

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

代码语言:javascript
复制
$> mysql --host 85.224.35.45 --user
mysql: option '--user' requires an argument

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

代码语言:javascript
复制
$> 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的调用:

代码语言:javascript
复制
$> 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
$>

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

代码语言:javascript
复制
$> 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来启动服务器,但这并没有产生预期的效果,如下所示:

代码语言:javascript
复制
$> 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作为错误日志启动,但随后关闭。检查这个文件的最后几行显示了原因:

代码语言:javascript
复制
$> 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选项提供了默认值,你必须使用等号来分配不同的值,如下所示:

代码语言:javascript
复制
$> 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文件:

代码语言:javascript
复制
[mysql]

host
user

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

代码语言:javascript
复制
$> mysql
ERROR 2005 (HY000): Unknown MySQL server host '--user' (1)

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

代码语言:javascript
复制
[mysql]

user jon

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

代码语言:javascript
复制
$> mysql
mysql: unknown option '--user jon'

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

代码语言:javascript
复制
[mysql]

user=jon

现在登录尝试成功了:

代码语言:javascript
复制
$> 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)

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

代码语言:javascript
复制
$> 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 套接字文件:

代码语言:javascript
复制
mysql --host=localhost

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

代码语言:javascript
复制
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*应该是一个或多个密码名称的列表,用冒号分隔。例如:

代码语言:javascript
复制
--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 的加密连接的密码套件。该值是一个或多个以冒号分隔的密码套件名称列表。例如:

代码语言:javascript
复制
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 协议。该值是一个或多个逗号分隔的协议版本列表。例如:

代码语言:javascript
复制
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系统变量)。

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

代码语言:javascript
复制
--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.

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

代码语言:javascript
复制
--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 中添加。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-06-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 5.4 获取有关数据库和表的信息
  • 5.5 在批处理模式下使用 mysql
  • 5.6 常见查询示例
  • 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
  • 5.7 使用 MySQL 与 Apache
  • 第六章 MySQL 程序
  • 6.1 MySQL 程序概述
  • 6.2 使用 MySQL 程序
  • 6.2.1 调用 MySQL 程序
  • 6.2.2 指定程序选项
  • 6.2.3 连接到服务器的命令选项
相关产品与服务
云数据库 MySQL
腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档