CentOS6.5下MariaDB日志及事物详解和基本操作语句
来源:互联网 发布:3cdaemon 端口 编辑:程序博客网 时间:2024/05/21 14:08
MySQL日志类别:
一般查询日志:log,general_log,log_output
慢查询日志:查询执行的时长超过指定的查询,即为慢查询;
错误日志:通常时指错误日志的相关信息,通常用服务器关闭和启动的日志信息,服务器运行过程中的错误信息,还可以记录警告信息。
二进制日志:只是跟修改相关的操作,可以理解为一个重做日志,用于复制的基本凭据;
中继日志:它其实跟复制相关的,与二进制日志几乎相同;
事物日志:随机I/O转换为顺序I/O,一般在两个文件存储,一个存满了就换另外一个存
查询日志:
慢查询日志:
错误日志:
1、服务器启动和关闭过程中的信息;
2、服务器运行过程中的错误信息;
3、事件调度运行一个事件时产生的信息;
4、在复制架构中的从服务器上启动从服务器线程时产生的信息;
log_error = /path/to/error_log_file:指定保存至一个特定目录下的某个文件中
log_warnings = {0|1}:是否记录警告信息于错误日志中
二进制日志:
记录跟修改有关的信息,影响数据潜在的内容的信息,select的是不会被记录到二进制日志的,二进制日志也叫复制日志,默认在数据目录下,专门查看日志的命令是:mysqlbinlog
二进制日志的功用:
1、做时间点恢复,要想从哪个时间点恢复我们可以手动调的,所以这是一个备份恢复的重要工具
2、做复制;
因为我们的MySQL数据是单进程多线程的工作机制,所以他可以同时发起很多们修改的语句,但是我们服务器使用的日志只有一个,那如果同时进行的多个线程的请求都同时往日志文件中写数据,日志文件就成了资源热点,也叫资源征用点,那就会混乱不堪,为了解决这种问题,这里,当我们的线程要往二进制日志文件中写数据的时候,它不是直接写到日志文件中去,还是统一写到日志缓冲区中,由日志缓冲区逐一写入日志文件中去,然而我们的日志文件对于一个很繁忙的服务器来讲,每天都会产生很大的数据量,如果所有的二进制日志数据都写在一个日志文件中,那管理起来就特点的不方便了,也很不合理,如是日志文件丢失,那所有的日志数据信息都丢失了,不应该这么做,那我们就有日志滚动的机制了,二进制日志我们可以自己定义,有两种定义日志滚致力的方法,一种是按大小来定义的,比如说我们定义一个日志文件的大小为1G,那他存储一了大概1G左右就会滚动,使用下一个日志来存放二进制日志数据;另一种可以按时间来定义的,比如说一周滚动一次,或者说一个月,一天滚动一次都可以;或者每次重启服务时或者执行FLUSH LOGS命令时都会滚动一次日志。
MySQL记录二进制日志的格式有三种:
基于语句:statement,能够保存数据一模一样的就基于语句保存
基于行的:row,比如说插入当前时间,现在插入是当前的时间,过几天插入还是要插入当前的时间吗,当前时间的函数:CURRENT_DATE(),基于行记录的信息更加精确,但有些时候数据理过大,比如更新10000条数据只写一条语句,还基于行记录就要记录1000条。
混合模式:mixed,由MySQL自己判断以什么方式记录日志
二进制日志文件内容格式主要有以下几个记录标志信息:
跟二进制日志文件相关的服务器参数:
注意:切勿将二进制日志与数据文件放在同一设备中,这样即提升了性能,又保证数据文件的损坏而导致数据无法恢复的。默认是和数据文件存放在一起的,所以MySQL的很多默认设定并不适合生产环境中的使用,需要我们去调整的。
中继日志:它其实跟复制相关的,与二进制日志几乎相同,只不过它不是用于记录事件的,而是作为读取数据的源并且在本地执行的,当然中继日志是在从服务器上。
MySQL多表查询和子查询:
联结查询:事先将两张或多张表join,根据join的结果进行查询,交叉联结
MariaDB [hellodb]> SELECT * FROM students,classes;交叉联结查询多张表组合成一张表显示。
自然联结:也称为内联结或叫等值联结
等值联结:把两张表的对应字段做等值关联,也叫内联结
条件联结:多表联结后以WHERE为条件的多表联结
外联结:外联络又分为左外联结和右外联结
别名:
表别名在表后面使用AS加使用的别名即可,字段别名在字段后面使用AS加使用的别名即可。
在查询中嵌套的查询叫做子查询
1、用于比较表达式中的子查询时,返回值只能有一个,用于WHERE中的子查询
2、用于EXISTS中的子查询,判断存在于否
3、用于IN中的子查询,判断存在于指定列表中
用于FROM中的子查询:
SELECT alias.col,……FROM (SELECT clause) AS alias WHERE condition
MYSQL不擅长子查询
MySQL的联合查询:把两个或多个查询语句的结果合并成一个结果输出UNION
SELECT clauase UNION SELECT clause UNION………
视图:其实就是一张虚表,存储下来的SELECT语句:
视图有额外的副作用,如果用户被授权可以插入数据,那用户是可以在视图中插入数据的,这样一来,那如果有依赖关系的数据就不完整了,而视图也不能保存数据,数据应该保存在基表中,就是视图所依赖的表,所以视图要做精确规划的,否则可能会导致一些意的情况。
MySQL锁类型:执行操作时施加的锁模式
读锁:也被叫做共享锁,多个读操作可以同时施加的,是非阻塞式的
写锁:独占锁,也叫排它锁,自己完全独立使用的,是阻塞式的
锁粒度:根据锁的粒度可以分为以下几种
表锁:table lock,锁定了整张表
行锁:row lock,锁定需要的行,不一定是一行,也可以是多行
粒度越小,开销越大,但并发性越好,比如说锁需要的行就是开销大
粒度越大,开销越小,但并发性越差,比如说锁整张表就是开销小
因此,不管是在mysql数据库上也好,在其它的关系型数据库上也好,一个最需要完成的做法选择一个合适的锁策略,尽可能在锁的粒度上和其并行性之间找到一个平衡点,所以说并不一定表锁就优于行锁,行锁优于表锁,选择一个好的锁策略至关重要。
基于mysql在哪个级别上实现的,锁的实现位置,锁又分为以下几种:
MySQL锁:在这个级别上的锁可以手动使用,也可以使用显式锁
存储引擎锁:自动进行的,由存储引擎自动使用的叫隐式锁,
显式的实现(表级别的锁):
mysql > LOCK TABLES锁表
mysql > UNLOCK TABLES解锁表
语法:LOCK TABLES
tbl_name [[AS] alias] lock_type
[, tbl_name [[AS] alias] lock_type] ...
lock_type:锁类型有两类:读锁和写锁
READ [LOCAL] | [LOW_PRIORITY] WRITE
mysql> LOCK TABLES classes READ;读锁
mysql> LOCK TABLES classes WRITE;写锁
InnoDB存储引擎也支持另外一种显式锁(锁定挑选出来的部分行)使用的是行级锁:
事物(Transaction):就是一组原子性的查询语句,跟数据库对象创建无关,主要指SELECT查询的,将多个查询当作一个独立的工作单元,事物是串形的,只有两个事物压根不会涉及到同一张表时才会同时执行,只要涉及到同一个数据集两个事物是不会执行的。
ACID测试:能满足ACID测试的就表示其支持事物的,或兼容事物
A:Atomicity原子性,所谓原子性是一个事物必须是一个不可分隔的单元,要么都执行,要么都不执行。
C:Consistency一致性,所谓一致性就是一个状态的一致性转换到另一个状态的一致性,比如说银行转帐,转帐之关两个帐户的总金额等于转帐之后两个帐户的总金额就是一致性。
I:Isolation隔离性,一个事物的所作修改操作在提交之前对所有人的所作的操作都是不可见的。注意:隔离性会导致其并发性极大的降低的。
D:Durability持久性,一旦事物提交了,其所做的修改将永久保存在数据中,永久有效,不会因为其它操作还导致数据损失。
总体来讲,数据的安全性越高,其并发性就越差,而隔离会导致其并发性极大的降低的,所以引入了隔离级别的概念:
隔离级别,四个隔离级别:
READ UNCOMMITTED (读未提交)就是读别人尚未提交的数据,其数据安全性最差,但并发性最好,读别人没提交的数据叫脏读;有可以产生不可重复读,就是两次读到的数据不一样叫不可重复读;看到的数据和背后的数据不一样叫幻读;
READ COMMITTED(读提交),只有别人提交事物了才可以看得到,所谓读提交就是一个事物开始的时候只能看见已提交事物的修改,其它未提交的修改统统看不到,不可重读;
REPEATABLE READ(可重读)这个是mysql默认级别,可重读解决了脏读问题,因为每一次读到的结果都是一样的就叫可重读,保证了多次读到的数据都是同一数据。
SERIALIZABLE(可串行化)事物和事物严格隔离,隔离级别很高,性能极低,强制事物的串行执行避免了幻读。只有在确保数据在非常一致性的前提下才可以读到数据。
在一种情况下:我自己的事物启动了,别人的事物也启动了,别人改了一个数据,自己读到的是一个样,在别人改完之后还是读到原来的样子,这叫幻读,看到的数据跟背后的不一样。
MVCC:多版本并发控制
每个事物启动时,InnoDB为会每个启动的事物提供一个当下时刻的快照,
为了实现这种功能,InnoDB会为每个表提供隐藏的字段,一个用于保存行的创建时间,一个保存的是失效时间,里面存储的是系统版本号(system version number)
多版本并发控制只在两个隔离级别下有效:READ COMMITTED和REPEATABLE READ
INSERT INTO:replace
第一种:INSERT INTO tb_name [(clo1,col2……)] {VALUES|VALUE} (val1,val2)
第二种:INSERT INTO tb_name SET col1=val1,col2=val2,……
第三种:INSERT INTO tb_name SELECT clause
REPLACE的工作机制:与INSERT相同,除了在新插入的数据与表中的主键或惟一索引定义的数据相同会替换老的行的数据。
UPDATE更新语句:
UPDATE tb_name SET col_name1=val1,col_name2=val2,……
UPDATE [LOW_PRIORITY] [IGNORE] table_reference
SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ...
[WHERE where_condition]
[ORDER BY ...] :在限定所修改的行数前先做下排序
[LIMIT row_count] :限定所修改的行数据
UPDATE通常情况下,必须要使用WHERE子句,或者使用LIMIT限制要修改的行数。
--safe-updates
DELETE删除数据的语句:
DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name
[WHERE where_condition]
[ORDER BY ...]
[LIMIT row_count]
对我们而言,只有单表才有意义,它跟UPDATE一样,如果不加WHERE条件限定要删除哪些行的话,将会删除所有的行,from通过某一张表删除什么样的数据,不用指定字段,因为我们删除都是行的数据,还不能删除字段的,字段只能被清空或修改,所以一删除就是一行。
TRUNCATE tb_name:如果我们的表中有自动增长的字段的话,如果删除一数据,新插入的数据不会自动重置为1的,这样我们可以用这个truncate重置自动增长的值。
MySQL查询缓存:
用于保存MySQL查询语句返回的完整结果,被命中时,MySQL会立即返回结果,如何检查缓存:把SELECT语句本身做hash计算,计算的结果作为key,查询结果作为value,什么样的语句不会被缓存呢:查询语句中一些不确定的数据时,不会缓存,例如:NOW(),CURRENT_TIME()、一般来说,如果查询中包含用户自定义函数,存储函数,用户变量,临时表mysql库中的系统表、或者任何包含权限的表,一般都不会缓存。
本文出自 “温水煮青蛙” 博客,请务必保留此出处http://tanxw.blog.51cto.com/4309543/1395568
- CentOS6.5下MariaDB日志及事物详解和基本操作语句
- CentOS6.5下MariaDB日志及事物详解和基本操作语句
- Mariadb数据库:基本语句及操作 数据库及用户管理
- Centos6.5下安装mariadb
- Mariadb的安装和基本操作
- mariaDB语句详解
- Mariadb(mysql)基本操作
- MariaDB基本管理操作
- MariaDB基本管理操作
- SQL数据库基本操作语句 详解及用途
- centos6.5下编译安装mariadb-10.0.20
- centos 下安装MariaDB 及其基本操作指令
- mysql 基本操作 触发器、锁、事物、分布式事物、sql安全问题、sql mode详解 (第五章)
- 数据库mariadb的基本操作
- CentOS6.4下python2.6连接MariaDB
- Centos6.5下端口映射操作
- CentOS6上安装和使用MariaDB
- Mariadb用户操作/数据库基本操作 (一)
- 对比windows和linux的对父进程的文件描述符继承的设置
- 2003 - Cann't connect to MySql server on - 'localhost'(10061)
- Android Studio——如何将AndroidStudio的项目提交到Github上
- YTU 2920: Shape系列-7
- 利用getClassLoader().getResource(*).getPath()获取绝对路径时,因为空格不能获取绝对路径的问题
- CentOS6.5下MariaDB日志及事物详解和基本操作语句
- 【JVM系列】Java 虚拟机指令操作码的映射表
- c文件操作-二进制文件读写
- 第1章第2节练习题7 递减输出
- 复制并删除源文件
- [leetcode] 116. Populating Next Right Pointers in Each Node 解题报告
- iOS开发-JSON和XML的数据解析
- 欢迎使用CSDN-markdown编辑器
- Gson解析null替换为空字符串