一、目前流行的开源RRDBMS
- WebScaleSQL
2015年1月20日,Facebook宣布阿里巴巴旗下的阿里云RDS团队正式加入WebScaleSQL。WebScaleSQL是Facebook、 Google、Twitter和Linkedin四家公司的MySQL团队发起的MySQL开源组织,旨在改进MySQL在规模和性能等方面的问题。WebScaleSQL是基于MySQL 5.6 社区版本改编的MySQL通用分支,基于GPL开源协议发布。WebScaleSQL目前已经做了很多性能改进工作,包括:客户端异步协调、逻辑预读、查询限流、服务端线程池优化、InnoDB大页支持等等。由于我们的分支上本身有一些定制化的需求,因此不会直接使用WebScaleSQL分支提供线上服务,但是这些改进对于我们都是很感兴趣的,好的特性会被吸收进来。因为我们有各种各样应用场景的用户,对MySQL本身的要求也比较高。比如大并发连接的用户,就需要线程池;存大量历史数据的用户,就要求高的压缩比等等。通过这可以看出虽然WebScaleSQL诞生时间较晚,但是其维护力量可以说是很强大的,最后用一句话概括:这款数据库就是专门为web服务设计的数据库。
- PostgreSQL
PostgreSQL是以加州大学伯克利分校计算机系开发的 POSTGRES,现在已经更名为PostgreSQL,版本 4.2为基础的对象关系型数据库管理系统(ORDBMS)。PostgreSQL支持大部分 SQL标准并且提供了许多其他现代特性:复杂查询、外键、触发器、视图、事务完整性、MVCC。同样,PostgreSQL 可以用许多方法扩展,比如, 通过增加新的数据类型、函数、操作符、聚集函数、索引。免费使用、修改、和分发 PostgreSQL,不管是私用、商用、还是学术研究使用。
- SQLite
SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。它是D.RichardHipp建立的公有领域项目。它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源的世界著名数据库管理系统来讲,它的处理速度比他们都快。SQLite第一个Alpha版本诞生于2000年5月。 至2015年已经有15个年头,SQLite也迎来了一个版本 SQLite 3已经发布。
- MariaDB
MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可 MariaDB的目的是完全兼容MySQL,包括API和命令行,使之能轻松成为MySQL的代替品。在存储引擎方面,使用XtraDB(英语:XtraDB)来代替MySQL的InnoDB。 MariaDB由MySQL的创始人Michael Widenius(英语:Michael Widenius)主导开发,他早前曾以10亿美元的价格,将自己创建的公司MySQL AB卖给了SUN,此后,随着SUN被甲骨文收购,MySQL的所有权也落入Oracle的手中。MariaDB名称来自Michael Widenius的女儿Maria的名字。
MariaDB基于事务的Maria存储引擎,替换了MySQL的MyISAM存储引擎,它使用了Percona的 XtraDB,InnoDB的变体,分支的开发者希望提供访问即将到来的MySQL 5.4 InnoDB性能。这个版本还包括了 PrimeBase XT (PBXT) 和 FederatedX存储引擎。
说在最后,目前由于MySQL是属于Oracle公司的一款产品,而Oracle有将MySQL闭源的潜在风险,现在有很多大公司已经弃用MySQL,而MariaDB就是由MySQL之父Michael领头设计出来的一款开源数据库。确切来讲MariaDB是MySQL的分支版,而且整合了开源社区的很多东西,所以这款产品可以说就是MySQL的替代产品。由于其完全兼容MySQL所以今后演示就用MariaDB进行演示,而所有理论上的概念还是以MySQL为基础。
二、MySQL基本概念
1、语句结构
- 数据定义语言(DDL:Data Definition Language):
其语句包括动词CREATE和DROP。在数据库中创建新表或删除表(CREAT TABLE 或 DROP TABLE);为表加入索引等。DDL包括许多与人数据库目录中获得数据有关的保留字。它也是动作查询的一部分。
- 数据操作语言(DML:Data Manipulation Language):
其语句包括动词INSERT,UPDATE和DELETE。它们分别用于添加,修改和删除表中的行。也可以称为动作查询语言,使用SELECT语句。
- 数据控制语言(DCL:Data Control Language):
它的语句通过GRANT或REVOKE获得许可,确定单个用户和用户组对数据库对象的访问。某些RDBMS可用GRANT或REVOKE控制对表单个列的访问。
2、ACID特性
ACID,指数据库事务正确执行的四个基本要素的缩写。包含:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。一个支持事务(Transaction)的,必需要具有这四种特性,否则在事务过程(Transaction processing)当中无法保证数据的正确性,交易过程极可能达不到交易方的要求。
- 原子性:整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
- 一致性:在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。具体来说就是,比如表与表之间存在外键约束关系,那么你对数据库进行的修改操作就必需要满足约束条件,即如果你修改了一张表中的数据,那你还需要修改与之存在外键约束关系的其他表中对应的数据,以达到一致性。
- 隔离性:隔离状态执行事务,使它们好像是系统在给定时间内执行的唯一操作。如果有两个事务,运行在相同的时间内,执行相同的功能,事务的隔离性将确保每一事务在系统中认为只有该事务在使用系统。这种属性有时称为串行化,为了防止事务操作间的混淆,必须串行化或序列化请求,使得在同一时间仅有一个请求用于同一数据。
- 持久性:在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。
3、隔离级别
SQL标准定义了4类隔离级,包括了一些具体规则,用来限定事务内外的哪些改变时可见的,哪些是不可见的。低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销。
- READ UNCOMMITTED(读取未提交内容)
在READ UNCOMMITTED隔离级,所有事务都可以“看到”未提交事务的执行结果。在这种级别上,可能会产生很多问题。本隔离级很少用于实际应用,因为它的性能也不比其他级别好多少,而别的级别还有其他更多的优点。读取未提交数据,也被称之为“脏读(Dirty Read)”
- READ COMMITTED(读取提交内容)
大多数数据库系统的默认隔离级是READ COMMITTED(但这不是MYSQL默认的)。它满足了隔离的早先简单定义:一个事务在开始时,只能“看见”已经提交事务所做的改变,一个事务从开始到提交前,所做的任何数据改变都是不可见的,除非已经提交。这种隔离级别也支持所谓的“不可重复读(Nonrepeatable Read)”。这意味着用户运行同一语句两次,看到的结果是不同的。
- REPEATABLE READ(可重读)
REPEATABLE READ 隔离级解决了READ UNCOMMITTED隔离级导致的问题。它确保同一事务的多个实例在并发读取数据时,会“看到相同的”数据行。不过理论上,这会导致另一个棘手问题:幻读(Phantom Read)。简单来说,幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影”行。InnoDB和Falcon存储引擎通过多版本并发控制机制解决了幻读问题。 REPEATABLE READ 是MYSQL的默认事务隔离级。InnoDB和Falcon存储引擎都遵循这种设置。
- SERIALIZABLE(可串行化)
SERIALIZABLE是最高级别的隔离级,它通过强制事务排斥,使之不可能相互冲突,从而解决幻读问题。简言之,SERIALIZABLE是在每个读的数据行上加锁。在这个级别,可能导致大量的超时现象和锁竞争现象。很少看到有用户选择这种隔离级。
注:不可重复读与幻读:不可重复读的重点是修改(同样的查询条件,你读取过的数据,再次读取出来发现值不一样了);幻读的重点在于新增或者删除(同样的查询条件,第1次和第2次读出来的记录数不一样)
三、MySQL安装后初始化
前面我已经将MySQL数据库进行通用二进制安装,而把MariaDB进行源码安装,在安装好数据库后我们首要的任务就是初始好数据库,下面就是介绍如何初始化数据库。
1、初始化第一步提供配置文件
首先mysql的数据库配置文件可分为三段及:[mysqld]、[mysql]、[client],这三段配置所对应的意思为:
- [mysqld] :对应与mysql服务端
- [mysqld_safe] :对应与指定的safe端
- [client]:对应于所有的客户端
通过下面的命令的输出结果我们可以知道mysql是如何读取配置文件的:
[[email protected] ~]# /usr/local/mysql/bin/mysqld --help --verbose |head -20
Default options are read from the following files in the given order:
/etc/mysql/my.cnf /etc/my.cnf ~/.my.cnf
使用配置文件的方式:
- 它依次查找每个需要查找的文件,结果是所有文件并集;
- 如果某参数在多个文件中出现多次,后读取的最终生效;
然而上面的命令输出结果并不是只输出读取配置文件信息的,还有以下输出信息:
- 显示mysqld程序启动时可用的选项,通常都是长选项
- 显示mysqld的配置文件中可用的服务变量
我们还可以通过在mysql的交互式接口查看配置信息:
- mysql> SHOW GLOBAL VARIABLES; //全局有效的配置
- mysql> SHOW SESSION VARIABLES; //当前会话级别有效的配置
2、初始化第二步设置用户信息
删除所有匿名用户
mysql> DROP USER ''@'localhost';
mysql> DROP USER ''@'example.com';
mysql用户帐号由两部分组成:username@'host'
host还可以使用通配符:
%: 任意长度的任意字符
_: 匹配任意单个字符
在mysql交互式接口给所有的root用户设定密码:
mysql> SET PASSWORD FOR username@'host' = PASSWORD('your_passwrod');
mysql> UPDATE user SET password = PASSWORD('your_password') WHERE user = 'root';
mysql> FLUSH PRIVILEGES;
在shell命令行给所有的root用户设定密码:
# mysqladmin -uUserName -hHost password 'new_password' -p
# mysqladmin -uUserName -hHost -p FLUSH-PRIVILEGES
四、连接MySQL
1、mysql client 和mysqld之间的传输会有下面两种状况
- 本地通信:客户端与服务器端位于同一主机,而且还要基于127.0.0.1(localhost)地址或lo接口进行通信;
Linux OR Unix: Unix Sock,
Windows: memory, pipe
- 远程通信:客户端与服务器位于不同的主机,或在同一主机而使用非回环地址通信。
TCP socket
2、客户端/非客户端工具
mysql客户端工具有:mysql, mysqladmin, mysqldump, mysqlcheck这些工具的配置信息都可以在配置文件的[client]中定义。
- 通用的选项:
-u, --user=
-h, --host=
-p, --password=
--protocol={tcp|socket|memory|pipe}
--port=
--socket= 例如:/tmp/mysql.sock
mysql的非客户端类的管理工具:myisamchk, myisampack
3、一些小知识
- 获取mysql帮助信息:
mysql> help contents //获取所有命令模块
mysql> help Keryword //获取相关命令的帮助信息
- mysql命令行选项:
--compress //客户端与服务端压缩传输
--database=, -D //设定进入mysql命令行时默认的库
-H, --html: 输出结果为html格式的文档
-X, --xml: 输出格式为xml
--sate-updates: 拒绝使用无where子句的update或delete命令;
--ssl-ca=/path/to/ssl_ca_file //获取ca证书后传输
--ssl-capath=/path/to/ssl_ca_dir //证书有多个时
- mysql命令提示符:
mysql> 等待输入命令
-> //续行符
'>
">
`>
/*> //注释信息
- mysql的快捷键:
Ctrl + w: 删除光标之前的单词
Ctrl + u: 删除光标之前至命令行首的所有内容
Ctrl + y: 粘贴使用Ctrl+w或Ctrl+u删除的内容
Ctrl + a: 移动光标至行首
Ctrl + e: 移动光标至行尾
4、mysqldmin工具使用
语法:mysqladmin [options] command [arg] [command [arg]] ...
- command
create DB_NAME:创建数据库
举例:# mysqladmin -uroot CREATE testdb -p
drop DB_NAME:删除数据量
举例:# mysqladmin -uroot DROP testdb -p
debug:打开调试日志并记录于mysql的error log中;
status:显示简要状态信息
--sleep #: 间隔时长
--count #: 显示的批次
使用举例:
[[email protected] ~]# mysqladmin -uroot status -p
Enter password:
Uptime: 18616 Threads: 2 Questions: 70 Slow queries: 0 Opens: 5 Flush tables: 1 Open tables: 68 Queries per second avg: 0.003
extended-status: 输出mysqld的各状态变量及其值,相当于执行“mysql> SHOW GLOBAL STATUS”
举例:# mysqladmin -uroot extended-status -p
variables: 输出mysqld的各服务器变量
flush-hosts: 清空主机相关的缓存:DNS解析缓存,此前因为连接错误次数过多而被拒绝访问mysqld的主机列表。
flush-logs:日志滚动,关闭当前日志打开新日志,主要是打开二进制日志和中继日志。
flush-privileges:让服务器重读授权表。
flush-status: 重置状态变量的值。
flush-tables: 关闭当前打开的表文件句柄,当服务器还在读写时不能进行此操作。
flush-threads:清空线程缓存。
reload: 功能同flush-privileges
refresh: 相当于同时使用flush-logs和flush-hosts
kill:杀死指定的线程,可以一次杀死多个线程,以逗号分隔,但不能有多余空格。
password:修改当前用户的密码;
ping:探测服务器是否在线。
processlist:显示mysql线程列表
举例:
[[email protected] ~]# mysqladmin -uroot processlist -p
Enter password:
+----+------+-----------+-------+---------+------+-------+------------------+----------+
| Id | User | Host | db | Command | Time | State | Info | Progress |
+----+------+-----------+-------+---------+------+-------+------------------+----------+
| 14 | root | localhost | mysql | Sleep | 925 | | | 0.000 |
| 32 | root | localhost | | Query | 0 | init | show processlist | 0.000 |
+----+------+-----------+-------+---------+------+-------+------------------+----------+
shutdown: 关闭mysqld进程;
start-slave:启动从服务器线程
stop-slave:关闭从服务器线程
5、mysql的GUI客户端工具
- Navicat for mysql
- Toad for mysql
- mysql front