Mariadb基础总结

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mariadb基础总结相关的知识,希望对你有一定的参考价值。

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

完全热备,能够实现快速可靠地完全备份以及部分备份,支持增量备份,支持时间还原,备份过程中不打扰事务操作,能够实现网络功能和压缩功能从而有效的节约磁盘空间,备份完成后还有验证功能,恢复速度很快。







本文出自 “有趣灵魂” 博客,请务必保留此出处http://powermichael.blog.51cto.com/12450987/1952006

以上是关于Mariadb基础总结的主要内容,如果未能解决你的问题,请参考以下文章

mysql/mariadb知识点总结 之 库管理语句

mysql/mariadb知识点总结 之 库管理语句

mysql/mariadb知识点总结 之 库管理语句

python常用代码片段总结

BootStrap有用代码片段(持续总结)

20155234 2017-2018-1《信息安全系统设计基础》课程总结