Mariadb基础总结
1.是什么?
Mariadb是多用户,多线程的SQL数据库服务器。它是C/S架构,即client/server,客服端/服务端架构。MariaDB基于事务的Maria存储引擎,使用了Percona的 XtraDB,InnoDB的变体,性能十分的强大。mariadb由开源社区维护,采用GPL授权许可,完全兼容MySQL。
2.为什么选择mariadb?
(1)开源!开源!开源!重要的事情说三遍!
其实还有更多:
(2) 更多的存储引擎;
Maria 存储引擎
PBXT 存储引擎
XtraDB 存储引擎
FederatedX 存储引擎
(3) 诸多扩展和新特性;
(4) 提供了较多的测试组件;
(5)更快的复制查询处理,运行速度更快
(6)更少的警告和bug
(7)慢查询日志的扩展统计
(8)支持对 Unicode 的排序
3.MariaDB的使用
3.1 安装方式
(1) rpm包;
(a) 由OS的发行商提供;
(b) 程序官方提供;
(2) 源码包;
(3) 通用二进制格式的程序包;
本文采用centos官方cdrom提供的rpm包进行安装,配置好yum仓库,输入一条命令就可以搞定,yum install -y mariadb。
3.2 MariaDB的程序组成
MariaDB是C/S架构的,主程序由客户端和服务端组成。客户端的工具包括但不限于mysql,mysqldump,mysqladmin,mysqlbinlog,它们的功能分别是CLI交互式客户端程序,备份工具,管理工具,二进制日志的工具。服务端的工具包括但不限于mysqld,mysql_safe,mysqld_multi,它们的功能分别是,mysql守护进程,mysql安全工具,mysql多实例工具。服务端有三类套接字地址,分别是:IPV4-->3306/tcp,Unix Sock:/var/lib/mysql/mysql.sock(rpm安装), /tmp/mysql.sock(源码安装)。后面两种是通过本地127.0.0.1地址进行通信。
3.3 命令行交互式客户端程序:mysql
使用man mysql查看mysql的用法。man手册里是这么介绍的,mysql是MySQL的命令行管理工具。使用语法格式为:mysql [OPTIONS] [database],具体选项不做介绍,请自行通过man手册查找使用。
输入mysql -u root -hlocalhost -p以及键入自己设定的密码就可以登陆交互式mysql的操作界面。
输入help就能列出客户端所有的MySQL命令。
3.4 数据库的数据类型
在 MySQL中,有三种主要的类型:文本、数字和日期/时间类型。
参考:http://www.w3school.com.cn/sql/sql_datatypes.asp
3.5服务端的命令
我们介绍了客户端的命令,在这一小节我们介绍服务端的命令。服务端的命令分为两大类,即DDL,DML。DDL(Data Defined Language),即数据定义语言,主要用于管理数据库组件,例如表、索引、视图、用户、存储过程。DML(Data Manapulating Language),即数据操纵语言,主要用管理表中的数据,实现数据的增、删、改、查。
获取命令帮助使用 help contents 或者 help KEYWORD
3.5.1 DDL数据定义语言
数据库管理命令:创建、修改、删除、查看,分别对应CREATE、ALTER、DROP、SHOW。 具体用法内容太多,还请通过help帮助查看以及多多练习才好。
表管理命令:创建、修改、删除、查看,分别对应CREATE TABL,ALTER TABLE,DROP TABLE,SELECT TABLE。具体用法内容太多,还请通过help帮助查看以及多多练习才好。
索引管理:索引是特殊的数据结构。
索引管理命令:
#创建索引 CREATE INDEX index_name ON tbl_name; #删除索引 DROP INDEX index_name ON tbl_name;
用户账号及权限管理命令:
#创建用户账号 CREATE USER ‘username‘@‘host‘ [IDENTIFIED BY ‘password‘]; #删除用户账号 DROP USER ’user‘@’host‘ [, [email protected]]; #授权 GRANT priv_type,... ON [object_type] db_name.tbl_name TO ‘user‘@‘host‘ [IDENTIFIED BY ‘password‘]; #查看用户授权 SHOW GRANTS FOR CURRENT_USER; #回收授权 REVOKE priv_type, ... ON db_name.tbl_name FROM ‘user‘@‘host‘;
具体用法内容太多,还请通过help帮助查看以及多多练习才好 3.5.2 DML数据操作语言
数据操作语言主要有四大命令,即耳熟人详的增删改查,分别对应INSERT, DELETE, UPDATE, SELECT。
INSERT命令:INSERT [INTO]
tbl_name。注意:字符型必须加引号;数值型不能使用引号。
SELECT命令
(1) SELECT * FROM tbl_name; #查看表中所有内容 (2) SELECT col1, col2, ... FROM tbl_name; #对表中某列进行查找 (3) SELECT col1, ... FROM tbl_name WHERE clause; #对表中的某列进行查找并附加某些条件 (4) SELECT col1, ... FROM tbl_name [WHERE clause] ORDER BY col_name, col_name2, ... [ASC|DESC]; #对表中的某列进行查找并附加某些条件,并按照升序降序的方式进行排序,ASC为升序,DESC为降序。
DELETE命令:
DELETE FROM tbl_name WHERE where_condition; #删除表中符合条件的内容
UPDATE命令
UPDATE [LOW_PRIORITY] [IGNORE] table_reference SET col_name1=value1 [, col_name2=value2] ... [WHERE where_condition] [ORDER BY ...] [LIMIT row_count]
help UPDATE介绍写的很复杂,但是使用起来却没这么复杂。
参考:http://www.jianshu.com/p/118e1c41e9f0
3.5.3 工作特性的定义方式
两种方式实现工作特性的定义:一、命令行选项;二、配置文件参数
在命令行中我们可以通过设定变量/参数来修改mysql服务器的运行特性
SHOW [GLOBAL | SESSION] VARIABLES [like_or_where] 显式变量/参数
SHOW GLOBA|[SESSION] STATUS [LIKE clause]; #显式变量状态
SELECT @@[global.|session.]system_var_name
SET [GLOBAL | SESSION] system_var_name = expr
SET GLOBAL innodb_file_per_table=ON
SET [@@global. | @@session. | @@]system_var_name = expr
SET GLOBAL.innodb_file_per_table=on
可以使用like做模糊匹配
%:匹配任意长度的任意字符;
_:匹配任意单个字符
可以使用where做精确查找
变量/参数级别分为两类:global和session。global对全局生效,session对当前会话生效
服务器变量的调整方式:
运行时修改:
global:仅对修改后新建立的会话有效;
session:仅对当前会话有效,且立即生效;
启动前通过配置文件修改:
重启后生效;
SQL MODE:定义mysqld对约束等违反时的响应行为等设定;
常用的MODE:
TRADITIONAL
STRICT_TRANS_TABLES
STRICT_ALL_TABLES
修改方式:
mysql> SET GLOBAL sql_mode=‘MODE‘;
mysql> SET @@global.sql_mode=‘MODE‘;
4.SELECT语句扩展
单表查询::在一张表中获取你需要的数据
用法
SELECT col1, col2, ... FROM tble_name; 极其危险,慎用;
SELECT col1, col2, ... FROM tble_name WHERE clause;
SELECT col1, col2, ... FROM tble_name [WHERE clause] GROUP BY col_name [HAVING clause];
多表查询:实际开发中,需要进行2张表以上进行操作
1.外键
用于建立和加强两个数据表之间的连接。外键即指引用另一个表中的一列或者多列,被引用的列要么有主键约束,要么有唯一键约束。
2.关联关系
3.连接查询多表的数据
4.子查询,会使用各种关键字以及比较运算符查询多表中的数据
5.存储引擎
常见的存储引擎:MyISAM, Aria, InnoDB, MRG_MYISAM, CSV, BLACKHOLE, MEMORY, PERFORMANCE_SCHEMA, ARCHIVE, FEDERATED
5.1 InnoDB:InnoBase
Percona-XtraDB, Supports transactions, row-level locking, and foreign keys
(1)数据存储于“表空间(table space)"中:
(1) 所有数据库中的所有类型为InnoDB的表的数据和索引存储于同一个表空间中;
表空间文件:datadir定义的目录中,文件:ibdata1, ibdata2,
(2) innodb_file_per_table=ON,意味着每表使用单独的表空间文件;
每表的数据文件(数据和索引,存储于数据库目录)存储于自己专用的表空间文件中,并存储于数据库目录下: tbl_name.ibd
(2)事务型存储引擎,适合对事务要求较高的场景中;但较适用于处理大量短期事务
(3)基于MVCC(Mutli Version Concurrency Control)支持高并发
(4)支持四个隔离级别,默认级别为REPEATABLE-READ;间隙锁以防止幻读;
(5)使用聚集索引(主键索引)
(6)支持”自适应Hash索引
5.2 MyISAM
适用场景:只读或读多写少的场景、较小的表(以保证崩溃后恢复的时间较短)。
6.并发控制
所谓并发,必然时有多个连接请求,那并发控制既是对多个连接进行控制的操作处理。
目的:当多个连接对数据库进行修改时保持数据的一致性。
MySQL提供两个级别的并发控制:服务器级(the server level)和存储引擎级(the storage engine level)。加锁是实现并发控制的基本方法,MySQL中锁的粒度:
表级锁
InnoDB在update,delete时使用行级锁,对于select会结合MVCC保证一致性。
锁:Lock
7.事务
事务的概念,会开启、提交和回滚事务
事务的四种隔离级别
read uncommitted 可读未提交的数据-->脏读;
read committed 可读提交的数据-->不可重复读;
repeatable read可读重复的数据-->幻读;
serializable串行化;
创建存储过程
调用、查看、修改和删除存储过程
事务:一组原子性的SQL查询、或者是一个或多个SQL语句组成的独立工作单元;
8.MySQL用户和权限管理
1 为 MySQL 创建一个新用户
CREATE USER username IDENTIFIED BY ‘password‘;
2 授予username用户在所有数据库上的所有权限:
GRANT ALL PRIVILEGES ON *.* TO ‘username‘@‘localhost‘ IDENTIFIED BY ‘password‘;
3 授予username用户在所有数据库上的所有权限并且允许将权限赋予给其他的用户
grant all privileges on *.* to [email protected]‘localhost‘ identified by "jack" with grant option;
4 撤销用户的权限:
revoke delete on *.* from ‘jack‘@‘localhost‘; REVOKE ALL PRIVILEGES ON *.* FROM ‘username‘@‘localhost‘;
5 指定该用户只能执行 select 和 update 命令:
GRANT SELECT, UPDATE ON wordpress.* TO ‘username‘@‘localhost‘ IDENTIFIED BY ‘password‘;
6 刷新权限:
FLUSH PRIVILEGES;
7 查看权限
show grants; show grants for ‘jack‘@‘%‘;
8 对账户重命名
rename user ‘jack‘@‘%‘ to ‘jim‘@‘%‘;
9 修改密码
SET PASSWORD FOR ‘root‘@‘localhost‘ = PASSWORD(‘123456‘); mysqladmin -uroot -p123456 password 1234abcd update user set PASSWORD = PASSWORD(‘1234abcd‘) where user = ‘root‘; flush privileges; mysqld_safe --skip-grant-tables #在丢失密码的情况下使用
删除用户:
DROP USER [email protected];
9.查询缓存
1、query_cache_type 使用查询缓存的方式
select @@query_cache_type; set session query_cache_type=off;
2、系统变量 have_query_cache 设置查询缓存是否可用
show variables like ‘have_query_cache‘;
3、给内存分配的查询缓存的大小
查询缓存的大小要生效,查询缓存的方式要为on,查询缓存要可用,也就是前两步的功能必须要开启。
select @@global.query_cache_size; set @@global.query_cache_size=1000000;
4、query_cache_limit 限制查询缓存结果的最大值
select @@global.query_cache_limit; set @@global.query_cache_limit=1024*1024*2
5、查看缓存的相关变量
show variables like ‘%query_cache%‘ +------------------------------+---------+ | Variable_name | Value | |------------------------------+---------| | have_query_cache | YES | #查询缓存是否可用 | query_cache_limit | 2097152 | #限制查询缓存结果的最大值 | query_cache_min_res_unit | 4096 | #query_cache_min_res_unit的配置是一柄”双刃剑”,默认是4KB,设置值大对大数据查询有好处,但如果你的查询都是小数据 查询,就容易造成内存碎片和浪费。 | query_cache_size | 999424 | #查询缓存的大小 | query_cache_strip_comments | OFF | | query_cache_type | ON | #查询缓存的类型 | query_cache_wlock_invalidate | OFF | #查询在query cache中,是否返回cache结果还是等写操作完成再读表获取结果。 +------------------------------+---------+
6、查看缓存的状态
show status like ‘%Qcache%‘; +-------------------------+---------+ | Variable_name | Value | |-------------------------+---------| | Qcache_free_blocks | 1 | #目前还处于空闲状态的 Query Cache 中内存 Block 数目 | Qcache_free_memory | 982216 | #目前还处于空闲状态的 Query Cache 内存总量 | Qcache_hits | 8 | #查询缓存的命中次数 | Qcache_inserts | 66 | #向查询缓存中插入新的查询缓存的次数,即没有命中的次数 | Qcache_lowmem_prunes | 0 | #当Query Cache内存容量不够,需要从中删除老的Query Cache以给新的Cache对象使用的次数 | Qcache_not_cached | 202 | #没有被Cache的SQL数,包括无法缓存以及sql中设置不会缓存的 | Qcache_queries_in_cache | 0 | #目前在 Query Cache 中的 SQL 数量 | Qcache_total_blocks | 1 | #Query Cache 中总的 Block 数量 +-------------------------+---------+
7、检查查询缓存使用情况
检查缓存命中率计算公式:Qcache_hits/(Qcache_hits + Com_select)。
show status like ‘%Com_select%‘;
查询缓存碎片率 = Qcache_free_blocks / Qcache_total_blocks * 100%
整理缓存碎片:FLUSH QUERY CACHE,或者可以减小query_cache_min_res_unit的值
查询缓存利用率 = (query_cache_size - Qcache_free_memory) / query_cache_size * 100%
查询缓存利用率在25%以下的话说明query_cache_size设置的过大,可适当减小;查询缓存利用率在80%以上而且 Qcache_lowmem_prunes > 50的话说明query_cache_size可能有点小,要不就是碎片太多。
优化提示:
如果Qcache_lowmem_prunes 值比较大,表示查询缓存区大小设置太小,需要增大。
如果Qcache_free_blocks 较多,表示内存碎片较多,需要清理,flush query cache
10.MySQL的索引
10.1、是什么?
通常我们说索引,索引就是图书馆里的索引,图书馆里的索引把书刊中的内容进行分类,标上索引标记以便于人们能够快速的找到自己需要的书籍。mysql中的索引的功能也是如此,即加速检索数据的速度。准确的说,mysql中的索引是帮助mysql高效获取数据的数据结构。索引的本质就是数据结构。
10.2、有什么用?
加速数据的查询速度。
10.3、分类
mysql的索引是在mysql的存储引擎层实现的。一般来说,每种存储引擎所支持的索引类型都不太相同。mysql提供了以下4种索引类型。
B-Tree 索引:平衡树索引,大部分引擎都支持B-Tree索引。
1)普通索引
(1)创建索引: CREATE INDEX 索引名 ON 表名(列名1,列名2,...);
(2)修改表: ALTER TABLE 表名ADD INDEX 索引名 (列名1,列名2,...);
(3)创建表时指定索引:CREATE TABLE 表名 ( [...], INDEX 索引名 (列名1,列名 2,...) );
2)UNIQUE索引
(1)创建索引:CREATE UNIQUE INDEX 索引名 ON 表名(列的列表);
(2)修改表:ALTER TABLE 表名ADD UNIQUE 索引名 (列的列表);
(3)创建表时指定索引:CREATE TABLE 表名( [...], UNIQUE 索引名 (列的列表) );
3)主键:PRIMARY KEY索引
(1)主键一般在创建表的时候指定:“CREATE TABLE 表名( [...], PRIMARY KEY (列的列表) ); ”。
(2)但是,我们也可以通过修改表的方式加入主键:“ALTER TABLE 表名ADD PRIMARY KEY (列的列表);
HASH索引:只有内存引擎支持,使用的场景简单。
R-Tree索引(空间索引):主要用于地理空间数据类型。
Full-text(全文索引):myISAM中一种特殊索引类型,主要用于全文索引。
10.4、如何用?如何优化?
索引选择性
1. 较频繁的作为查询条件的字段应该创建索引
2. 唯一性太差的字段不适合单独创建索引,即使频繁作为查询条件
3. 更新非常频繁的字段不适合创建索引
4. 不会出现在 WHERE 子句中的字段不该创建索引
注意事项:
一般两种情况下不建议建索引:
表记录比较少,例如一两千条甚至只有几百条记录的表,没必要建索引,让查询做全表扫描就好了;
索引的选择性较低。所谓索引的选择性(Selectivity),是指不重复的索引值(也叫基数,Cardinality)与表记录数(#T)的比值:
不要过度索引,只保持所需的索引。每个额外的索引都要占用额外的磁盘空间,并降低写操作的性能。
11.日志
包含:错误日志、查询日志、慢查询日志、事务日志、二进制日志;
12.备份和恢复(数据)
参考:http://blog.jobbole.com/91547/
mysql常见的三种备份恢复的方式
1、Mysqldump+二进制日志实现备份
思路概念
mysqldump是一个逻辑备份命令;即将数据备份成一个文本文件,也可以说将表的结构和数据存储在文本文件中。
工作原理:查找出备份的表结构,再生成一个CREATE语句,然后,再将表中的所有记录转换成一条INSERT语句。这些语句都是还原时候用的,还原数据通过CREATE语句创建表,使用INSERT插入数据。它能备份整个服务器,单个或多个数据库,单个或多个表,单行或多行数据,还能实现存储过程,存储函数,触发器的备份,并且能够记录二进制日志文件的相应的位置。InnoDB能够实现热备,MyISAM则最多支持温备。
备份策略
mysqldump全备+二进制日志增备
实现过程
(1)Mysqldump全备
由于MyISAM只能够实现温备(备份时仅能够进行读请求),所以我们要为所有的数据库添加读锁。
(2)二进制全备
方法一:导出二进制日志文件内容
方法二:滚动日志复制文件
(3)二进制增备
模拟数据库损坏,实现恢复工作
2、利用LVM快照+二进制日志实现备份
2.1、思路
(1)首先这种备份方式要求mysql的数据必须保存在逻辑卷上
(2)必须施加读锁(mysql>FLUSH TABLES WITH READLOCK;)
(3)另起终端为数据所在的卷创建快照(lvcreate),保证事务日志和数据文件必须在同一个卷上
2.2、备份策略
LVM快照全备+二进制日志增备
2.3前提条件
创建逻辑卷及挂载逻辑卷
初始化mysql将其数据目录指向/mydata/data
编辑查看配置文件,重启服务
2.4、过程展示
(1)确保事务日志和数据文件必须在同一卷上
(2)施加全局锁并滚动日志
(3)查看并保存当前正在使用的二进制日志及当前执行二进制日志位置(非常重要)
(4)创建快照卷
(5)立即切换终端释放锁
(6)备份数据
(7)二进制实现增量备份
(8)模拟数据库崩溃
(9)恢复数据
3、使用Xtrabackup
完全热备,能够实现快速可靠地完全备份以及部分备份,支持增量备份,支持时间还原,备份过程中不打扰事务操作,能够实现网络功能和压缩功能从而有效的节约磁盘空间,备份完成后还有验证功能,恢复速度很快。