运维

5/15/2022 Mysql

摘要

Mysql Version:5.7.36
官方文档:https://dev.mysql.com/doc/refman/ (opens new window)
样例表:下载

# 一:全球化和本地化

字符集:为字母和符号的集合; 编码:为某个字符集成员的内部表示; 校对:为规定字符如何比较的指令。

# 1.1 字符集和校对顺序

查看所支持的所有字符集:

SHOW CHARACTER SET;
1

查看所支持校对的完整列表:

SHOW COLLATION;
1

通常系统管理在安装时定义一个默认的字符集和校对。此外,也可以在创建数据库时,指定默认的字符集和校对。为了确定所用的字符集和校对,可以使用以下语句:

SHOW VARIABLES LIKE 'character%';
SHOW VARIABLES LIKE 'collation%';
1
2

可以在创建表指定字符集和校对

CREATE TABLE mytable (
	columnn1 INT,
	columnn2 VARCHAR(10)
) DEFAULT CHARACTER SET hebrew 
  COLLATE hebrew_general_ci;
1
2
3
4
5

指定了 hebrew 字符集和 hebrew_general_ci 校对顺序。

确认字符集和校对顺序:

  1. 如果指定 CHARACTER SET 和 COLLATE 两者,则使用这些值;
  2. 如果只确定 CHARACTER SET,则使用此字符集及其默认的校对;
  3. 如果既不指定 CHARACTER SET,也不指定 COLLATE,则使用数据库默认。

对列设置字符集:

CREATE TABLE mytable (
	columnn1 INT,
	columnn2 VARCHAR(10),
	columnn3 VARCHAR(10), CHARACTER SET latin1 COLLATE latin1_general_ci
) DEFAULT CHARACTER SET hebrew
  COLLATE hebrew_general_ci;
1
2
3
4
5
6

校对在对 ORDER BY 子句检索出来的数据排序时起重要的作用。如果你需要用与创建表时不同的校对顺序排序特定的SELECT语句,可以在SELECT语句自身中进行:

SELECT * FROM customers ORDER BY lastname, firstname COLLATE latin1_general_cs;
1

COLLATE 除了用于 ORDER BY 子句中使用以外,COLLATE 还可以用于 GROUP BY、HAVING、聚集函数、别名等。

# 二:安全管理

限制用户的权限,区分管理员、开发人员、用户等。

# 2.1 查看用户

MySQL用户账号和信息存储在名为 mysql 的MySQL数据库中。一般不需要直接访问 mysql 数据库和表,但有时需要直接访问。例如,需要获得所有用户账号列表时。可使用以下代码:

USE mysql;
SELECT host, user FROM user;
1
2

# 2.2 新增

CREATE USER ben IDENTIFIED BY 'p@$$w0rd';
1

IDENTIFIED BY:指定的密码为纯文本,MySQL将在保存到user表之前对其进行加密。

可以直接 INSERT INTO 到user表来新增用户,不过为了安全起见,一般不建议这样做。

# 2.3 重命名

RENAME USER ben TO bforta;
1

MySQL 5 及之后版本才支持 RENAME,之前的版本可使用 UPDATE 更新 user 表

# 2.4 删除

删除一个用户账号(以及相关的权限),使用 DROP USER 语句

DROP USER bforta;
1

MySQL 5 之前的版本,需要先用 REVOKE 删除与账号相关的权限,然后再用 DROP USER 删除账号。

# 2.5 设置访问权限

新创建的用户账号没有访问权限。它们能登录MySQL,但不能看到数据,不能执行任何数据库操作。

查看用户账号的权限,使用 SHOW GRANTS FOR

SHOW GRANTS FOR bforta;
1

上面的结果表明该用户无任何权限。其中 'bforta'@'%' 表示,MySQL的权限用户名和主机名结合定义。如果不指定主机名,则使用默认的主机名 %

使用 GRANTS 语句设置权限:

GRANT SELECT ON ccj_test.* TO bforta;
1

说明:授予用户 bforta 在 ccj_test 数据库的所有表使用 SELECT 访问权限。

撤销特定权限

REVOKE SELECT ON ccj_test.* FROM bforta;
1

被撤销的权限必须存在,否则会报错

GRANT 和 REVOKE 可在几个层次上控制访问权限:

  • 整个服务器,使用 GRANT ALLREVOKE ALL
  • 整个数据库,使用 ON database.\*
  • 特定的表,使用 ON database.table
  • 特定的存储过程。
权 限 说 明
ALL 除GRANT OPTION外的所有权限
ALTER 使用ALTER TABLE
ALTER ROUTINE 使用ALTER PROCEDURE和DROP PROCEDURE
CREATE 使用CREATE TABLE
CREATE ROUTINE 使用CREATE PROCEDURE
CREATE TEMPORARY TABLES 使用CREATE TEMPORARY TABLE
CREATE USER 使用CREATE USER、DROP USER、RENAME USER和REVOKE ALL PRIVILEGES
CREATE VIEW 使用CREATE VIEW
DELETE 使用DELETE
DROP 使用DROP TABLE
EXECUTE 使用CALL和存储过程
FILE 使用SELECT INTO OUTFILE和LOAD DATA INFILE
GRANT OPTION 使用GRANT和REVOKE
INDEX 使用CREATE INDEX和DROP INDEX
INSERT 使用INSERT
LOCK TABLES 使用LOCK TABLES
PROCESS 使用SHOW FULL PROCESSLIST
RELOAD 使用FLUSH
REPLICATION CLIENT 服务器位置的访问
REPLICATION SLAVE 由复制从属使用
SELECT 使用SELECT
SHOW DATABASES 使用SHOW DATABASES
SHOW VIEW 使用SHOW CREATE VIEW
SHUTDOWN 使用mysqladmin shutdown(用来关闭MySQL)
SUPER 使用CHANGE MASTER、KILL、LOGS、PURGE、MASTER 和SET GLOBAL。还允许mysqladmin调试登录
UPDATE 使用UPDATE
USAGE 无访问权限

简化多次授权

GRANT SELECT, INSERT ON ccj_test.* TO bforta;
1

# 2.6 更改密码

修改指定用户的密码

SET PASSWORD FOR bforta = Password('n3w p@$$w0rd');
1

新密码必须传递到 Password 函数进行加密

修改当前登录用户的密码

SET PASSWORD = Password('n3w p@$$w0rd');
1

# 三:数据库维护

# 3.1 备份数据

常用方式:

  • 可用命令行实用程序 mysqldump 转储所有数据库内容到某个外部文件。
  • 可用命令行实用程序 mysqlhotcopy 从一个数据库复制所有数据。
  • 可以使用MySQL的 BACKUP TABLESELECT INTO OUTFILE 转储所有数据到某个外部文件。这两条语句都要衔接将要创建的系统文件名,此系统文件必须不存在,否则会出错。数据可以用 RESTORE TABLE 来复原。

为了保证所有数据被写到磁盘(包括索引数据),需要在进行备份前使用 FLUSH TABLES 语句

# 3.2 数据库维护

ANALYZE TABLE:用来检查表键是否正确

ANALYZE TABLE orders;
1

CHECK TABLE:用来对表进行检查,在MyISAM表上还对索引进行检查。支持一系列的用于MyISAM表的方式。

CHECK TABLE orders, orderitems;
1

CHANGED:检查自最后一次检查以来改动过的表; EXTENDED:执行最彻底的检查; FAST:只检查未正常关闭的表; MEDIUM:检查所有被删除的链接并进行键检验; QUICK:只进行快速扫描。

  • 如果MyISAM表访问产生不正确和不一致的结果,可能需要用 REPAIR TABLE 来修复相应的表。这条语句不应该经常使用,如果需要经常使用,可能会有更大的问题要解决;
  • 如果从一个表中删除大量数据,应该使用 OPTIMIZE TABLE 来收回所用的空间,从而优化表的性能。

# 3.3 诊断启动问题

可以通过在命令行上执行 mysqld 启动

参数选项:

  • --help:显示帮助;
  • --safe-mode:装载减去某些最佳配置的服务器;
  • --verbose:显示全文本消息(为获得更详细的帮助消息与 --help 联合使用);
  • --version:显示版本信息然后退出

# 3.4 查看日志文件

MySQL主要的日志文件有如下几种:

  • 错误日志:它包含启动和关闭问题以及任意关键错误的细节。此日志通常名为 hostname.err,位于data目录中。此日志名可用 --log-error 命令行选项更改;
  • 查询日志:它记录所有MySQL活动,在诊断问题时非常有用。此日志文件可能会很快地变得非常大,因此不应该长期使用它。此日志通常名为 hostname.log,位于data目录中。此名字可以用 --log 命令行选项更改;
  • 二进制日志:它记录更新过数据(或者可能更新过数据)的所有语句。此日志通常名为 hostname-bin,位于data目录内。此名字可以用 --log-bin 命令行选项更改。注意,这个日志文件是MySQL 5中添加的;
  • 缓慢查询日志:顾名思义,此日志记录执行缓慢的任何查询。这个日志在确定数据库何处需要优化很有用。此日志通常名为 hostname-slow.log,位于 data 目录中。此名字可以用 --log-slow-queries 命令行选项更改。

在使用日志时,可用 FLUSH LOGS 语句来刷新和重新开始所有日志文件

# 四:性能优化

性能优化探讨和分析的一些出发点:

  • 首先,MySQL(与所有DBMS一样)具有特定的硬件建议。在学习和研究MySQL时,使用任何旧的计算机作为服务器都可以。但对用于生产的服务器来说,应该坚持遵循这些硬件建议;
  • 一般来说,关键的生产DBMS应该运行在自己的专用服务器上;
  • MySQL是用一系列的默认设置预先配置的,从这些设置开始通常是很好的。但过一段时间后你可能需要调整内存分配、缓冲区大小等。(为查看当前设置,可使用 SHOW VARIABLESSHOW STATUS);
  • MySQL一个多用户多线程的DBMS,换言之,它经常同时执行多个任务。如果这些任务中的某一个执行缓慢,则所有请求都会执行缓慢。如果你遇到显著的性能不良,可使用 SHOW PROCESSLIST 显示所有活动进程(以及它们的线程ID和执行时间)。可以用 KILL 命令终结某个特定的进程(使用这个命令需要作为管理员登录);
  • 总是有不止一种方法编写同一条SELECT语句。应该试着连接、并、子查询等,找出最佳的方法;
  • 使用 EXPLAIN 语句让MySQL解释它将如何执行一条SELECT语句;
  • 一般来说,存储过程执行得比一条一条地执行其中的各条MySQL语句快;
  • 应该总是使用正确的数据类型;
  • 决不要检索比需求还要多的数据。换言之,不要用SELECT *(除非你真正需要每个列)。
  • 有的操作(包括INSERT)支持一个可选的 DELAYED 关键字,如果使用它,将把控制立即返回给调用程序,并且一旦有可能就实际执行该操作;
  • 在导入数据时,应该关闭自动提交。你可能还想删除索引(包括FULLTEXT索引),然后在导入完成后再重建它们;
  • 必须索引数据库表以改善数据检索的性能。确定索引什么不是一件微不足道的任务,需要分析使用的 SELECT 语句以找出重复的 WHERE 和 ORDER BY 子句。如果一个简单的WHERE子句返回结果所花的时间太长,则可以断定其中使用的列(或几个列)就是需要索引的对象;
  • SELECT语句中有一系列复杂的OR条件吗?通过使用多条SELECT语句和连接它们的UNION语句,你能看到极大的性能改进;
  • 索引改善数据检索的性能,但损害数据插入、删除和更新的性能。如果你有一些表,它们收集数据且不经常被搜索,则在有必要之前不要索引它们。(索引可根据需要添加和删除);
  • LIKE很慢。一般来说,最好是使用 FULLTEXT 而不是 LIKE;
  • 数据库是不断变化的实体。一组优化良好的表一会儿后可能就面目全非了。由于表的使用和内容的更改,理想的优化和配置也会改变;
  • 最重要的规则就是,每条规则在某些条件下都会被打破;

# 五:参考文献

最后更新: 5/15/2022, 6:00:23 PM