本文主要讲述MariaDB的锁机制、存储引擎、隔离级别、事务、用户及权限管理、日志管理等相关知识点
连接池 与用户请求建立连接
核心功能层 查询解析,分析,优化,内置函数,跨存储引擎的功能
存储引擎层 数据的存入和提取
mysql的发送默认为明文,可以使用ssl加密数据
parser的功能:词法,语法,语意分析,优化
explain:分析工具
query cache 缓存,只保存select查询
并发访问控制:基于锁来实现
一、MariaDB锁
执行操作时施加的锁的模式
读锁:用户在读的时候施加的锁,为防止别人修改,当时用户可以读,还被称为共享锁
写锁:独占锁,排它锁,其他用户既不可以读,也不可以写
锁粒度
表锁:table lock 锁定整张表
行锁:row lock 锁定需要的行
粒度越小,开销越大,但并发性越好
粒度越大,开销越小,但并发性越差
锁的实现位置:
数据库锁:可以手动使用,可以使用显示锁
存储引擎锁:自动进行的锁(隐式锁)
显示锁:
施加锁
LOCK TABLEStbl_name [[AS] alias] lock_type, tbl_name [[AS] alias] lock_type] ...
锁的类型:READ:WRITE
解锁:
UNLOCK TABLES
InnoDB存储引擎也支持另外一种显示锁(锁定挑选出的部分行,行级锁)
select .....lock in share mode
select .....for update
建议:做备份时要手动施加读锁
二、事务
事务就是一组原子性的查询语句,也即将多个查询当作一个独立的工作单元
ACID测试:能够满足ACID测试就表示其支持事务,或兼容事务
A:Atomicity,原子性,都执行或者都不执行
C:Consistency,一致性,从一个一致性状态转到另外一个一致性状态
I: Isolaction,隔离性,一个事务的修改操作在提交前对其他事物是不可见的
D:Durability,持久性,一旦事务得到提交,其所做的修改会永久有效
隔离级别
READ UNCOMMITTEND 读未提交,会出现脏读,不可重复读,幻读
READ COMMITTEND 读提交,会出现不可重复读,幻读
REPEATABLE READ 可重读,会出现幻读
SERIALIZABLE 可串行化,强制事务的串行执行避免了幻读,性能较低
安全级别越高,并发性越低
启动事务
stat transaction
事务提交
commit
事务回滚
rollback
控制回滚的位置
SAVEPOINT identifier ROLLBACK [WORK] TO [SAVEPOINT] identifier RELEASE SAVEPOINT identifier
如何没有显示启动事务,每个语句都会当成一个默认的事务,其执行完成会被指定提交,
查看事务状态 MariaDB [(none)]> select @@global.autocommit -> ; +---------------------+ | @@global.autocommit | +---------------------+ | 1 | +---------------------+ 1 row in set (0.00 sec) 修改事务的状态 MariaDB [(none)]> set global autocommit =0; Query OK, 0 rows affected (0.00 sec)
注意 关闭自动提交,请记得手动启动事务,应记得手动提交事务
查看MariaDB的事务隔离级别
MariaDB [(none)]> show global variables like '%iso%'; +---------------+-----------------+ | Variable_name | Value | +---------------+-----------------+ | tx_isolation | REPEATABLE-READ | +---------------+-----------------+ 1 row in set (0.00 sec)
建议:在对事物要求不特别严格的场景下,可以使用读提交
MVCC:多版本并发控制
每个事物启动时,InnoDB会为每个启动的食物提供一个当下时刻的快照
为了实现此功能,InnoDB会为每个表提供两隐藏的字段,一个用于保存行的创建时间,一个用于保存行的失效时间,里面存储的为系统版本号
旨在两个隔离级别下有效:read committed 和repeatble-read
三、存储引擎
存储引擎也通常被称为“表类型”
查看MariaDB的存储引擎
MariaDB [(none)]> show engines; +--------------------+---------+----------------------------------------------------------------------------+--------------+------+------------+ | Engine | Support | Comment | Transactions | XA | Savepoints | +--------------------+---------+----------------------------------------------------------------------------+--------------+------+------------+ | CSV | YES | CSV storage engine | NO | NO | NO | | InnoDB | DEFAULT | Percona-XtraDB, Supports transactions, row-level locking, and foreign keys | YES | YES | YES | | PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO | | BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO | | MyISAM | YES | MyISAM storage engine | NO | NO | NO | | MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO | | MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO | | Aria | YES | Crash-safe tables with MyISAM heritage | NO | NO | NO | +--------------------+---------+----------------------------------------------------------------------------+--------------+------+---
可以看到,默认的为InnoDB
查看表的默认选项
SHOW TABLE STATUS [{FROM | IN} db_name] [LIKE 'pattern' | WHERE expr]
MariaDB [(none)]> show table status in mysql\G *************************** 1. row *************************** Name(表名): columns_priv Engine(存储引擎): MyISAM Version(存储引擎版本): 10 Row_format(行格式): Fixed {default|dynamic|fixed|commpressed|redundant|compact} Rows(表中的行数): 0 Avg_row_length(平均每行包含的字节数): 0 Data_length(表中数据总体大小,单位为字节): 0 Max_data_length(表能够占用的最大空间,单位为字节,0表示没有上限): 227994731135631359 Index_length(索引的大小,单位为字节): 4096 Data_free(对MyISAM表,其表示已经分配但尚未使用的空间,其中包含此前删除行之后腾出来的空间): 0 Auto_increment(下一个Auto_increment值): NULL Create_time(表的创建时间): 2014-03-22 20:28:26 Update_time(表的更新时间): 2014-03-22 20:28:26 Check_time(使用check table或myisamchk最近一次检查表的时间): NULL Collation(排序规则): utf8_bin Checksum(如果启动,则为表的checksum): NULL Create_options(创建表时指定使用的其他选项): Comment(表的注释信息): Column privileges
InnoDB有两种格式
1.innodb_file_per_table=OFF,即使用共享表空间
每个表有一个独立的格式定义文件:tb_name.frm
还有一个默认位于数据目录下的共享的表空间文件:ibdata#
2.innodb_file_per_table=ON,即使用独立表空间
每个表再数据库目录下存储两个文件:tb_name.frm 和tb_name.idb
MyISAM:
每个表都在数据库目录下存储三个文件
tb_name.frm
tb_name.MYD
tb_name.MYI
表空间:table space,由InnoDB管理的特有格式数据文件,内部可用是存储数据和索引
修改默认存储引擎:可以通过修改default_storage_engine变量来实现
各存储引擎的特性
InnoDB:
支持事务,有事务日志(ib_logfile0,ib_logfile1)
支持外键约束
支持MVCC
支持聚簇索引(聚簇索引之外的其他索引,通常称之为辅助索引)
行级锁:间歇锁
支持使用辅助索引
支持自使用hash索引
支持热备份
MyISAM:
全文索引
支持表压缩存放:做数据仓库时,能节约存储空间并提升性能
支持空间索引
表记锁
延迟更新索引
不支持事务、外键和行级锁
崩溃后无法安全恢复数据
使用场景:只读数据,表较小,能够容忍崩溃后的恢复操作和数据丢失
ARCHIVE:
仅支持INSERT和SELECT,支持很好的压缩功能
应用于存储日志信息,或其他按照时间序列实现的数据采集类的应用
CSV:
将数据存储为CSV格式,不支持索引,仅使用与数据交换场景
BLACHOLE:
没有存储机制,任何发往此引擎的数据都会丢弃,其会记录而二进制日志,因此,常用于多级复制架构中作为中转服务器
MEMORY:
保存数据在内存中,内存表;常用于保存中间数据,如周期性的聚合数据等,也用于实现临时表
支持hash索引,使用表记锁,不支持BLOB和TEXT数据类型
MRG_MYISAM:
是MYISAM的一个变种,能够将多个MyISAM表合并成一个虚表
NDB:
是MySQL CLUSTER中专用的存储引擎
第三方的存储引擎
XtraDB:
增强的InnoDB,有Percona提供,编译安装时,下载XtraDB的源码替代Mysql存储引擎中的InnoDB的源码,MariaDB默认的使用就是为XtraDB
PBXT:
MariaDB自带此存储引擎,支持引擎级别的复制,外键约束,对SSD磁盘提供适当支持
支持事务,MCVV
TokuDB:
使用Fractal Trees索引,使用存储大数据,拥有很好的压缩比,已经被引入MariaDB
列式数据存储引擎
Infobright:目前较有名的列式引擎,适用于海量数据存储场景,如PB级别,专为数据分析和数据仓库设计
InfiniDB
MonetDB
LucidDB
开源社区存储引擎
Aira:前身为Maria,是增强帮的MyISAM(支持崩溃后安全恢复,支持数据缓存)
Groona:全文索引引擎
Mroonaga:是基于Groona的二次开发版
OQGraph:由Open Query研发,支持图(网状)结构的存储引擎
Spider:能够将数据切分成不同的分片,比较高效透明的实现了分片(shared),并支持在分片上并行查询
如何选择存储引擎:
是否需要事务
备份的类型的支持
崩溃后的恢复
特有的特性
四、用户及权限管理
用户账号:username@hostname
用户账号管理
create user
drop user
rename user
set password
权限管理
grant
revoke
创建用户
CREATE USER user@hostname [ IDENTIFIED BY [PASSWORD] 'password']
主机可以使用通配符%和_
查看用户能够使用的权限
MariaDB [(none)]> show grants; +----------------------------------------------------------------------------------------------------------------------------------------+ | Grants for root@localhost | +----------------------------------------------------------------------------------------------------------------------------------------+ | GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY PASSWORD '*1D7AA67FFCC64F5D65BC7FA9C21838AF31FE63C1' WITH GRANT OPTION | | GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION | +----------------------------------------------------------------------------------------------------------------------------------------+ 2 rows in set (0.00 sec)
修改用户名
RENAME USER old_user TO new_user [, old_user TO new_user] ...
grant
MariaDB的权限类型分为库级别、表级别、字段级别、管理类、程序类
管理类权限
create temporary tables 临时表 create user file 允许用户读或者写某些文件 lock tables 添加显示锁 process 查看用户的线程 reload 相当于执行flush和reset replication client 查询有哪些客户端有复制权限 replication slave 赋予用户复制权限 show databases shutdown super
数据库访问权限
alter alter routine 修改存储历程 create create rontine 创建存储过程,存储函数 create view delete drop execute grant option 将自己的权限复制给别的用户 index 索引 show view
数据库操作类权限(表级别)
select insert update delete
字段级别:
select (col1,....) uodate (col1,....) insert (col1,....)
GRANT priv_type [(column_list)] [, priv_type [(column_list)]] ... ON [object_type] priv_level TO user_specification [, user_specification] ... [REQUIRE {NONE | ssl_option [[AND] ssl_option] ...}] [WITH with_option ...] with_option: GRANT OPTION 转赠给别人 | MAX_QUERIES_PER_HOUR count 每小时允许执行的最大查询次数 | MAX_UPDATES_PER_HOUR count 每小时允许执行的最大更新次数 | MAX_CONNECTIONS_PER_HOUR count 每小时允许执行的最大连接次数 | MAX_USER_CONNECTIONS count 使用同一账号可以同时连接的次数
切记:如果想要创建库,应该对所有表都有权限
收回授权
REVOKE priv_type [(column_list)] [, priv_type [(column_list)]] ... ON [object_type] priv_level FROM user [, user] ... REVOKE ALL PRIVILEGES, GRANT OPTION FROM user [, user] ... REVOKE PROXY ON user FROM user [, user] ..
几个跟用户授权相关的表
db: 库级别的权限
host:主机级别权限,已废弃
tables_priv: 表级别的授权
colomns_priv: 列级别的授权
procs_priv:存储过程和存储函数相关的授权
proxies_priv: 代理用户权限
五、MariaDB的日志
查询日志:默认为关闭
log = {ON|OFF} 是否记录所有语句的日志信息与一般查询日志文件(general_log_file)
log_output = {TABLE|FILE|NONE} 记录日志的类型,table和file可以同时出现,用逗号分隔
general_log 是否启用查询日志
general_log_file 定义了一般查询日志保存的文
慢查询日志:查询执行时长超过指定时长的查询,即为慢查询
slow_query_log = {ON|OFF} 是否记录慢查询日志
log_output={TABLE|FILE|NONE}
slow_query_log_file 定义慢查询日志的保存文件
long_query_time 定义慢查询的时间
long_slow_filter 不记录慢查询日志
错误日志:
服务器启动和关闭过程中的信息
服务器运行中的错误信息
事件调度器运行一个事件时产生的信息
在复制架构中的从服务器上启动从服务器线程是产生的信息
log_error = /path/to/log/error_log_file
log_warnings = {1|0} 是否将警告信息保存至错误日志中
二进制日志:修改相关的操作,用来实现复制的凭据
记录了当前服务器的数据修改和有潜在可能性影响数据修改的语句
默认在数据目录下,通常情况下为mysql-bin
二进制文件可以通过mysqlbinlog来查看
时间记录:time
偏移位置postion
show master status可以查看当前使用的二进制文件和下一个时间开始是的位置
show binary logs 可以查看当前正在使用的log日志
日志滚动:当超过1G,日志会滚动,日志的滚动可以按照大小定义滚动,按照时间来定义滚动,执行flush logs来滚动日志
中继日志:从服务器上的日志
对于非从服务器 中继日志没有启用
relay_log_purge = {ON|OFF} 是否自动清理不在需要的中继日志
relay_log_space_limit 中继大小是否限制
事务日志:将随机I/O转换为顺序I/O
日志文件组:至少要存在两个,实现轮询
注意:尽可能使用小事务来代替大事务来提升事务引擎的性
清除日志:
PURGE { BINARY | MASTER } LOGS { TO 'log_name' | BEFORE datetime_expr(某个时间点之前) }
查看MariaDB的日志
MariaDB [(none)]> show binlog events\G *************************** 1. row *************************** Log_name: master-bin.000001 Pos: 4 Event_type: Format_desc Server_id(服务器身份标识): 1 End_log_pos: 245 Info: Server ver: 5.5.36-MariaDB-log, Binlog ver: 4
MariaDB 记录二进制日志的格式
基于语句:statement
基于行:row
混合模式:mixed
指定从那个位置开始读取
SHOW BINLOG EVENTS [IN 'log_name'] [FROM pos] 也可以通过 mysqlbinlog --start-position= #
mysqlbinlog常用命令总结:
-j, --start-position=# 起始节点
--stop-position=# 结束节点
--start-datetime=name 起始时间
--stop-datetime=name 结束时间
二进制日志文件内容格式
时间发生的日期和时间
服务器ID
事件结束位置
事件的类型
原服务器生成此事件时的线程ID号
语句时间戳和写入二进制文件的时间差,单位为秒
错误代码,0表示正常执行
事件内容
事件位置(相当于下一个时间的开始位置)
log_bin = {ON|OFF},也可以是一个文件路径
log_bin_trust_function_creators 不阻止任何存储函数
sql_log_bin = {ON|OFF} 当前会话是否将修改记入到二进制文件中
sql_log_off 是否将一般查询记入到查询日志中
sync_binlog 同步缓冲区二进制到应到的时间,0表示不急于时间同步,旨在时间提交时同步
binlog_format={statement|row|mixed}
max_binlog_cache_size MariaDB二进制日志的缓存区大小,仅用于缓存事务类的语句
max_binlog_stmt_cache_size 语句缓存区大小,即事务类和非事务类公用的大小
max_binlog_size 二进制日志文件的上限,单位为字节
建议:切勿将二进制日志与数据文件放在同一设备上
可以临时通过sql_log_bin来控制未禁止的写入