原文:
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
语句可能如下所示:
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
表中。这意味着查询需要两个表:
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
。
要查找默认数据库包含哪些表(例如,当您不确定表名时),请使用此语句:
代码语言:javascript复制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
而不是空。
DESC
是DESCRIBE
语句的简写形式。有关更多信息,请参阅 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
的输出如下:
---------
| species |
---------
| bird |
| cat |
| dog |
| hamster |
| snake |
---------
在批处理模式下,输出看起来像这样:
代码语言:javascript复制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并选择一个数据库:
代码语言: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
,如下所示:
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 每组的列最大值
- 原文:
dev.mysql.com/doc/refman/8.0/en/example-maximum-column-group.html
- 任务:找到每篇文章的最高价格。
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
:
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 支持外键,允许跨表引用相关数据,并支持外键约束,有助于保持相关数据的一致性。
外键关系涉及一个持有初始列值的父表,以及一个引用父列值的子表。外键约束定义在子表上。
以下示例通过单列外键关联parent
和child
表,并展示了外键约束如何强制执行引用完整性。
使用以下 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
表中的行来做到这一点,如下所示:
mysql> TABLE parent;
----
| id |
----
| 1 |
----
使用以下 SQL 语句向子表中插入一行:
代码语言:javascript复制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
值在父表中不存在。
尝试删除先前插入到父表中的行也会失败,如下所示:
代码语言: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 UPDATE
和ON DELETE
子句指定的引用动作。省略ON DELETE
和ON UPDATE
子句(如当前子表定义中)等同于指定RESTRICT
选项,它拒绝影响父表中具有匹配行的键值的操作。
为了演示ON DELETE
和ON UPDATE
引用动作,删除子表并重新创建它以包括带有CASCADE
选项的ON UPDATE
和ON 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;
使用下面显示的语句向子表中插入一些行:
代码语言: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
引用动作是否已更新子表,如下所示:
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
以下示例展示了如何使用位组函数来计算用户每月访问网页的天数。
代码语言: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
属性可用于为新行生成唯一标识:
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 模式。例如:
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 TABLE
或 ALTER TABLE
设置该值,如下所示:
mysql> ALTER TABLE tbl AUTO_INCREMENT = 100;
InnoDB 注意事项
有关特定于InnoDB
的AUTO_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;
返回:
代码语言: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_increment
和auto_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
上的服务器:
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
。但是,对于短格式,如果给出了密码值,必须紧跟在选项字母后面,不能有空格:如果选项字母后面有空格,程序无法判断后面的参数是密码值还是其他类型的参数。因此,以下两个命令具有完全不同的含义:
mysql -ptest
mysql -p test
第一个命令指示mysql使用密码值test
,但没有指定默认数据库。第二个命令指示mysql提示输入密码值,并将test
作为默认数据库。
在选项名称中,短横线(-
)和下划线(_
)在大多数情况下可以互换使用,尽管前导短横线不能用下划线表示。例如,--skip-grant-tables
和--skip_grant_tables
是等效的。
在本手册中,我们在选项名称中使用破折号,除非下划线具有特殊意义。例如,--log-bin
和 --log_bin
是不同的选项。我们鼓励您也这样做。
MySQL 服务器有一些只能在启动时指定的命令选项,以及一组系统变量,其中一些可以在启动时、运行时或两者同时设置。系统变量名称使用下划线而不是破折号,并且在运行时引用时(例如,使用SET
或SELECT
语句),必须使用下划线写成:
SET GLOBAL general_log = ON;
SELECT @@GLOBAL.general_log;
在服务器启动时,系统变量的语法与命令选项相同,因此在变量名称中,破折号和下划线可以互换使用。例如,--general_log=ON
和 --general-log=ON
是等效的。(这也适用于在选项文件中设置的系统变量。)
对于需要数字值的选项,值可以附加K
、M
或G
后缀,以表示 1024、1024² 或 1024³ 的倍数。从 MySQL 8.0.14 开始,后缀也可以是T
、P
和E
,表示 1024⁴、1024⁵ 或 1024⁶ 的倍数。后缀字母可以是大写或小写。
例如,以下命令告诉mysqladmin向服务器发送 1024 次 ping,每次 ping 之间间隔 10 秒:
代码语言:javascript复制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 配置实用程序”。“登录路径”是一个只允许特定选项的选项组:host
、user
、password
、port
和socket
。客户端程序使用--login-path
选项指定从.mylogin.cnf
中读取哪个登录路径。 要指定替代的登录路径文件名,请设置MYSQL_TEST_LOGIN_FILE
环境变量。这个变量被mysql-test-run.pl测试实用程序使用,但也被mysql_config_editor和 MySQL 客户端(如mysql、mysqladmin等)所识别。 - 数据目录中的
mysqld-auto.cnf
文件。这个 JSON 格式的文件包含持久化的系统变量设置。它是由服务器在执行SET PERSIST
或SET 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
环境变量的值确定其确切位置:
C:> echo %WINDIR%
%APPDATA%
代表 Windows 应用程序数据目录的值。使用以下命令根据APPDATA
环境变量的值确定其确切位置:
C:> echo %APPDATA%
*BASEDIR
代表 MySQL 基本安装目录。当使用 MySQL Installer 安装 MySQL 8.0 时,这通常是C:*
PROGRAMDIR*MySQLMySQL Server 8.0
,其中PROGRAMDIR
*代表程序目录(通常为英语版 Windows 的Program Files
)。参见第 2.3.3 节,“Windows 上的 MySQL Installer”。
重要提示
尽管 MySQL Installer 将大多数文件放在*PROGRAMDIR
*下,但默认情况下会将my.ini
安装在C:ProgramDataMySQLMySQL 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
应在选项文件中分别指定为quick
和host=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 FilesMySQLMySQL Server 8.0
,有几种方法可以实现。以下是一些示例:
basedir="C:Program FilesMySQLMySQL Server 8.0"
basedir="C:\Program Files\MySQL\MySQL Server 8.0"
basedir="C:/Program Files/MySQL/MySQL Server 8.0"
basedir=C:\ProgramsFiles\MySQL\MySQLsServers8.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 服务器:
[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.cnf
由mysqld处理,则仅使用/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:ProgramDataMySQLMySQL Servermyopts.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-file
,mysqld会读取mysqld-auto.cnf
,客户端程序会读取.mylogin.cnf
。
请参阅本节介绍有关此选项可能指定的位置的约束。
--defaults-group-suffix=*
str*
命令行格式 | --defaults-group-suffix=string |
---|---|
类型 | 字符串 |
默认值 | [none] |
不仅读取通常的选项组,还读取具有通常名称和后缀*str
*的组。例如,mysql客户端通常会读取[client]
和[mysql]
组。如果将此选项给出为--defaults-group-suffix=_other
,mysql还会读取[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
对于布尔选项,值 ON
、TRUE
、OFF
和 FALSE
也被识别(不区分大小写)。
如果一个选项以 --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
变量,控制其通信缓冲区的最大大小。要将mysql的max_allowed_packet
变量设置为 16MB 的值,请使用以下任一命令:
mysql --max_allowed_packet=16777216
mysql --max_allowed_packet=16M
第一个命令以字节为单位指定值。第二个以兆字节为单位指定值。对于需要数字值的变量,值可以附加K
、M
或G
后缀,表示 1024、1024²或 1024³的倍增器。(例如,用于设置max_allowed_packet
时,后缀表示千字节、兆字节或千兆字节的单位。)从 MySQL 8.0.14 开始,后缀也可以是T
、P
和E
,表示 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
,你可以使用表达式来赋值变量的值,在服务器启动时设置变量时不适用这一点。例如,以下行中的第一行在程序调用时是合法的,但第二行不是:
$> 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 选项默认值、期望值的选项和等号
按照惯例,分配值的长形式选项使用等号(=
)符号编写,就像这样:
mysql --host=tonfisk --user=jon
对于需要值的选项(即没有默认值的选项),等号是不需要的,因此以下内容也是有效的:
代码语言:javascript复制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)
省略其中一个选项所需的值会导致错误,如下所示:
代码语言:javascript复制$> 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
$>
关闭服务器后,按以下方式重新启动:
代码语言: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
来启动服务器,但这并没有产生预期的效果,如下所示:
$> 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会导致不同的错误:
代码语言:javascript复制$> mysql
mysql: unknown option '--user jon'
如果你在选项文件中写入host tonfisk
而不是host=tonfisk
,就会发生类似的错误。你必须使用等号:
[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 套接字文件:
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|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_password
或caching_sha2_password
认证插件进行身份验证的客户端。对于不使用这些插件进行身份验证的帐户,此选项将被忽略。如果不使用基于 RSA 的密码交换(例如客户端使用安全连接连接到服务器时),则也会被忽略。
如果--server-public-key-path=*
file_name*
被指定并指定了有效的公钥文件,则优先于--get-server-public-key
。
此选项仅在使用 OpenSSL 构建 MySQL 时可用。
有关sha256_password
和caching_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_ca
或ssl_capath
系统变量值。
要为服务器指定 CA 文件,请设置ssl_ca
系统变量。
--ssl-capath=*
dir_name*
命令行格式 | --ssl-capath=dir_name |
---|---|
类型 | 目录名 |
包含受信任 SSL 证书颁发机构(CA)证书文件的目录路径名,格式为 PEM。
要告诉客户端在与服务器建立加密连接时不验证服务器证书,请同时指定--ssl-ca
和--ssl-capath
。服务器仍然根据客户端账户的任何适用要求验证客户端,并且仍然使用服务器端指定的任何ssl_ca
或ssl_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|ON|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
设置为ON
或STRICT
会导致客户端在启动时产生警告并在非 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_CA
或VERIFY_IDENTITY
的--ssl-mode
值,还需要--ssl-ca
或--ssl-capath
,以提供与服务器使用的 CA 证书匹配的 CA 证书。 - 具有值不是
VERIFY_CA
或VERIFY_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|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 中添加。