MariaDB四之锁、存储引擎、隔离级别、事务、用户及权限管理、日志管理

   本文主要讲述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来控制未禁止的写入

你可能感兴趣的:(存储引擎,事务,隔离级别,日志管理,MariaDB的锁机制,用户及权限管理)