MySQL服务器配置与管理

MySQL 服务器

通常所说的 MySQL 服务器指的是mysqld程序

1、mysqld 的系统变量和状态变量可以在启动时利用选项进⾏配置,要查看服务器的默认系统变量值和默认状态变量值,可以执⾏以下命令:

sql 复制代码
mysqld --verbose --help

系统变量的默认值

2、查看服务器在运⾏时系统变量的值,连接到MySQL并执⾏以下语句:

sql 复制代码
mysql> SHOW VARIABLES;

3、查看服务器在运⾏时的状态变量,连接到MySQL并执⾏以下语句:

sql 复制代码
 mysql> SHOW STATUS;

4、系统变量和状态信息也可以使⽤ mysqladmin命令来查看

sql 复制代码
root@guangchen-vm:~# mysqladmin variables
root@guangchen-vm:~# mysqladmin extended-status

查看系统变量

查看状态变量

系统变量和选项

简介:

1、当通过mysqld启动数据库服务器时,可以通过选项⽂件或命令⾏中设置选项,但是,在⼤多数情况下,为确保服务器每次运⾏时都使⽤相同的选项,最好的⽅法是在选项⽂件中指定相应的选项。

2、mysqld从选项⽂件中的 [mysqld] 和 [server] 组(节点)中读取选项内容

3、mysqld的选项可以通过 mysqld --verbose --help 查看,列表中的有些选项是可以在

服务器启动时设置的系统变量,系统变量可以在MySQL客户端命令行中使⽤ SHOW VARIABLES 语句查看。但有些选项只在 --help 中存在,使⽤ SHOW VARIABLES 时并没有显⽰,这是因为它们仅仅只是选项而不是系统变量

mysqld常⽤的选项和对应的系统变量:

utf8是校验规则的编码集,mb4表示"最多4个字节" ,0900表示unicode 9.0标准,ai Accent Insensitive(不区分重音),ci- Case Insensitive(不区分大小写)

设置系统变量

  1. 我们可以通过选项文件和命令⾏设置相应系统变量的值,选项文件设置系统变量需要移除前面的--,而且连接字段的得是_下划线。命令行设置系统变量的值,破折号和下划线可以互换使⽤。例如, --general_log=ON 和 --general-log=ON 是等价的。

  2. 如果使⽤命令行给系统变量设置⼀个数值时,可以带有后缀 K 、 M 或 G (⼤⼩写不限)表⽰ 1024 、1024^2 或 1024^3 ;从MySQL 8.0.14 开始,后缀也可以⽤ T 、 P 和 E 来表⽰ 1024^4 、

1024^5 或 1024^6 ,因为命令行具有解析的功能,但是配置文件不能使用这些单位,因为配置文件不解析单位。

  1. 系统变量有两个作⽤域,分别是 Global (全局)和 Session (会话), Global 全局变量影响服

务器的整体操作, Session 会话变量影响各个客⼾端连接的操作。给定的系统变量可以同时具有

全局值和会话值,它们的关系如下:

◦ 服务器启动时,会将每个全局变量初始化设置默认值,还会通过命令⾏或选项⽂件进行更改。

◦ 服务器为每个客⼾端维护⼀组 Session 变量,在客⼾端连接时使⽤相应全局变量的当前值进

⾏初始化,然后通过配置文件和命令行更改。

  1. ⼤部分系统变量是动态的,在服务器运⾏时可以通过 SET 语句动态更改,并且⽆需停⽌和重新启动服务器。在服务器运⾏时,使⽤ SET 语句设置系统变量,需要指定作⽤域(也可以在前⾯加上

@@ 修饰符),然后指定系统变量的名称,名称必须使⽤下划线⽽不是破折号,如下所⽰:
a. 设置全局系统变量最⼤连接数为1000

sql 复制代码
mysql> SET GLOBAL max_connections = 1000;
mysql> SET @@GLOBAL.max_connections = 1000;

b、将全局系统变量持久化到 mysqld-auto.cnf ⽂件(同时设置运⾏时值):

sql 复制代码
# PERSIST 表⽰持久化的同时设置全局变量的值

mysql> SET PERSIST max_connections = 1000;
mysql> SET @@PERSIST.max_connections = 1000;

实验案例过程和总结:

第一 ,我们在bash命令行执行systemctl start mysql这样的命令时,实际的执行者并不是当前的系统用户,而是mysql用户**。第二,**我们进入了mysql客户端,然后去操作系统时,实际操作用户也不是进入mysql客户端时的系统用户,还是mysql用户。明白这两点可以理解很多权限问题

/var/lib/mysql是数据目录,里面并没有mysqld-auto.cnf,我们执行set persist命令后会自动创建

set persist会设置全局系统变量,并且在/var/lib/mysql/mysqld-auto.cnf中也设置该系统变量,这样当mysqld重启时便会初始化为默认之后走配置文件,最后max_connections系统变量就为1000

c. 将全局系统变量持久化到 mysqld-auto.cnf ⽂件(不设置运⾏时的全局变量值):

sql 复制代码
mysql> SET PERSIST_ONLY max_connections = 1000;
mysql> SET @@PERSIST_ONLY.max_connections = 1000;

set persist_only会在/var/lib/mysql/mysqld-auto.cnf中设置该系统变量,但是不会像set persist一样修改全局系统变量

d、删除持久化的系统变量可以使⽤语句

sql 复制代码
 RESET PERSIST IF EXISTS system_var_name;

e. 设置 Session 系统变量,时区为"+8:00":

sql 复制代码
mysql> SET SESSION time_zone='+8:00';
mysql> SET @@SESSION.time_zone='+8:00';
mysql> SET @@time_zone='+8:00';

5、对于数值型的系统变量,⽤带有单位的值指定时,只适⽤于选项⽅式,⽽不能⽤在 SET ⽅式中;SET ⽅式可以使⽤计算表达式为系统变量指定值,⽽在选项⽅式中不允许,如下所⽰:

sql 复制代码
选项形式
root@guangchen-vm:~# mysqld --max_allowed_packet=16M # 允许
root@guangchen-vm:~# mysqld --max_allowed_packet=16*1024*1024 # 不允许

# 运⾏时SET形式
mysql> SET GLOBAL max_allowed_packet=16M; # 不允许
mysql> SET GLOBAL max_allowed_packet=16*1024*1024; # 允许

没有明确指定 GLOBAL 和 SESSION 时,对于当前客⼾端来说 SESSION 的优先级更⾼

6. 要显⽰系统变量名称和值,请使⽤以下 SHOW VARIABLES 语句:

7. 可以使⽤ LIKE ⼦句显⽰与指定内容匹配的变量,也可以使⽤通配符

sql 复制代码
# 查看指定的系统变量
SHOW VARIABLES LIKE 'max_join_size';
# 查看指定系统变量SESSION作⽤域的值
SHOW SESSION VARIABLES LIKE 'max_join_size';
# 查看包含指定内容的系统变量
SHOW VARIABLES LIKE '%size%';
# 查看包含指定内容系统变量的GLOBAL作⽤域的值
SHOW GLOBAL VARIABLES LIKE '%size%';

mysqld服务器常用配置

也就是说,/etc/mysql/mysql.cnf是最终的配置文件,/etc/mysql/my.cnf 是其软连接

查看状态变量

MySQL服务器维护着当前系统信息的状态变量

可以使⽤ SHOW [GLOBAL | SESSION] STATUS [like status_name]; 语句查看这些变量

和对应的值。

MySQL数据⽬录

MySQL 服务器的管理信息、业务数据、⽇志⽂件、磁盘缓冲⽂件默认存储在数据录/var/lib/mysql下,数据⽬录⼀般包含以下内容:

  1. 数据⽬录下的每个⼦⽬录都是⼀个数据库⽬录,对应服务器管理的⼀个数据库,包括MySQL 安装成功后创建的标准数据库:

a. mysql⽬录对应于mysql系统库,包含mysql服务器运⾏时所需的信息,该数据库包含数据字典

表和系统表;

b. performance_schema⽬录对应于Performance Schema,提供了在运⾏时⽤于检查服务器内部执行的信息

c. sys⽬录对应于sys系统库,提供⼀组对象来帮助解释性能模式相关信息;

d. 其他⼦⽬录对应于⽤⼾或应⽤程序创建的数据库,也就是说我们每创建⼀个数据库,就会在数

据⽬录⽣成⼀个同名的⽬录来保存对应的数据。

  1. 服务器写⼊的⽇志⽂件

  2. InnoDB 表空间和⽇志⽂件

  3. 默认或⾃动⽣成的 SSL 和 RSA 证书和密钥⽂件

  4. 服务器进程 ID ⽂件(当服务器运⾏时)

  5. mysqld-auto.cnf ⽂件⽤来存储持久化全局系统变量设置

通过选项重新配置服务器,可以将上述某些项⽬重新定位到指定⽬录

7、通过选项重新配置服务器,可以将上述某些项⽬重新定位到指定⽬录。使⽤ --datadir 选项允许更改数据⽬录本⾝的位置

⽇志简介

MySQL Server 有以下⼏种⽇志,可以记录服务器正在发⽣的活动

1、Linux下默认开启错误⽇志和⼆进制⽇志

2、在服务器运⾏期间可以控制⼀般查询和慢查询⽇志的禁⽤与开启,也可以更改⽇志⽂件名

3、⼀般查询⽇志和慢查询⽇志记录可以写⼊⽇志表、⽇志⽂件或两者同时写⼊

4、默认情况下,所有启⽤的⽇志都会写⼊数据⽬录的日志文件中,可以通过刷新⽇志强制服务器关闭并重新打开⽇志⽂件

5、通过 FLUSH LOGS 语句刷新⽇志来强制服务器关闭并重新打开⽇志⽂件,也可以使⽤

mysqladmin 的 flush-logs 或 refresh 参数,或mysqldump 的 --flush-logs 或 --master-data 选项

⼀般查询⽇志和慢查询⽇志的输出形式

如果启⽤⼀般查询⽇志和慢查询⽇志,⽇志的输出⽅式可以指定为⽇志⽂件或 mysql 系统库中

的 general_log 和 slow_log 表,也可以两者同时指定

一般查询⽇志和慢查询日志启动时的控制

1、log_output 系统变量指定⽇志输出的形式,但并不会启⽤⽇志。 log_output 可以有

三个值,分别是: TABLE (表)、 FILE (⽂件)、 NONE (不输出),可以同时指定多个值,并⽤逗

号隔开,未指定值时默认是 FILE ,如果列表中存在 NONE 则其他的不⽣效,也就是说 NONE 的

优先级最⾼,如果有多个值那只有一种组合那就是(FILE,TABLE)。

2、通过设置 general_log 系统变量的值来控制⼀般查询⽇志的 开启 1 与 禁⽤ 0 ,如果要为⽇

志指定⾃定义的路径或⽂件名可以使⽤ general_log_file 系统变量

3、通过设置 slow_query_log 系统变量的值来控制慢查询⽇志的 开启 1 与 禁⽤ 0 ,如果要为

⽇志指定⾃定义的路径或⽂件名可以使⽤ slow_query_log_file 系统变量

运⾏时的⽇志控制

1、在运⾏时修改 log_output 的值,以更改⽇志的输出形式,通过语句控制
• 语法:SET [GLOBAL|SESSION] variable_name=value

sql 复制代码
SET GLOBAL log_output=[FILE, TABLE, NONE]

2、general_log[={0|1}] 和 slow_query_log[={0|1}] 可以表⽰启⽤和禁⽤⼀般查询⽇

志和慢查询⽇志

3、general_log_file 和 slow_query_log_file 表⽰通⽤查询⽇志和慢查询⽇志⽂件名称

查看日志表

一般查询日志

1、General query log - ⼀般查询⽇志,记录客⼾端连接或断开连接的信息,也会记录从客⼾端接收的每个SQL语句。如果开启将会产⽣⼤量的内容,⾮常耗费服务器资源,所以默认为关闭(不开启),要启⽤⼀般查询⽇志可以使⽤:请使⽤ --general_log[={0|1}]

2、默认⽇志⽂件名为 host_name.log ,可以使⽤ general_log_file=file_name 修改;

3、 记当客⼾端连接的⽇志⾏,使⽤ connection_type 来指⽰⽤于建⽴连接的协议。 TCP/IP 表

⽰不使⽤SSL建⽴的TCP/IP连接、 SSL/TLS 表⽰使⽤SSL建⽴的TCP/IP连接、 Socket 表⽰

Unix套接字⽂件连接、 Named Pipe 表⽰Windows命名管道连接、 Shared Memory 表⽰

Windows共享内存连接。

可以使用cast(argument as char)来将参数列改成字符串

慢查询日志

1、慢查询⽇志由执⾏时间超过系统变量 long_query_time 指定的秒数的 SQL 语句组成,并且检

查的数据⾏数⼤于系统变量 min_examined_row_limit 指定值。

2、获取初始锁的时间不计⼊执⾏时间,mysqld在执⾏完SQL语句并释放所有锁后才将符合条件的语句写⼊慢速查询⽇志,因此⽇志顺序可能与执⾏顺序不同。

慢查询⽇志参数

1、long_query_time 的默认值是10,最⼩值是0;

2、默认情况下,不记录管理语句,不记录不使⽤索引的查询

3、默认为关闭(不开启)慢查询日志,要启⽤慢查询⽇志可以使⽤:请使⽤ --slow_query_log[={0|1}] .

4、默认⽇志⽂件名为 host_name-slow.log ,可以使⽤slow_query_log_file=file_name 修改;

5、服务器使⽤ --log-short-format 选项,以简要格式记录慢查询⽇志

6、如果要记录管理语句,启⽤ log_slow_admin_statements 系统变量。

管理语句包括 ALTER TABLE 、 ANALYZE TABLE 、 CHECK TABLE 、 CREATE INDEX 、 DROP INDEX 、OPTIMIZE TABLE 和 REPAIR TABLE 。

7、要记录不使⽤索引的查询,启⽤ log_queries_not_using_indexes 系统变量。

当记录不使⽤索引的查询时,⽇志会快速增⻓,通过设置系统变量log_throttle_queries_not_using_indexes 限制每分钟写⼊慢查询⽇志同类查询的数量,默认值是0,表⽰⽆限制。

慢查询日志内容

FILE格式

1、如果启⽤慢查询⽇志并将 FILE 作为输出⽬标,每条语句前⾯都⽤⼀⾏来表⽰⽇志的字段,该⾏以 # 字符开头并包含以下内容:

◦ Query_time: :SQL语句的执⾏时间,单位秒

◦ Lock_time: 获取锁的时间,单位秒

◦ Rows_sent: 发送到客⼾端的⾏数

◦ Rows_examined: 服务器检查的⾏数

2、启⽤--log-slow-extra[={OFF|ON}]系统变量会将以下额外字段写⼊到FILE中,TABLE形式不受影响

◦ Thread_id: 线程标识符

◦ Errno: 错误码,没有发⽣错误则为 0

◦ Killed: 如果语句被终⽌,⽤错误码表⽰原因,如果语句正常终⽌则为 0。

◦ Bytes_received: 接收到SQL语句的Bytes值。

◦ Bytes_sent: 返回给客⼾端的Byte值。

◦ Read_first: 索引中第⼀个条⽬被读取的次数,如果这个值很⾼,表明服务器正在执⾏⼤

量完整索引扫描

◦ Read_last:读取索引中最后⼀个键的请求数,使⽤ ORDER BY 时关注

Read_key: 基于索引读取⼀⾏数据的请求数。如果这个值很⾼,表明表为当前查询建⽴了

正确的索引

◦ Read_next: 按索引排序读取下⼀⾏的请求数,查询具有范围约束的索引列,或者进⾏索引

扫描,此值将递增。

◦ Read_prev: 按索引排序读取前⼀⾏的请求数。主要⽤于优化ORDER BYDESC。

◦ Read_rnd: 基于固定位置读取⼀⾏的请求数。这个值很⾼表⽰,正在执⾏⼤量需要对结果进

⾏排序的查询,可能有很多查询进⾏了全表扫描整,或者没有正确使⽤索引的连接。

◦ Read_rnd_next: 读取数据⽂件中下⼀⾏的请求数。如果进⾏⼤量的表扫描,这个值会很

⾼。通常,表⽰表没有建⽴正确地索引,或者查询没有利⽤索引。

◦ Sort_merge_passes: 排序算法完成的归并次数,如果这个值很⼤,考虑增加

sort_buffer_size 系统变量的值。

◦ Sort_range_count: 使⽤范围进⾏排序的次数。

◦ Sort_rows: 排序的⾏数。

◦ Sort_scan_count: 通过扫描表完成的排序数。

◦ Created_tmp_disk_tables: 服务器在执⾏语句时创建内部磁盘临时表的数量。

◦ Created_tmp_tables: 服务器在执⾏语句时创建的内部临时表的数量。

◦ Start: 执⾏SQL语句开始时间

◦ End: 执⾏SQL语句结束时间

TABLE格式

错误日志

错误⽇志⼀般会记录mysqld 启动和关闭的次数 、诊断消息,以及服务器运⾏期间发⽣的错误
;例如MySQL需要⾃动检查或修复⼀个表,就会在错误⽇志中写⼊⼀条记录。错误⽇志默认使⽤UTF-8 ( utf8mb3 )编码格式,并使⽤英语⽣成记录。

Unix 和Linux 系统的默认错误⽇志路径

在 Unix 和Linux 系统中,mysqld使⽤ --log-error 选项来指定默认错误⽇志⽬标,可以指定控制
台stderr或是⽂件:

• 如果错误⽇志输出⽬标是控制台,则服务器将 log_error 系统变量设置为 stderr . 否则,将

以⽂件形式输⼊错误⽇志,并以 log_error 的值为⽂件名。

• 如果显⽰写出 --log-error 但没有指定具体⽂件,则默认路径是数据⽬录中error.log 的⽂件, 可以通过指定绝对路径,来更改默认的⽇志位置

错误⽇志中事件的字段

1、核⼼错误事件字段

time :件时间戳,精度为微秒;

msg :事件消息字符串;

prio :事件优先级,包括 System event - 系统(0)、 Error event - 错误(1)、 Warning

event - 警告(2)或 Note/information event - 通知/提⽰事件(3),值越⼩优先级越⾼;

err_code :事件错误代码;

err_symbol :以字符串形式表⽰的事件错误符,例如 'ER_DUP_KEY' ;

SQL_state :事件 SQLSTATE 值,与 err_symbol 对应,例如 'ER_DUP_KEY' 对应的

SQLSTATE为23000

subsystem :事件发⽣的⼦系统。可能的值: InnoDB (InnoDB存储引擎)、 Repl (复制⼦系

统)、 Server

2、可选错误事件字段

OS_errno :操作系统错误号;

OS_errmsg :操作系统错误消息;

label :与值对应的 prio 描述 ;

user :客⼾端⽤⼾;

host :客⼾端主机;

thread :产⽣错误事件 的线程的 ID;

query_id :查询 ID

error.log中的日志内容

刷新错误⽇志⽂件和重命名

1、如果使⽤ FLUSH ERROR LOGS 、 FLUSH LOGS 语句或 mysqladmin flush-logs 命令刷

新错误⽇志,服务器会将正在写⼊的任何错误⽇志⽂件关闭并重新打开。

2、如果要⼿动重命名错误⽇志⽂件,可以在重命名操作之后执⾏刷新操作,服务器会以原⽂件名⽣成⼀个新的错误⽇志⽂件,例如⽇志⽂件名为 host_name.err ,可以按以下步骤操作

bash 复制代码
mv host_name.err host_name.err-old # 重命名⽇志⽂件
mysqladmin flush-logs # 刷新操作
mv host_name.err-old backup-directory # 把重命名的⽇志⽂件移动到备份⽬录

⼆进制⽇志

介绍

1、⼆进制⽇志包含数据库更改的"事件",以事务为单位,不会记录 SELECT 和 SHOW ,记录表的创建操作或表数据的更改,⼆进制⽇志还包含每个语句更新数据时花费的时间信息,启动⼆进制⽇志,对服务器性能稍微有些影响

2、⼆进制⽇志的作⽤:

主从节点数据复制 :从节点服务器读取主节点服务器上的⼆进制⽇志⽂件,并根据⼆进制⽇志

中记录的事件在从节点上执⾏相同的操作,保证主从节点服务器上数据⼀致,实现数据复制功

能。

数据恢复 :从某个时间点恢复备份数据后,将重新执⾏备份时间点之后记录在⼆进制⽇志中的

事件,如t1<target_time<t2,t2有问题,先恢复到t1,之后再执行到tartget

3、⼆进制⽇志的语句中如果涉及⽤⼾的密码,则由服务器进⾏加密,不会以纯⽂本形式出现

选项和变量

1、查看⼆进制⽇志相关的系统变量

2、查看⼆进制⽇志相关的状态变量

3、默认情况下启⽤⼆进制⽇志, log_bin 系统变量为 ON 。如果要禁⽤⼆进制⽇志,可以指定 --skip-log-bin 或 --disable-log-bin 选项

4、选项 --log-bin[=base_name] ⽤于指定⼆进制⽇志⽂件的路径和基本名称,如果不指定 --log-bin 选项,默认路径为数据路径,基本名称为 binlog

5、⼆进制⽇志⽂件名是由基本名+数字扩展名组成的,服务器每次创建⼀个新的⽇志⽂件时,数字扩展名都会增加,从⽽保证有序的⽂件系列,发⽣以下事件时,服务器都会再创建⼀个新的⽇志⽂件:

◦ 服务器启动时

◦ 服务器刷新⽇志

◦ 当前二进制⽇志⽂件的⼤⼩达到 max_binlog_size**(**单个⽇志⽂件的最⼤字节数,最⼩值 4096 字节,最⼤值和默认值 1GB)

⼆进制⽇志⽂件⼤⼩可能会超出 max_binlog_size 设定的值,因为⼆进制⽇志在记录事务

时,会完整的记录整个事务,不存在把⼀个事务拆分的情况,如果遇到⼀个⼤事务时,即使记录

整个事务会超过⽇志⼤⼩限制,也会保证事务的完整性

6、mysqld还会创建⼀个二进制日志索引⽂件,默认情况下,索引文件与⼆进制⽇志⽂件具有相同的基本名称,扩展名为 .index . 可以使⽤选项 --log-bin-index[=file_name]修改路径和索引⽂件名

7、⼆进制⽇志⽂件和索引⽂件的默认位置是数据⽬录。可以使⽤ --log-bin[=file_name] 选项

指定路径和基本名, file_name 格式 = 绝对路径+基本名。 --log-bin 对应的系统变量是

log_bin_basename,而不是log_bin, log_bin系统变量表示是否开启二进制日志

8、在⼀个未提交的事务中,对⽀持事务的表(如InnoDB表)的更改都会被缓存(UPDATE, DELETE或INSERT),直到事务commit,mysqld在执⾏ COMMIT 之前会先将整个事务写⼊⼆进制⽇志

9、当客户端执行事务的线程启动时,它会分配⼀个⼤⼩为 binlog_cache_size 的缓冲区来缓存语句。如果语句⼤⼩⼤于缓冲区的值,线程则打开⼀个临时⽂件来存储事务,临时⽂件在线程结束时删除

10、系统变量 max_binlog_cache_size (默认值和最⼤值都是 4GB,最⼩值为 4096)⽤于限制

缓存区⼤⼩,如果事务语句⼤于这个值指定的字节数,事务将会失败并回滚

11、如果使⽤基于⾏的⽇志记录⽅式, 为了保证⽇志的准确性, CREATE ... SELECT 或

INSERT ... SELECT 语句的并发插⼊将转换为普通插⼊,如果使⽤基于语句的⽇志记录⽅式,则将原始语句写⼊⽇志

查看⼆进制⽇志

1、使⽤客⼾端⼯具mysqlbinlog查看

sql 复制代码
mysqlbinlog binlog.000001 > binlog.000001.txt

binlog.000001.txt 的内容

2、通过SQL语句查看

sql 复制代码
mysql> show binlog events in 'binlog.000001' from N limit S;
  1. FROM 5

    • 指定从哪个​​位置 (Position)​ ​ 开始显示事件。这里的 5指的是二进制日志文件中的​​字节偏移量 (byte offset)​​。

    • ​重要:​FROM后面跟的是​​位置 (Pos)​​,不是行号或事件编号。它表示从文件开头跳过多少字节后开始读取事件。

  2. LIMIT 3

    • 限制只显示 ​​3 个事件​​。这在你只想查看日志开头或特定位置附近的少量事件时非常有用,避免输出过长。

⼆进制⽇志格式

记录⼆进制⽇志时使⽤的格式有以下⼏种

1、 基于语句的⽇志格式,最初MySQL 是基于 SQL 语句复制实现主从节点同步,通过指定选项 --

binlog-format=STATEMENT 使⽤此格式 。

2、基于⾏的⽇志格式(默认)中,主节点将事件写⼊⼆进制⽇志,表⽰各个表的⾏受到的影响,可以过指定选项 --binlog-format=ROW 使⽤此格式 。

3、混合⽇志记录格式,改格式下默认使⽤基于语句的⽇志记录,如果MySQL认为基于语句的格式不能保证主从复制过程中的数据安全时,会⾃动切换到基于⾏的⽇志格式,⽐如主节点在语句中⽤了UUID() 函数,那么⽇志⽂件中记录的是UUID⽣成的真实值⽽不是直接使⽤原始的SQL语句,使

⽤混合⽇志格式中以指定选项 --binlog-format=MIXED 。

TIPS: 设置⼆进制⽇志格式 --binlog-format=[STATEMENT|ROW|MIXED]

基于语句与基于⾏的区别

sql 复制代码
# 基于语句,记录执⾏的SQL语句
update student set age = 18 where id between 10 and 20;
# 基于⾏,记录每⼀⾏的更改
update student set age = 18 where id = 10;
update student set age = 18 where id = 11;
update student set age = 18 where id = 12;
...
update student set age = 18 where id = 19;
update student set age = 18 where id = 20;

服务器⽇志维护

1、默认⼆进制⽇志的过期时间为30天,过期后将⾃动删除,要指定⾃定义过期时间,可以使⽤系统变量 binlog_expire_logs_seconds=N 单位为秒,在下⼀次启动服务器和刷新⽇志时删除过期

⽇志⽂件

2、如果要使⽤新的⽇志⽂件的话,可以⼿动刷新⽇志,当执⾏ FLUSH LOGS 语句或 mysqladmin flushlogs 、 mysqladmin refresh 、 mysqldump --flush-logs 、 mysqldump --

master-data 命令时,会发⽣⽇志刷新。此外当⼆进制⽇志⽂件⼤⼩达到

max_binlog_size 系统变量指定的值时,服务器会⾃动刷新⼆进制⽇志。

如果是二进制日志文件,日志刷新会关闭原日志文件的文件描述符,然后打开一个新日志文件,数字拓展名加1

如果是其他日志文件,比如一般查询日志、慢查询日志,那日志刷新就是关闭日志文件的文件描述符,然后再打开同名文件

3、FLUSH LOGS ⽀持可选的修饰符以启⽤个别⽇志的选择性刷新:

sql 复制代码
FLUSH BINARY LOGS # 刷新⼆进制⽇志
FLUSH ERROR LOGS # 刷新错误⽇志
FLUSH GENERAL LOGS # 刷新⼀般查询⽇志
FLUSH RELAY LOGS # 刷新中继⽇志
FLUSH SLOW LOGS # 刷新慢查询⽇志

mysql系统数据库(mysql schema)

mysql系统数据库包含数据字典表和⽤于其他操作⽬的的系统表。数据字典表和系统表位于数据⽬录下⼀个名为 mysql.ibd 的表空间⽂件中,使⽤的是InnoDB存储引擎。

数据字典表是受保护的,所以我们在系统数据库中看不到数据字典表

数据字典

MySQL 的数据字典,⽤来存储有关数据库对象⾃⾝的信息,不可以随意修改,否则可能造成服务

器⽆法运⾏,以下列出⼏个常⻅的数据字典表:

cpp 复制代码
◦ character_sets :有关可⽤字符集的信息

◦ check_constraints :有关表上定义的 CHECK 约束的信息
◦ collations :每个字符集的排序规则信息
◦ column_type_elements :列类型的信息
◦ columns :有关表中列的信息
◦ indexes : 有关表索引的信息
◦ tables :有关数据库中表的信息
◦ tablespace_files :有关表空间使⽤的⽂件信息
◦ tablespaces :有关活动表空间的信息
◦ triggers :有关触发器的信息

mysql系统数据库也是数据库,所以逻辑上对应的文件应该是/var/lib/mysql/mysql/,但更高版本的mysql使用/var/lib/mysql/mysql.idb来实际存储mysql系统数据库的系统表和数据字典表

数据字典表是受保护的,所以我们在系统数据库中看不到数据字典表

INFORMATION_SCHEMA 数据库实现了某些数据字典的视图,可以通过视图查看某些数据字典的内容:

系统表

系统表按功能⼤致可以分为以下⼏类:权限授予系统表、对象信息系统表、⽇志系统表、服务器端帮助系统表、时区系统表、复制系统表、优化器系统表、杂项系统表。mysql系统库中的表如下所⽰:

权限授予系统表

包含有关⽤⼾帐⼾及帐⼾拥有的权限授权信息,主要的表有:

cpp 复制代码
• user :⽤⼾帐⼾、全局权限和其他列。
• global_grants :为⽤⼾分配的动态全局权限;
• db :数据库级权限。
• tables_priv :表级权限。

• columns_priv : 列级权限。
• procs_priv : 存储过程和函数权限。
• proxies_priv : 代理⽤⼾权限。
• default_roles :列出了⽤⼾连接和认证后要激活的默认⻆⾊。
• role_edges : user 表的关联表,区分 user 表中某⼀⾏记录是帐⼾还是⻆⾊
• password_history :密码更改的信息

对象信息系统表

包含有关组件、可加载的服务器插件和函数的信息:

cpp 复制代码
component :使⽤ INSTALL COMPONENT 安装的服务器组件,表中列出了在服务器启动期间安装的组件。
func : 使⽤ CREATE FUNCTION 安装的可加载函数,表中列出了在服务器启动期间加载的函数。
plugin :使⽤ INSTALL PLUGIN 安装的服务器插件,表中列出了在服务器启动期间安装的插
件。

⽇志系统表

服务器使⽤⽇志系统表进⾏⽇志记录:

cpp 复制代码
• general_log :⼀般查询⽇志表。
• slow_log :慢查询⽇志表。
⽇志表使⽤ CSV 存储引擎

服务器端帮助系统表

包含服务器端帮助信息:

• help_category :有关帮助类别的信息。

• help_keyword :与帮助主题关联的关键字。

• help_relation :帮助关键字和主题之间的映射。

• help_topic :帮助主题内容。

时区系统表

包含时区信息:

• time_zone :时区 ID 以及是否使⽤闰秒。

• time_zone_leap_second :发⽣闰秒时如何修正。

• time_zone_name: 时区 ID 和名称之间的映射

• time_zone_transition , time_zone_transition_type : 时区说明及偏移量。

复制系统表

服务器使⽤以下系统表来⽀持复制,有关复制的内容我们在主从复制专题中详细介绍

• gtid_executed :⽤于存储 GTID 的值。

• ndb_binlog_index :⽤于NDB Cluster 复制的⼆进制⽇志信息。只有在⽀持 NDB CLUSTER 的服务器才会创建此表,我们的课程不讨论NDB 的相关内容

• slave_master_info , slave_relay_log_info , slave_worker_info : ⽤于存储从节点服务器上的复制信息。

以上⼏张表都使⽤ InnoDB 存储引擎。

优化器系统表

这些系统表供优化器使⽤:

• innodb_index_stats , innodb_table_stats : ⽤于 InnoDB 的持久优化器统计信息。

• server_cost , engine_cost :优化器成本模型使⽤的表,包含查询期间发⽣的操作成本估

算信息。 server_cost 包含服务器操作的优化器成本估算。 engine_cost 包含对特定存储

引擎操作的估计。

杂项系统表

• audit_log_filter , audit_log_user : 如果安装了 MySQL Enterprise Audit,存储审计

⽇志过滤器定义和⽤⼾帐⼾。

• firewall_group_allowlist , firewall_groups , firewall_memebership ,

firewall_users , firewall_whitelist :如果安装了 MySQL Enterprise Firewall,这

些存储表防⽕墙的使⽤信息。

• servers :由 FEDERATED 存储引擎使⽤。

• innodb_dynamic_metadata :由 InnoDB 存储引擎⽤来存储快速变化的表元数据,例如⾃

动递增计数器值和索引树损坏标志

相关推荐
wanhengidc4 小时前
云手机能够做些什么?
运维·服务器·人工智能·智能手机·云计算
2401_865854884 小时前
腾讯云手机适用于哪些人群
服务器
程序新视界5 小时前
MySQL“索引失效”的隐形杀手:隐式类型转换,你了解多少?
数据库·mysql·dba
Logintern095 小时前
windows如何设置mongodb的副本集
数据库·windows·mongodb
XYiFfang5 小时前
【MYSQL】SQL学习指南:从常见错误到高级函数与正则表达式
sql·mysql·正则表达式·regexp_like·group_concat
啊?啊?6 小时前
1 玩转Linux命令行:基础文件操作实战教程
linux·服务器·基础指令
叫我龙翔6 小时前
【MySQL】从零开始了解数据库开发 --- 数据表的约束
android·c++·mysql·数据库开发
一个不秃头的 程序员6 小时前
从 0 到上线、长期运行、后续更新的**全流程**(适配 CentOS 服务器)
linux·服务器·centos
RestCloud6 小时前
在制造业数字化转型浪潮中,数据已成为核心生产要素。然而,系统割裂、数据滞后、开发运维成本高等问题,却像顽固的 “数据枷锁”,阻碍着企业发展。ETLCloud与
数据库·postgresql