关系型数据库之Mysql引擎-日志-用户管理
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关系型数据库之Mysql引擎-日志-用户管理相关的知识,希望对你有一定的参考价值。
MySQL锁机制
相对其他数据库而言,MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制。
执行操作时施加的锁的模式
读锁:用户在读的时候施加的锁,为防止别人修改,但是用户可以读,还被称为共享锁
写锁:独占锁,排它锁。其他用户不能读,不能写
mysql大致可归纳为以下3种锁:
表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。
行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般
锁的实现位置:
MySQL锁:可以手动使用,可以使用显示锁
存储引擎锁:自动进行的(隐式锁),
显示锁:
lock tables:施加锁
LOCK TABLES
tbl_name lock_type
[, tbl_name lock_type]
锁的类型:
READ | WRITE
unlock tables:解锁
案例演示之读锁:
客户端A:对student表施加读锁
mysql> LOCK TABLES student READ; mysql> UNLOCK TABLES;
客户端B:对student表执行编辑操作,可以看到是无法正常执行的,查询操作没有问题:
mysql> select * from student; mysql> update student set Class = 1 where Age = ‘18‘;
下图为解锁后执行的语句结果:
案例演示之写锁:
客户端A:对student表施加写锁
mysql> LOCK TABLES student WRITE; mysql> UNLOCK TABLES;
客户端B:对student表执行编辑操作,可以看到是无法正常执行的,查询操作也是无法执行:
表引擎必须是Innodb引擎:
InnoDB存储引擎也支持另外一种显示锁(锁定挑选出的部分行,行级锁)
select .... lock in share mode
select .... for update
做备份时要手动施加读锁
事务:Transaction
事务就是一组原子性的查询语句,也即将多个查询当作一个独立的工作单元
ACID测试:能够满足ACID测试就表示其支持事务,或兼容事务
A:Atomicity,原子性,都执行或者都不执行
C:Consistency,一致性,从一个一致性状态转到另外一个一致性状态
I:Isolaction,隔离性。一个事务的所有修改操作在提交前对其他事务时不可见的
D: Durability, 持久性,一旦事务得到提交,其所做的修改会永久有效
安全性越高,并发性越低
SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的。低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销。
Read Uncommitted(读取未提交内容)
在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少。读取未提交的数据,也被称之为脏读(Dirty Read)。
Read Committed(读取提交内容)
这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。这种隔离级别 也支持所谓的不可重复读(Nonrepeatable Read),因为同一事务的其他实例在该实例处理其间可能会有新的commit,所以同一select可能返回不同结果。
Repeatable Read(可重读)
这是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。不过理论上,这会导致另一个棘手的问题:幻读 (Phantom Read)。简单的说,幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行。InnoDB和Falcon存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了该问题。
Serializable(可串行化)
这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。
这四种隔离级别采取不同的锁类型来实现,若读取的是同一个数据的话,就容易发生问题。例如:
脏读(Drity Read):某个事务已更新一份数据,另一个事务在此时读取了同一份数据,由于某些原因,前一个RollBack了操作,则后一个事务所读取的数据就会是不正确的。
不可重复读(Non-repeatable read):在一个事务的两次查询之中数据不一致,这可能是两次查询过程中间插入了一个事务更新的原有的数据。
幻读(Phantom Read):在一个事务的两次查询中数据笔数不一致,例如有一个事务查询了几列(Row)数据,而另一个事务却在此时插入了新的几列数据,先前的事务在接下来的查询中,就会发现有几列数据是它先前所没有的。
下面我们通过实际分析事务级别的应用:
两个命令行客户端分别为A,B;不断改变A的隔离级别,在B端修改数据。
(1)将A的隔离级别设置为read uncommitted(未提交读)
在B未更新数据之前:
客户端A:
mysql> SET GLOBAL tx_isolation=‘READ-UNCOMMITTED‘; mysql> SELECT @@global.tx_isolation; mysql> START TRANSACTION; mysql> SELECT * FROM student;
B更新数据:
客户端B:
mysql> UPDATE students SET ClassID = ‘99‘ WHERE SID = ‘1‘; mysql> SELECT * FROM students; mysql> ROLLBACK; mysql> SELECT * FROM students;
客户端A:
经过上面的实验可以得出结论,事务B更新了一条记录,但是没有提交,此时事务A可以查询出未提交记录。造成脏读现象。未提交读是最低的隔离级别。
(2)将客户端A的事务隔离级别设置为read committed(已提交读)
在B未更新数据之前:
客户端A:
mysql> SET GLOBAL tx_isolation=‘READ-COMMITTED‘; mysql> SELECT @@global.tx_isolation; mysql> START TRANSACTION; mysql> SELECT * FROM students;
B更新数据:
客户端B:
mysql> START TRANSACTION; mysql> UPDATE students SET ClassID = ‘99‘ WHERE SID = ‘1‘; mysql> SELECT * FROM students; mysql> COMMIT;
客户端A:
经过上面的实验可以得出结论,已提交读隔离级别解决了脏读的问题,但是出现了不可重复读的问题,即事务A在两次查询的数据不一致,因为在两次查询之间事务B更新了一条数据。已提交读只允许读取已提交的记录,但不要求可重复读。
(3)将A的隔离级别设置为repeatable read(可重复读)
在B未更新数据之前:
客户端A:
mysql> SET GLOBAL tx_isolation=‘REPEATABLE-READ‘; mysql> SELECT @@global.tx_isolation; mysql> START TRANSACTION; mysql> SELECT * FROM students;
B更新数据:
客户端B:
由以上的实验可以得出结论,可重复读隔离级别只允许读取已提交记录,而且在一个事务 两次读取一个记录期间,其他事务部的更新该记录。但该事务不要求与其他事务可串行化。例如,当一个事务可以找到由一个已提交事务更新的记录,但是可能产生 幻读问题(注意是可能,因为数据库对隔离级别的实现有所差别)。像以上的实验,就没有出现数据幻读的问题。
(4)SERIALIZABLE (可串行化)
强制事务的串行执行避免了幻读;
跟事务相关的常用命令
mysql> START TRANSACTION mysql> COMMIT mysql> ROLLBACK mysql> SAVEPOINT identifier mysql> ROLLBACK [WORK] TO [SAVEPOINT] identifier
如果没有显式启动事务,每个语句都会当作一个独立的事务,其执行完成后会被自动提交;
mysql> SELECT @@global.autocommit; mysql> SET GLOBAL autocommit = 0;
关闭自动提交,请记得手动启动事务,手动进行提交;
查看MySQL的事务隔离级别
mysql> SHOW GLOBAL VARIABLES LIKE ‘tx_isolation‘; mysql> SELECT @@global.tx_isolation;
建议:对事务要求不特别严格的场景下,可以使用读提交;
MVCC:多版本并发控制
每个事务启动时,InnoDB为会每个启动的事务提供一个当下时刻的快照;
为了实现此功能,InnoDB会为每个表提供两隐藏的字段,一个用于保存行的创建时间,一个用于保存行的失效时间;
里面存储的是系统版本号;(system version number)
只在两个隔离级别下有效:READ COMMITTED和REPEATABLE READ
MySQL存储引擎
首先安装MariaDB,利用MariaDB详解存储引擎
使用通用二进制格式安装MariaDB如下:
(1)创建数据库服务用户:
# groupadd -r mysql # mkdir -p /mydata/data # useradd -g mysql -r -s /sbin/nologin -M -d /mydata/data mysql # chown -R mysql:mysql /mydata/data/
(2)下载二进制安装包,创建数据库二进制源码包软连接
# tar xf mariadb-5.5.36-linux-x86_64.tar.gz -C /usr/local/# cd /usr/local/ # ln -sv mariadb-5.5.36-linux-x86_64 mysql # cd mysql/
(3)初始化数据库
# scripts/mysql_install_db --user=mysql --datadir=/mydata/data/
(4)提供配置文件
# cp support-files/my-large.cnf /etc/my.cnf # vim /etc/my.cnf --添加下面选项 datadir = /mydata/data innodb_file_per_table = on
(5)提供服务脚本
# cp /usr/local/mysql/support-files/mysql.server /etc/rc.d/init.d/mysqld # chmod +x /etc/rc.d/init.d/mysqld # vim /etc/rc.d/init.d/mysqld --补充以下选项 basedir=/usr/local/mysql datadir=/mydata/data
加入服务列表启动服务:
# chkconfig --add mysqld # chkconfig mysqld on # service mysqld start
(6)提供PATH环境变量
# vim /etc/profile.d/mysqld PATH=/usr/local/mysql/bin/:$PATH # . /etc/profile.d/mysqld
(7)提供man手册至man命令的查找路径
# vim/etc/man.config --加入下行内容 MANPATH /usr/local/mysql/man
(8)输出MariaDB的头文件至系统头文件路径
# ln -sv /usr/local/mysql/include /usr/include/mysql
(9)输出MariaDB的库文件给系统的查找路径
# echo "/usr/local/mysql/lib" > /etc/ld.so.conf.d/mysql.conf # ldconfig # ldconfig -v | grep mysql
以上为MariaDB过程。
查看MySQL所支持的存储引擎和表使用引擎
1.查询所支持的数据库引擎:
MariaDB [(none)]> SHOW ENGINES;
2.查看表属性
mysql> SHOW TABLE STATUS IN db_name [LIKE pattern] [WHERE clause]; mysql> SHOW TABLE STATUS IN hellodb LIKE "stu%" \G; *************************** 1. row *************************** Name: students Engine: MyISAM Version: 10 Row_format: Dynamic Rows: 25 Avg_row_length: 24 Data_length: 624 Max_data_length: 281474976710655 Index_length: 2048 Data_free: 0 Auto_increment: 26 Create_time: 2016-05-12 10:33:39 Update_time: 2016-05-12 10:33:39 Check_time: NULL Collation: utf8_general_ci Checksum: NULL Create_options: Comment: --------------------------------------------------------------- 各项解释: Name: 表名 Engine: 存储引擎 Version: 版本(表的当前版本) Row_format: 行格式,创建表的命令中可以定义 {DEFAULT|DYNAMIC|FIXED|COMPRESSED|REDUNDANT|COMPACT} Rows: 表中的行数 Avg_row_length: 平均每行所包含的字节数; Data_length: 表中数据总体大小,单位是字节 Max_data_length: 表能够占用的最大空间,单位为字节,0表示没有上限。 Index_length: 索引的大小,单位为字节 Data_free: 对于MyISAM表,表示已经分配但尚未使用的空间,其中包含此前删除行之后腾出来的空间 Auto_increment: 下一个AUTO_INCREMENT的值; Create_time: 表的创建时间; Update_time:表数据的最近一次的修改时间; Check_time:使用CHECK TABLE或myisamchk最近一次检测表的时间; Collation: 排序规则 Checksum: 如果启用,则为表的checksum; Create_options: 创建表时指定使用的其它选项; Comment: 表的注释信息
Innodb存储引擎,所产生的文件格式:
1.参数innodb_file_per_table=OFF时:
每张表具有单独的表结构文件tb_name.frm
数据内容使用共享表空间文件, ibdata#
2.参数innodb_file_per_table=ON时候:
每张表具有两个独立文件
tb.name.frm 表空间文件
tb_name.ibd
表空间文件(table space): 由innodb管理的特有格式的数据文件,内部存储索引和数据,支持聚簇索引
MyISAM存储引擎产生的文件: 每个表都在数据库目录下存储三个文件:
1. tb_name.frm : 表结构
2. tb_name.MYD : 数据
3. tb_name.MYI : 索引
通过修改default_storage_engine来修改默认存储引擎,需要写在配置文件中。
各引擎特性
1)Innodb:
事务:事务日志 外键: MVCC:多版本并发机制,主要是用于支持事务 聚簇索引只能有一个 聚簇索引之外的其他索引,通常称为辅助索引 所有的辅助索引是指向聚簇索引的。而非指向元数据。 通常使用主键用于聚簇索引 无论聚簇索引还是辅助索引都是B+树索引 行级锁: 间隙锁,用来隔离行 支持辅助索引, 自适应的hash索引, 支持热备份,
2)MyISAM:
全文索引 支持表压缩,但是压缩后不能修改,用于制作数据仓库,可节约空间提高性能 空间索引 表级锁 延迟更新索引: 每当数据更新时,不需要立即更新索引,以降低I/O压力 不支持事务,外键和行级锁 崩溃无法安全可靠的恢复数据。 使用场景: 只读取数据,较小的表,奔溃后可以忍受数据恢复时间和数据丢失。
3)ARCHIVE:
仅支持INSERT和SELECT,支持很好压缩功能; 适用于存储日志信息,或其他按时间序列实现的数据采集类的应用; 不支持事务,不能很好的支持索引;
4)CSV:
将数据存储为CSV格式;不支持索引;仅适用数据交换场景,另外貌似精度很难保持;
5)BLACKHOLE:
没有存储机制,任何发生此引擎的数据都会丢失,其会记录二进制日志,因此,常用于多级复制架构中作中转服务器;
6)MEMORY:
保存数据在内存中,内存表;常用于保存中间数据,如周期性的聚合数据等;也用于实现临时表 支持hash索引,使用表级锁,不支持BLOB和TEXT数据类型。
7)MRG_MYISAM
MYISAM的变种,能够将多个MyISAM表合并成一个虚表;
8)NDB
MySQL Cluster中专用的存储引擎
第三方的存储引擎
1.OLTP类:
XtraDB:增强的InnoDB,由Percona提供; 编译安装时,下载XtraDB的源码替换MySQL存储引擎中的InnoDB的源码 PBXT:MariaDB自带此存储引擎 支持引擎级别的复制、外键约束,对SSD磁盘提供适当支持; 支持事务、MVCC
2.TokuDB:使用Fractal Trees索引,没有碎片问题,性能与换从无关,适用存储大数据,拥有很大的压缩比;已经被引入MariaDB;
列式存储引擎; Infobright: 目前较有名的列式引擎,使用于海量数据存储场景,如PB级别,专为数据分析和数据仓库设计; 如果用于MySQL,需要对MySQL做定制。
开源社区存储引擎:
1. Aria:前身为Maria,可理解为增强版的MyISAM(支持崩溃后安全恢复,支持数据缓存)
2.Groona:全文索引引擎,Mroonga是基于Groona的二次开发版,适用于搜索引擎
3.OQGraph: 由Open Query研发,支持图结构的存储引擎
4.SphinxSE: 为Sphinx全文搜索服务器提供了SQL接口
5.Spider: 能数据切分成不同分片,比较高效透明地实现了分片(shared),并支持在分片上支持并行查询;
如何选择数据存储引擎:
1.是否需要事务
2.备份的类型的支持
3.奔溃后的恢复
4.特有的特性
MySQL的用户管理及用户权限管理:
mysql用户管理
1.用户格式:
[email protected]{host_IP|host_name}
{host_IP|host_name}:需要登录mysql服务器的主机IP
2.mysql用户管理的相关命令:
mysql> CREATE USER user_name IDENTIFIED BY {‘auth_string‘ | PASSWORD ‘hash_string‘} mysql> DROP USER user_name mysql> RENAME USER old_user TO new_user mysql> SET PASSWORD FOR ‘user_name‘@‘%.example.org‘ = PASSWORD(‘cleartext password‘);
MySQL的权限控制:
1.权限管理命令:
权限授予:
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 {GRANT OPTION | resource_option} ...] mysql> GRANT PROXY ON user_specification TO user_specification [, user_specification] ... [WITH GRANT OPTION]
权限回收:
REVOKE priv_type [(column_list)][, priv_type [(column_list)]] ... ON [object_type] priv_level FROM user [, user] ... REVOKE PROXY ON user FROM user [, user] ...
查看用户能够使用的权限:
mysql> SHOW GRANTS FOR [email protected]‘hostname‘; mysql> SHOW GRANTS FOR [email protected]‘mysql.samlee.com‘\g;
作用对象类型(priv_type)
1.TABLE(默认)
2.FUNCTION
3.PROCEDURE
权限目标级别(priv_level)
*所有: 库,表,函数
*.* 所有库的所有[TABLE|FUNCTION|PROCEURE]
db_name.* db_name库的所有
db_name.tbl_name
tbl_name
db_name.routine_name
WITH GRANT OPTION:权限授予选项
1.MAX_QUERIES_PER_HOUR count
2.MAX_UPDATES_PER_HOUR count
3.MAX_CONNECTIONS_PER_HOUR count
4.MAX_USER_CONNECTIONS count
权限类型
1.管理类权限:
CREATE TEMPORARY TABLES: 使用或者创建临时表 CREATE USER:创建,删除,重命名用户 FILE: 在服务器上读或者写,包括备份,以及source文件 LOCK TABLES:是否可以锁表 PROCESS:是否执行SHOW PROCESSLIST 命令查看mysql内部运行的线程 RELOAD:是否能使用FLUSH和RESET命令 REPLTCATION SLAVE: 是否可以查询主服务器有哪些从服务器 REPLTCATION CLIENT: 是否有权限成为从服务器 SHOW DATABASES: 是否可以查询服务器中哪些数据库 SHUTDOWN: 关闭 SUPER:其他
2.库级别和表级别:
ALTER: 是否可以执行ALTER TABLE命令 ALTER ROUTINE: 修改存储过程,包括存储函数 CREATE: 创建表和库 CREATE ROUTINE:创建存储过程和函数 CREATE VIEW:创建视图
3.数据操作(表级别):
SELECT:查询 INSERT:增加 UPDATE:修改 DELETE:删除 SELECT(col1,....) INSERT(col1,....) UPDATE(col1,....)
4.所有权限
ALL [PRIVILEGES]
ssl选项(ssl_option):
SSL X509:证书格式 CIPHER ‘cipher‘ 加密方式 ISSUER ‘issuer‘ 证书颁发者 SUBJECT ‘subject‘ 拒绝某证书
常用存储用户权限信息表,全部存储在mysql库中
db: 库级别权限 host: 主机级别权限,已废弃不用了 tables_priv : 表级别权限 colomns_priv: 列级别的权限 procs_priv: 存储过程和存储函数相关的的权限 proxies_priv: 代理用户权限
授权案例:
1. 授予testuser能够通过192.168.98.0/24网络内的任意主机访问当前mysql服务器的权限; mysql> GRANT SELECT ON TABLE *.* TO ‘testuser‘@‘192.168.98.%‘ IDENTIFIED BY ‘testuser‘; 2. 让此用户能够创建及删除testdb数据库,及库中的表; GRANT CREATE,DROP ON TABLE testdb.* TO ‘testuser‘@‘192.168.98.%‘ ; 3. 让此用户能够在testdb库上执行创建和删除索引; GRANT INDEX ON TABLE testdb.* TO ‘testuser‘@‘192.168.98.%‘ ; 4. 让此用户能够在testdb.t2表上查询id和name字段,并允许其将此权限转授予其他用户; GRANT GRANT OPTION,SELECT(id,name) ON TABLE testdb.t2 TO ‘testuser‘@‘192.168.98.%‘ ; 5、让此用户能够在testdb库中的t1表中执行查询、删除、更新和插入操作; GRANT SELECT,DELETE,UPDATE,INSERT ON TABLE testdb.tb1 TO ‘testuser‘@‘192.168.98.%‘;
MySQL查询缓存
用于保存MySQL查询语句返回的完整结果。被命中时,MySQL会立即返回结果,省去解析、优化和执行等阶段。
如何检查缓存
1.MySQL保存结果于缓存中:
2.把SELECT语句本身做hash计算,计算的结果作为KEY,查询结果作为VALUE。
什么样的语句不会被缓存?
查询语句中有一些不确定数据时,不会缓存: 例如NOW(),CURRENT_TIME();一般来说,如果查询中包含用户自定义函数、存储函数、用户变量、临时表、mysql库中系统表、或者任何包含权限的表,一般都不会缓存;
缓存会带来额外开销:
1.每个查询都得先检查是否被命中;
2.查询结果要先缓存;
缓存相关的服务器变量
mysql> SHOW GLOBAL VARIABLES LIKE ‘query_cache%‘; +------------------------------+----------+ | Variable_name | Value | +------------------------------+----------+ | query_cache_limit | 1048576 | | query_cache_min_res_unit | 4096 | | query_cache_size | 16777216 | | query_cache_type | ON | | query_cache_wlock_invalidate | OFF | +------------------------------+----------+ query_cache_type: 查询缓存类型;是否开启缓存功能,开启方式有三种{ON|OFF|DEMAND}; DEMAND:意味着SELECT语句明确使用 SQL_CACHE 选项时才会缓存; query_cache_size: 总空间,单位为字节,大小必须是1024的整数倍。MySQL启动时,会一次分配并立即初始化这里指定大小的内存空间;这意味着,如果修改此大小,会清空缓存并重新初始化的。 query_cache_min_res_unit: 存储缓存的最小内存块;(query_cache_size - Qcache_free_memory)/Qcache_queries_in_cache能够获得一个理想的值。 query_cache_limit: 单个缓存对象的最大值,超出时则不预缓存;手动使用SQL_NO_CACHE可以人为地避免尝试缓存返回结果超出此参数限定值的语句。 query_cache_wlock_invalidate: 如果某个表被其它用户连接锁住了,是否仍然从缓存中返回结果。OFF表示返回。
如何判断命令率(缓存相关的状态变量):
mysql> SHOW GLOBAL STATUS LIKE ‘Qcache%‘; +-------------------------+----------+ | Variable_name | Value | +-------------------------+----------+ | Qcache_free_blocks | 3 | | Qcache_free_memory | 16741608 | | Qcache_hits | 31 | | Qcache_inserts | 81 | | Qcache_lowmem_prunes | 0 | | Qcache_not_cached | 154 | | Qcache_queries_in_cache | 13 | | Qcache_total_blocks | 35 | +-------------------------+----------+ Qcache_hits: 命中次数 Qcache_free_memory: 剩余缓存空间,尚未划分成块的空间 Qcache_free_blocks: 空闲的块数,划分完成但还没使用的空间 Qcache_total_blocks: 总块数 Qcache_queries_in_cache: 在缓存中,缓存插入的次数。 Qcache_not_cached: 没有缓存的 Qcache_lowmem_prunes: 因为内存太少而修剪内存的次数。 碎片整理:FLUSH QUERY_CACHE 清空缓存:RESET QUERY_CACHE
计算命中率:
mysql> SHOW GLOBAL STATUS WHERE Variable_name=‘Qcache_hits‘ OR Variable_name=‘Com_select‘; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | Com_select | 251 | | Qcache_hits | 31 | +---------------+-------+ Com_select: 非缓存查询次数 Qcache_hits: 缓存命中次数 Qcache_hits/(Com_select+Qcache_hits) 也应该参考另外一个指标:命中和写入的比率,即Qcache_hits/Qcache_inserts的值,此比值如果能大于3:1,则表明缓存也是有效的。能达到10:1,为比较理想的情况。
MySQL缓存优化使用思路:
1、批量写入而非多次单个写入; 2、缓存空间不宜过大,因为大量缓存同时失效时会导致服务器假死; 3、必要时,使用SQL_CACHE和SQL_N0_CACHE手动控制缓存; 4、对写密集型的应用场景来说,禁用缓存反而能提高性能;
MySQL日志:
日志分类
1.查询日志:繁忙的服务器不建议记录查询日志 2.慢查询日志:查询执行时长超过指定时长的查询,即为慢查询 3.错误日志: 4.事务日志: ib_logfile0 ib_logfile1 随机I/O转换为顺序I/O从而保证ACID的持久性。只要事务提交,马上写入事务日志中。 事务日志有可能承担读操作,innodb_buffer可能会把装不下的内容放入事务日志 5.日志文件组:
特性:
1)至少应该有两个日志文件。 2)第一个满了以后,启动第二个。第一个日志文件开始向磁盘同步。 3)如果事务刚写到事务日志中数据库奔溃,再重启后,会把事务日志继续同步至数据文件,从而达到一致性。 4)但如果事务日志所在的磁盘损坏导致奔溃,则无法恢复。所以要保证事务日志所在存储足够可靠。 5)为了分摊事务日志I/O和同步数据文件的I/O,数据文件和事务日志要分开存放
相关参数:
innodb_log_file_size 事务日志大小 innodb_log_files_in_group 事务日志组个数 innodb_log_group_home_dir 事务日志所在位置,"./"是安装目录 innodb_flush_log_at_trx_commit 是否事务提交后马上同步日志 可以放在固态硬盘上从而提高性能。 注意:尽可能使用小事务以提升事务引擎的性能。以保证尽量在回滚时,降低硬盘I/O开销
查询查询日志: 繁忙的服务器不建议开启
log={ON|OFF}:是否记录所有语句的日志信息于一般查询日志文件(general_log),5.6以后弃用,重复选项; log_output={TABLE|FILE|NONE} TABLE和FILE可以同时出现,用逗号分隔即可; TABLE : 记录到表中,在mysql库中的general_log 表 FILE : 记录到文件中,在general_log_file 选项指定日志存放位置 general_log:是否启用查询日志; general_log_file:定义一般查询日志保存的文件
慢查询日志: 用于评估系统性能,procona有工具用来分析慢查寻日志
long_query_time: 10.000000 定义多长时间算是慢,单位为秒 slow_query_log={ON|OFF} 设定各用户级别是否启用慢查询日志;它的输出位置也取决log_output={TABLE|FILE|NONE}; slow_query_log_file=www-slow.log 定义日志文件路径及名称; log_slow_filter=admin,filesort,filesort_on_disk,full_join,full_scan,query_cache,query_cache_miss,tmp_table,tmp_table_on_disk 哪些查询不记录日志 log_slow_queries=ON 只有管理员才能修改,全局是否记录慢查日志 log_slow_rate_limit=1 记录速率 log_slow_verbosity 是否记录详细的慢查日志
错误日志:
1.服务器启动和关闭过程中的信息; 2. 服务器运行过程中的错误信息; 3. 事件调度器运行一个事件时产生的信息; 4. 在复制架构中的从服务器上启动从服务器线程时产生的信息;
log_error = /path/to/error_log_file 直接指向日志文件 log_warnings = {1|0} 是否记录警告信息于错误日志中;
中继日志:
从主服务器复制了来的二进制日志
二进制日志:有以下用途
1.引起mysql服务器改变的任何操作。 2.复制功能依赖于此日志。 3.从服务器通过复制主服务器的二进制日志完成主从复制,在执行之前保存于中继日志中。 4.从服务器通常可以关闭二进制日志以提升性能。 5.主要用于时间点恢复 5.数据库复制
本文出自 “Opensamlee” 博客,请务必保留此出处http://gzsamlee.blog.51cto.com/9976612/1785711
以上是关于关系型数据库之Mysql引擎-日志-用户管理的主要内容,如果未能解决你的问题,请参考以下文章
《MySQL系列-InnoDB引擎14》文件-日志文件-错误日志