mysqld服务器程序工做特性的定义方式:node
1. 命令行选项:重启失效,对当前会话有效。mysql
2. 配置文件参数:需重启才能生效。sql
服务器参数/变量:设定MySQL的运行特性;数据库
查看运行特性的方法:缓存
mysql> SHOW GLOBAL|[SESSION] VARIABLES [LIKE clause];安全
状态(统计)参数/变量:保存MySQL运行中的统计数据或状态数据,没法更改,只能重置。服务器
查看状态参数的方法:session
mysql> SHOW GLOBA|[SESSION] STATUS [LIKE clause];数据结构
显示单个变量设定值的方法:架构
mysql> SELECT @@[global.|session.]system_var_name
%:匹配任意长度的任意字符;
_:匹配任意单个字符;
变量/参数级别:
全局:为全部会话设定默认。管理员可修改。
会话:跟单个会话相关;会话创建会从全局继承;
服务器变量的调整方式:
运行时修改:
global:仅对修改后新创建的会话有效。
session:仅对当前会话有效,且当即生效。
启动前经过配置文件修改:
重启后生效;
运行时修改变量值操做方法:
SET [GLOBAL | SESSION] system_var_name = expr
SET [@@global. | @@session. | @@]system_var_name = expr
例:
MariaDB [(none)]> SHOW VARIABLES LIKE 'innodb%';
MariaDB [(none)]> SHOW VARIABLES LIKE 'innodb_file%';
+--------------------------+----------+
| Variable_name | Value |
+--------------------------+----------+
| innodb_file_format | Antelope |
| innodb_file_format_check | ON |
| innodb_file_format_max | Antelope |
| innodb_file_per_table | OFF |
+--------------------------+----------+
4 rows in set (0.00 sec)
MariaDB [(none)]> SELECT @@global.innodb_file_per_table; #查看特定变量的值
+--------------------------------+
| @@global.innodb_file_per_table |
+--------------------------------+
| 0 |
+--------------------------------+
1 row in set (0.00 sec)
什么是事务
一组原子性的SQL查询、或者是一个或多个SQL语句组成的独立工做单元;
通俗地讲:假如一个操做分两个步骤,两个步骤都成功才算一个事务执行成功。有一个不成功都不算成功。
事务日志的保存位置:
磁盘上一段连续的空间。事务日志有多个文件,必须成组出现,通常两个,三个也能够。一个文件写满写第二个文件。第一个文件的内容当即写入磁盘中。
事务先追加至事务日志,操做所有完成后同步到磁盘上。
事务日志定义:
放在mysqld配置段中,或者mariadb或者server配置段中。
innodb_log_files_in_group 事务日志文件
innodb_log_group_home_dir 事务日志存放路径,默认存放在数据文件下。
innodb_log_file_size 事务日志大小,字节为单位
innodb_mirrored_log_groups 事务日志有几个境像组。默认1个,放在不一样的存储设备中。
若是一个存储引擎知足ACID测试,则说明它支持事务:
A:AUTOMICITY,原子性;整个事务中的全部操做要么所有成功执行,要么所有失败后回滚;
C:CONSISTENCY,一致性;数据库老是应该从一个一致性状态转为另外一个一致性状态;
I:ISOLATION,隔离性;一个事务所作出的操做在提交以前,是否能为其它事务可见;出于保证并发操做之目的,隔离有多种级别;
D:DURABILITY,持久性;事务一旦提交,其所作出的修改会永久保存;
事务的控制:
自动提交事务:
mysql默认自动启动事务,每一个操做都是一个事务,这对服务器性能有所影响,一般须要关掉,本身显式启动事务,显式关闭事务。
mysql> SELECT @@autocommit; #查询当前事务级别
+------------------------+
| @@autocommit |
+------------------------+
| 1 |
+------------------------+
mysql> SET @@session.autocommit=0; #关闭单语句事务
MariaDB [mydb]> START TRANSACTION; #开启事务
手动控制事务:
启动:START TRANSACTION
提交:COMMIT 提交后没法撤消
回滚:ROLLBACK
设置断点:SAVEPOINT identifier
事务回滚:ROLLBACK [WORK] TO [SAVEPOINT] identifier
释放断点:RELEASE SAVEPOINT identifier
例:
MariaDB [mydb]> select * from tbl1;
+------+--------------+------+
| id | name | age |
+------+--------------+------+
| 1 | tom | 11 |
| 2 | jerry | 12 |
| 3 | obama | 10 |
| 4 | dasheng | 127 |
| 5 | bajie | 20 |
| 7 | xuedao Laozu | 67 |
+------+--------------+------+
6 rows in set (0.00 sec)
MariaDB [mydb]> DELETE FROM tbl1 WHERE name='bajie';
Query OK, 1 row affected (0.00 sec)
MariaDB [mydb]> select * from tbl1;
+------+--------------+------+
| id | name | age |
+------+--------------+------+
| 1 | tom | 11 |
| 2 | jerry | 12 |
| 3 | obama | 10 |
| 4 | dasheng | 127 |
| 7 | xuedao Laozu | 67 |
+------+--------------+------+
5 rows in set (0.00 sec)
MariaDB [mydb]> ROLLBACK;
Query OK, 0 rows affected (0.00 sec)
MariaDB [mydb]> select * from tbl1;
+------+--------------+------+
| id | name | age |
+------+--------------+------+
| 1 | tom | 11 |
| 2 | jerry | 12 |
| 3 | obama | 10 |
| 4 | dasheng | 127 |
| 5 | bajie | 20 |
| 7 | xuedao Laozu | 67 |
+------+--------------+------+
6 rows in set (0.00 sec)
MariaDB [mydb]> UPDATE tbl1 SET id=5 WHERE name=
-> 'bajie';
Query OK, 0 rows affected (0.00 sec)
Rows matched: 1 Changed: 0 Warnings: 0
MariaDB [mydb]> SAVEPOINT first;
Query OK, 0 rows affected (0.00 sec)
MariaDB [mydb]> DELETE FROM tbl1 WHERE id=1;
Query OK, 1 row affected (0.00 sec)
MariaDB [mydb]> SAVEPOINT second;
Query OK, 0 rows affected (0.00 sec)
MariaDB [mydb]> DELETE FROM tbl1 WHERE id=2;
Query OK, 1 row affected (0.00 sec)
MariaDB [mydb]> select * from tbl1;
+------+--------------+------+
| id | name | age |
+------+--------------+------+
| 3 | obama | 10 |
| 4 | dasheng | 127 |
| 5 | bajie | 20 |
| 7 | xuedao Laozu | 67 |
+------+--------------+------+
4 rows in set (0.00 sec)
MariaDB [mydb]> ROLLBACK TO second;
Query OK, 0 rows affected (0.00 sec)
MariaDB [mydb]> select * from tbl1;
+------+--------------+------+
| id | name | age |
+------+--------------+------+
| 2 | jerry | 12 |
| 3 | obama | 10 |
| 4 | dasheng | 127 |
| 5 | bajie | 20 |
| 7 | xuedao Laozu | 67 |
+------+--------------+------+
5 rows in set (0.00 sec)
MariaDB [mydb]> ROLLBACK TO first;
Query OK, 0 rows affected (0.00 sec)
MariaDB [mydb]> select * from tbl1;
+------+--------------+------+
| id | name | age |
+------+--------------+------+
| 1 | tom | 11 |
| 2 | jerry | 12 |
| 3 | obama | 10 |
| 4 | dasheng | 127 |
| 5 | bajie | 20 |
| 7 | xuedao Laozu | 67 |
+------+--------------+------+
6 rows in set (0.00 sec)
事务隔离级别:
READ-UNCOMMITTED:读未提交 --> 脏读 隔离性最差,并发性最高,事务安全性没法保证,尽可能不使用。
READ-COMMITTED:读提交--> 不可重复读;
REPEATABLE-READ:可重复读 --> 幻读;
SERIALIZABLE:串行化 只有别的用户肯定后才能够读。最高隔离级别,并发性最低级别。
mysql> SELECT @@session.tx_isolation;
+----------------------------------+
| @@session.tx_isolation |
+----------------------------------+
| REPEATABLE-READ |
+----------------------------------+
查看InnoDB存储引擎的状态信息:
SHOW ENGINE innodb STATUS;
MariaDB [mydb]> SELECT @@session.tx_isolation; #查看当前事务隔离级别
+------------------------+
| @@session.tx_isolation |
+------------------------+
| REPEATABLE-READ |
+------------------------+
MariaDB [mydb]> SET @@session.tx_isolation='READ-UNCOMMITTED'; #设置事务隔离级别
Query OK, 0 rows affected (0.00 sec)
MariaDB [mydb]> SELECT @@session.tx_isolation;
+------------------------+
| @@session.tx_isolation |
+------------------------+
| READ-UNCOMMITTED |
+------------------------+
1 row in set (0.00 sec)
数据库的存储引擎:
InnoDB:InnoBase特性:
支持:Percona-XtraDB, Supports transactions(支持事务), row-level locking(行级锁), and foreign keys(外键)
数据存储于表空间(table space)中,有两种存储方式:
1. 全部数据库中的全部类型为InnoDB的表的数据和索引存储于同一个表空间中。一个表空间对应磁盘中的一个文件,支持分散在多个文件中,通常是串行相加。
表空间是一个黑盒,用户无须了解,也不须要知道内部怎么运做。table space能够理解为建构在文件系统上的又一个文件系统。表空间内部可实现更为强大的数据组织和编排逻辑,它把数据和索引保存在一块儿,因此也能够支持汇集索引(聚簇索引),所以它的主键索引也是一个是汇集索引,其它索引(辅助索引)都指向此索引来辅助工做。
2. 每表使用单独的表空间文件
由innodb_file_per_table=ON定义。data和indexex都保存在一块儿。更加高级的方式,也是innodb表空间的高级功能支持时的默认使用类型。也支持每一个表空间多个文件。
每表的数据文件(数据和索引,存储于数据库目录)存储于本身专用的表空间文件中,并存储于数据库目录下: tbl_name.ibd
表结构的定义:在数据库目录,tbl_name.frm
事务型存储引擎,适合对事务要求较高的场景中(在线事务处理,如电商);但较适用于处理大量短时间小事务(事务执行时间不宜太长,语句不能太多,太多有可能致使死锁);
基于MVCC(Mutli Version Concurrency Control)支持高并发;支持四个隔离级别,默认级别为REPEATABLE-READ;间隙锁以防止幻读;
使用汇集索引(主键索引)
汇集索引:数据和索引保存在一块儿。数据存在索引所在处,找到索引就找到数据了。
非汇集索引:数据和索引分开存放。找到索引以后,只能找到数据所在处的指针,装载数据所在的磁盘块才找到数据
支持”自适应Hash索引“;
锁粒度:行级锁(只锁定须要操做的行);间隙锁(要操做行之间的间隙);
总结:
数据存储:表空间;
并发实现:经过MVCC,间隙锁,行级锁;
支持的索引类型:汇集索引、辅助索引;
性能特性:预读操做、内存数据缓冲、内存索引缓存、自适应Hash索引、插入操做缓存区;
备份:支持基于工具作热备;
查看InnoDB存储引擎的内部状态信息:
SHOW ENGINE INNODB STATUS;
MyISAM特性:
支持全文索引(FULLTEXT index)、数据压缩、空间函数(GIS,辐射索引,按空间,如附近的人);
不支持事务,不支持外键
锁粒度:表级锁 产生锁竞争的机会少
崩溃后没法保证表安全恢复
适用场景:只读或读多写少的场景、较小的表(以保证崩溃后恢复的时间较短);
文件:每一个表有三个文件,存储于数据库目录中
tbl_name.frm:表格式定义;
tbl_name.MYD:数据文件;
tbl_name.MYI:索引文件;
特性:
加锁和并发:表级锁;
修复:手动或自动修复、但可能会丢失数据;
索引:非汇集索引;
延迟索引更新;
表压缩;压缩后没法更改。
行格式:
{DEFAULT|DYNAMIC|FIXED|COMPRESSED|REDUNDANT|COMPACT}
mysql的索引:
索引:提取索引的建立在的表上字段中的数据,构建出一个独特的数据结构
索引的做用:加速查询操做;反作用:下降写操做性能;
表中数据子集:把表中某个或某些字段的数据提取出来另存为一个特定数据结构组织的数据;
某个字段或某些字段:WHERE子句中用到的字段;
索引类型:B+ TREE,HASH
B+ TREE:顺序存储,每个叶子结点到根结点的距离相同;左前缀索引,适合于范围类型的数据查询;
适用于B+ TREE索引的查询类型:全键值、键值范围或键前缀;
全值匹配:精确匹配某个值;
WHERE COLUMN = 'value';
匹配最左前缀:只精确起头的部分;
WEHRE COLUMN LIKE 'PREFIX%';
匹配范围值:
精确匹配某一列,范围匹配另外一列;
只用访问索引的查询:覆盖索引;
index(Name)
SELECT Name FROM students WHERE Name LIKE 'L%';
不适用B+ TREE索引:
若是查条件不是从最左侧列开始,索引无效;
index(age,Fname), WHERE Fname='Jerry'; , WHERE age>30 AND Fname='Smith';
不能跳过索引中的某列;
index(name,age,gender)
WHERE name='black' and age > 30;
WHERE name='black' AND gender='F';
若是查询中的某个列是为范围查询,那么其右侧的列都没法再使用索引优化查询;
WHERE age>30 AND Fname='Smith';
Hash索引:基于哈希表实现,特别适用于值的精确匹配查询;
适用场景:
只支持等值比较查询,例如=, IN(), <=>
不用场景:
全部非精确值查询;MySQL仅对memory存储引擎支持显式的hash索引;
日志类型:
查询日志:general_log
慢查询日志:log_slow_queries
错误日志:log_error, log_warnings
二进制日志:binlog
中继日志:relay_log
事务日志:innodb_log
1、查询日志(增删改查都会涉及到查询,通常不开启,严重影响性能)
记录查询语句,日志存储位置支持两种:
(1)文件:file
(2)表:table (mysql.general_log)
查询日志的定义:
general_log={ON|OFF}
general_log_file=HOSTNAME.log(相对路径:一般相对数据目录而言。或使用绝对路径保存在指定位置)
log_output={FILE|TABLE|NONE} 也能够保存在file和table中,对查询日志没多大必要启动。
FILE:记录在文件中
TABLE:记录在general_log表中
NONE:不记录
FILE,TABLE:同时记录在文件和表中
2、慢查询日志 一般为了排查性能问题都应该记录
慢查询:运行时间超出指定时长的查询(默认时长 10s);
long_query_time
存储位置:
文件:FILE
表:TABLE,mysql.slow_log
慢查询日志的定义:
log_slow_queries={ON|OFF}建议修改配置文件永久生效
slow_query_log={ON|OFF}
slow_query_log_file= 保存位置
log_output={FILE|TABLE|NONE} 指明记录的位置
log_slow_rate_limit 记录日志时的速度限制
log_slow_verbosity 记录日志的详细程度
基于优化后经常使用选项,可用于排查定位故障
log_slow_filter=admin,filesort,filesort_on_disk,full_join,full_scan,query_cache,query_cache_miss,tmp_table,tmp_table_on_disk
admin:基于管理
filesort:基于文件的排序
filesort on disk:基于磁盘的文件排序
full_join:全链接
full_scan:全表扫描
query_cache:查询缓存
query_cache_miss:查询缓存未命中
tmp_table:
tmp_table_on_disk:
MariaDB [(none)]> SELECT @@global.long_query_time; #慢查询日志默认时长
+--------------------------+
| @@global.long_query_time |
+--------------------------+
| 10.000000 |
+--------------------------+
1 row in set (0.00 sec)
3、错误日志 rpm包安装默认启用
记录信息:
(1) mysqld启动和关闭过程 输出的信息;
(2) mysqld运行中产生的错误信息;
(3) event scheduler运行时产生的信息;
(4) 主从复制架构中,从服务器复制线程启动时产生的日志;
错误日志定义方法:
log_error=/var/log/mariadb/mariadb.log|OFF
log_warnings={ON|OFF}
4、二进制日志
用于记录引发数据改变或存在引发数据改变的潜在可能性的语句(STATEMENT)或改变后的结果(ROW),也多是两者混合;极其重要的日志。
强烈不建议和数据文件放一块儿。
功用:“重放”
二进制日志的格式定义(全局功能):
二进制日志有三种格式:STATEMENT|ROW|MIXED
binlog_format={STATEMENT|ROW|MIXED}
STATEMENT:语句;
ROW:行;语句执行结果(有时语句的执行结果会变)
MIXED:混编;由mysql自动断定使用哪一种格式
查看二进制日志文件列表:
SHOW MASTER|BINARY LOGS;
mysql服务重启一次会滚动一第二天志,不管上一个日志写入多少内容,都从新建立一个新的日志文件。
flush logs;命令也会滚动日志
单个日志文件默认最大1G,达到最大后自动滚动新文件。
MariaDB [(none)]> SHOW BINARY LOGS; 查看当前使用哪一个二进制文件
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000001 | 601 |
| mysql-bin.000002 | 443 |
+------------------+-----------+
2 rows in set (0.00 sec)
MariaDB [(none)]> SHOW MASTER LOGS; 查看当前使用哪一个二进制文件
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000001 | 601 |
| mysql-bin.000002 | 443 |
+------------------+-----------+
2 rows in set (0.00 sec)
查看当前正在使用的二进制日志文件:
SHOW MASTER STATUS;
MariaDB [mydb]> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000002 | 443 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
查看二进制 日志文件中的事件:
SHOW BINLOG EVENTS [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count]
MariaDB [mydb]> SHOW BINLOG EVENTS; 查看二进制日志事件
+------------------+-----+-------------+-----------+-------------+----------------------------------------------------------------------------------------------------------+
| Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
+------------------+-----+-------------+-----------+-------------+----------------------------------------------------------------------------------------------------------+
| mysql-bin.000001 | 4 | Format_desc | 1 | 245 | Server ver: 5.5.56-MariaDB, Binlog ver: 4 |
| mysql-bin.000001 | 245 | Query | 1 | 424 | grant replication slave,replication client on *.* to 'master'@'192.168.200.%' identified by 'masterpass' |
| mysql-bin.000001 | 424 | Query | 1 | 499 | flush privileges |
| mysql-bin.000001 | 499 | Query | 1 | 582 | create database abcd |
| mysql-bin.000001 | 582 | Stop | 1 | 601 | |
+------------------+-----+-------------+-----------+-------------+----------------------------------------------------------------------------------------------------------+
5 rows in set (0.00 sec)
MariaDB [mydb]> SHOW BINLOG EVENTS in 'mysql-bin.000001'; 查看哪一个二进制日志的事件
+------------------+-----+-------------+-----------+-------------+----------------------------------------------------------------------------------------------------------+
| Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
+------------------+-----+-------------+-----------+-------------+----------------------------------------------------------------------------------------------------------+
| mysql-bin.000001 | 4 | Format_desc | 1 | 245 | Server ver: 5.5.56-MariaDB, Binlog ver: 4 |
| mysql-bin.000001 | 245 | Query | 1 | 424 | grant replication slave,replication client on *.* to 'master'@'192.168.200.%' identified by 'masterpass' |
| mysql-bin.000001 | 424 | Query | 1 | 499 | flush privileges |
| mysql-bin.000001 | 499 | Query | 1 | 582 | create database abcd |
| mysql-bin.000001 | 582 | Stop | 1 | 601 | |
+------------------+-----+-------------+-----------+-------------+----------------------------------------------------------------------------------------------------------+
5 rows in set (0.00 sec)
Pos:起始位置
End_log_pos:结束位置
MariaDB [mydb]> SHOW BINLOG EVENTS in 'mysql-bin.000001' FROM 499;
+------------------+-----+------------+-----------+-------------+----------------------+
| Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
+------------------+-----+------------+-----------+-------------+----------------------+
| mysql-bin.000001 | 499 | Query | 1 | 582 | create database abcd |
| mysql-bin.000001 | 582 | Stop | 1 | 601 | |
+------------------+-----+------------+-----------+-------------+----------------------+
2 rows in set (0.00 sec)
MariaDB [mydb]> SHOW BINLOG EVENTS in 'mysql-bin.000001' FROM 499 LIMIT 1;
+------------------+-----+------------+-----------+-------------+----------------------+
| Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
+------------------+-----+------------+-----------+-------------+----------------------+
| mysql-bin.000001 | 499 | Query | 1 | 582 | create database abcd |
+------------------+-----+------------+-----------+-------------+----------------------+
1 row in set (0.00 sec)
查询二进制日志是否启动 select @@global.log_bin; 若查询结果不为空则是开启。
服务器变量:
log_bin=/PATH/TO/BIN_LOG_FILE|OFF
只读全局变量,只能修改配置文件重启生效。
放在mysqld配置段
确保二进制日志保存目录属于mysql用户和组
session.sql_log_bin={ON|OFF}
控制某会话中的“写”操做语句是否会被记录于日志文件中;
MariaDB [mydb]> SET @@session.sql_log_bin=0;
max_binlog_size=1073741824
日志文件最大大小,建议能够改的更小一些。根据需求定义。
sync_binlog={1|0}
每一个修改日志的操做都是先保存到内存中,每隔一段时间同步到磁盘一次。
该选项控制只要有语句提交时,是否是当即同步到磁盘上。
当即同步:全部操做都会保存,对数据安全性很重要,可是会影响磁盘IO性能。
缓存后隔一段时间同步:会提高性能,但须要恢复数据库数据时可能会丢失部分数据(保存到内存中,未保存到二进制日志文件的那部分)。
命令提示符查看二进制日志:
mysqlbinlog:
--start-datetime= 开始时间 时间定义:YYYY-MM-DD hh:mm:ss
--stop-datetime= 结束时间
-j, --start-position=# 起始位置
--stop-position=# 结束位置
查看其它服务器二进制日志:
--user, --host, --password
二进制日志事件格式:
# at 553
#160831 9:56:08 server id 1 end_log_pos 624 Query thread_id=2 exec_time=0 error_code=0
SET TIMESTAMP=1472608568/*!*/;
BEGIN
/*!*/;
事件的起始位置:# at 553
事件发生的日期时间:#160831 9:56:08
事件发生的服务器id:server id 1
事件的结束位置:end_log_pos 624
事件的类型:Query
事件发生时所在服务器执行此事件的线程的ID: thread_id=2
语句的时间戳与将其写入二进制日志文件中的时间差:exec_time=0 没有小数的概念
错误代码:error_code=0
事件内容:SET TIMESTAMP=1472608568/*!*/;
[root@node1 ~]# mysqlbinlog /data/mysql/logs/mysql-bin.000002
# at 313
#180603 12:42:43 server id 1 end_log_pos 416 Query thread_id=5 exec_time=0 error_code=0
use `mydb`/*!*/;
SET TIMESTAMP=1528000963/*!*/;
UPDATE tbl1 SET id=5 WHERE name=
'bajie'
/*!*/;
[root@node1 ~]# mysqlbinlog --start-datetime="2018-06-01 10:00:00" /data/mysql/logs/mysql-bin.000002
中继日志:支撑主从复制进行的支撑工具
从服务器上记录下来从主服务器的二进制日志文件同步过来的事件;重放完即清理。
事务日志:只对事务型存储引擎有用
事务型存储引擎innodb用于保证事务特性的日志文件:
redo log
undo log