今天有点累了,废话我在这里就不跟大家多说啦,想必大家都是大神...懂的都比我多啦...
如下图所示:MySQLDB 的逻辑架构图
MySQL : 存储引擎 MYISAM : 无事务 非聚集索引 InnoDB : 事务型 聚集索引
简介:什么是事务; 事务: ACID : 事务确保了银行不会弄丢你的钱,而这种特性在应用逻辑设计中是很难实现的,甚至不可实现。一个ACID兼容的数据库服务器,要为事务处理大量的复杂工作确保ACID特性的实现,而这也许是用户未能察觉到的。
事务: ACID : A :原子性(Atomicity) :一个事务必须被视为一个单独的内部”不可分“的工作单元,以确保整个事务要么全部执行,要么全部回滚。当一个事务具有原子性时,该事务绝对不会被部分执行,要么完全执行,要么根本就不执行。 C:一致性 (consistency): 数据库总是从一种一致性状态转换到另一种一致性状态。只要是最终事务没有被提交,任何事务处理过程中所做的数据改变,也不会影响到数据库的内容。
I:隔离性 (leolation) : 某个事务的结果只有在完成之后才对其它事务可见
D:持久性(durability) : 一旦一个事务提交,事务所做的数据改变是永久的。这意味着数据改变已被记录,即使系统崩溃,数据也不会因此丢失,持久性是个有点模糊的概念,因为实际上持久性也分为很多级别。
隔离: 隔离级别
read uncommitted : 读未提交内容:在read uncommitted 隔离级:所有事务都可以”看到“ 未提交事务的执行结构。(读未提交) 脏读,不可重读,幻读
read committee : 读取提交内容:大多数数据库系统的默认隔离是read committed(但这不是mysql默认的!)它满足了隔离的早先简单定义:一个事务在开始时,只能“看见”已经提交事务所做的改变,一个事务从开始到提交前,所做的任何数据改变都是不可见的,除非已经提交。这种隔离级别也支持所谓的”不可重复读“(nonrepeatable read)。这意味着用户运行同一语句两次,看到的结果是不同的。(读提交) 不可重读,幻读
repeatable read : 可重读 : repeatable read 隔离解决了 read uncommitted 隔离导致的问题,它确保同一事物的多个实例在并发读取数据时,会”看到同样的“数据行。不过理论上,这会导致另一个棘手的问题:幻读(phantom read).简单来说,幻读指当前用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行是,会发现有新的“幻影”(phantom)行。(可重读), 幻读
innodb和falcon存储引擎通过多版本并发控制(multiversion concurrency control) 机制解决了幻读问题。
serializable : 可串行化
serializable 是最高级别的隔离级,它通过强制事务排序,使之不可能互相冲突,从而解决幻读问题。简言之 serializable 是在每个读的数据行上加上锁。在这个级别上,可能导致大量的超时(timeout)现象和锁竞争(lock contention) 现象。如果用户的应用为了数据的稳定性,需要强制减少并发的话,可以选择这种隔离级。强制事务的串行执行避免了幻读;建议:对事务要求不特别严格的场景下,可以使用读提交 read committee
ANSI SQL 隔离级别
隔离级别 | 脏读可能性 | 不可重复读可能性 | 幻读可能性 | 加锁读 |
READ UNCOMMITTED | YES | YES | YES | NO |
READ COMMITTED | NO | YES | YES | NO |
REPEATABLE READ | NO | NO | YES | NO |
SERIALZABLE | NO | NO | NO | YES |
死锁:是指两个事务或多个事务在同一资源上互相占用,并请求加锁时,而导致的恶性循环现象,当多个事务以不同顺序试图加锁同一资源时。就会产生死锁。任何时间,多个事务同时加锁一个资源,一定产生死锁。
MVCC:多版本并发控制
MVCC的实现,是通过保存数据库在某个时间点的快照来实现的,也就是说,不管执行多长时间,每个事务看到的数据都是一致的,根据事务开始的时间不同,每个事务对同一张表,同一时刻看到的数据可能不一样的, 在MySQL中,每个事务启动时,InnoDB为每个启动的事务提供一个当下时刻的快照为了实现此功能,InnoDB会为每个表提供两个隐藏的字段,一个用于保存行的创建时间,一个用于保存行的失效时间;里面存储的是系统版本号:(system version number)两个隔离级别下有效:read committee 和 repeatable read
简介:什么是事务日志: 事务日志可使事务处理过程更加高效。和每次数据一改变就能更新磁盘中表的数据,存储引擎可以先更新数据在内存中的拷贝。这非常快,然后,存储引擎将数据改变记录写入事务日志,它位于磁盘上,因此具有持久性,这相对比较快,因为追加日志事件导致的写操作,只涉及了磁盘很小区域上的顺序I/O(sequential I/O),而替代了写磁盘中所需要的大量随机I/O,(random I/O).最后,相关进程会在某个时间把表数据更新到磁盘上.因此,大多存储引擎都选用了这种技术,也是通常所说的预写日志(write-athead logging), 利用两次磁盘写入操作把数据改变写入磁盘。 如果说数据更新已写入事务日志,却还未写入磁盘的表中,而发生系统奔溃,存储引擎将会在重启后恢复相关数据改变,具体的恢复方式因存储引擎而异
事务日志通常放在有冗余的硬件设备上,事务日志一般分为一组或者三个轮流使用 因为现在市场上流行的都是:机械式硬盘:随机读写;(如果把数据直接写入数据库中,因为数据太多,所所以会导致 硬盘随机读写. 可想而知机械师硬盘随机读写那速度可见有多慢,你们懂得.) 顺序读写:(如果把数据库的事务操作 写入事务日志当中,因为写的只是事务日志,而不是真正的数据,所以硬盘会分配连续的磁盘空间 供事务日志写入,速度可见一般!) 事务日志文件:顺序IO:事务日志,一组两个轮流替换,保存在可冗余的设备中 未提交的事务并且还能够回滚你懂得.
MySQL 解释器:
分析器:分析sql语法
优化器:选择一条最优的执行路径
操作求解器: 解释空间
文件存取方法:将内存中的数据,流逝化扁平化存入到磁盘
缓存管理器:提高性能(由存储引擎控制)
如果这如上两幅图还不够详细的话;老夫自有妙计,我们从微观的角度理解MySQLDB的各个组件:如下图所示:
1、连接管理器:负责接收用户请求
2、线程管理器,负责生成线程以及回收线程的.
3、用户模块:认证管理器,认证用户的username password
4、命令派发器: 因为SQL语言有很多语句,都需要命令派发器去进行调用的...
5、查询缓存: 如果缓存命中了.就直接返回结果给用户.否则会调用分析器.
5、记录日志: 为了获取用户此前都执行了哪些操作.
6、分析器: 因为SQL语句分为不同的类型有DDL DML DCL 呀,不同类型的语句需要通过不同的机制去处理的...
◆ 优化器: 如果用户执行了select、此类型的SQL语句,分析器才会调用优化器的.
◆ 表修改模块: 如果用户执行了 insert、update、delete,表中数据的修改,诸如此类型的SQL语句的话,分析器则会调用表修改模块去执行对应的操作。
◆ 表维护模块: 如果用户执行了,修复表的命令,分析器则会调用表维护模块去执行对应的操作。
◆ 复制模块: 如果用户执行了复制表的操作,则分析器则会调用复制护模块去执行对应的操作。
◆ 状态报告模块: 能够实时报告MySQLDB Server 执行状态信息.
8、访问控制模块: 用户的权限,能不能访问某个数据库.
9、表管理器: 用户对数据库执行创建表呀,诸如此类的操作,你懂得。
10、存储引擎接口: 用户执行所有的操作数据库都需要调用存储引擎接口,调用某个特定的存储引擎(innodb、MYIsam)执行用户指定的操作.
在互联网中有许许多多的架构都是C/S,MySQLDB 也是如此;当client 请求MySQLDB Server 时首先经历TCP三次握手之后,Client 与 MySQLDB Server建立起连接,注释:MySQL Server 监听在TCP 的3360端口上;当客户端(应用)连接到MySQL Server 时,连接管理器负责接收用户的请求,然后生成线程来响应用户的请求(每一个用户都需要一个线程去响应),然后就会调用认证管理器,用户需要认证之后才能够允许访问数据库的..注释:只有第一次请求才会调用连接管理器,第一次之后,用户是直接跟用户模块打交道的...
编译安装MySQL,并将其初始化;
cmake的重要特性之一是其独立于源码(out-of-source)的编译功能,即编译工作可以在另一个指定的目录中而非源码目录中进行,这可以保证源码目录不受任何一次编译的影响,因此在同一个源码树上可以进行多次不同的编译,如针对于不同平台编译。一、安装cmake跨平台编译器# tar xf cmake-2.8.8.tar.gz# cd cmake-2.8.8# ./bootstrap# make# make install二、编译安装mysql-5.5.331、使用cmake编译mysql-5.5cmake指定编译选项的方式不同于make,其实现方式对比如下:#./configure cmake .#./configure --help cmake . -LH or ccmake .指定安装文件的安装路径时常用的选项:#-DCMAKE_INSTALL_PREFIX=/usr/local/mysql#-DMYSQL_DATADIR=/data/mysql#-DSYSCONFDIR=/etc默认编译的存储引擎包括:csv、myisam、myisammrg和heap。若要安装其它存储引擎,可以使用类似如下编译选项:#-DWITH_INNOBASE_STORAGE_ENGINE=1#-DWITH_ARCHIVE_STORAGE_ENGINE=1#-DWITH_BLACKHOLE_STORAGE_ENGINE=1#-DWITH_FEDERATED_STORAGE_ENGINE=1若要明确指定不编译某存储引擎,可以使用类似如下的选项:#-DWITHOUT__STORAGE_ENGINE=1比如:#-DWITHOUT_EXAMPLE_STORAGE_ENGINE=1#-DWITHOUT_FEDERATED_STORAGE_ENGINE=1#-DWITHOUT_PARTITION_STORAGE_ENGINE=1如若要编译进其它功能,如SSL等,则可使用类似如下选项来实现编译时使用某库或不使用某库:#-DWITH_READLINE=1#-DWITH_SSL=system#-DWITH_ZLIB=system#-DWITH_LIBWRAP=0其它常用的选项:#-DMYSQL_TCP_PORT=3306#-DMYSQL_UNIX_ADDR=/tmp/mysql.sock#-DENABLED_LOCAL_INFILE=1#-DEXTRA_CHARSETS=all#-DDEFAULT_CHARSET=utf8#-DDEFAULT_COLLATION=utf8_general_ci#-DWITH_DEBUG=0#-DENABLE_PROFILING=1如果想清理此前的编译所生成的文件,则需要使用如下命令:make cleanrm CMakeCache.txt2、编译安装# groupadd -r mysql# useradd -g mysql -r -d /mydata/data mysql# tar xf mysql-5.5.33.tar.gz# cd mysql-5.5.33# cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \ -DMYSQL_DATADIR=/mydata/data \ -DSYSCONFDIR=/etc \ -DWITH_INNOBASE_STORAGE_ENGINE=1 \ -DWITH_ARCHIVE_STORAGE_ENGINE=1 \ -DWITH_BLACKHOLE_STORAGE_ENGINE=1 \ -DWITH_READLINE=1 \ -DWITH_SSL=system \ -DWITH_ZLIB=system \ -DWITH_LIBWRAP=0 \ -DMYSQL_UNIX_ADDR=/tmp/mysql.sock \ -DDEFAULT_CHARSET=utf8 \ -DDEFAULT_COLLATION=utf8_general_ci# make# make install
初始化MySQLDB;
初始化:1、提供配置文件配置文件.cnf集中式的配置:多个应用程序共用的配置文件[mysqld][mysqld_safe][client]# /usr/local/mysql/bin/mysqld --help --verbose | head -20Default options are read from the following files in the given order:/etc/mysql/my.cnf /etc/my.cnf ~/.my.cnf使用配置文件的方式1、它依次查找每个需要查找的文件,结果是所有文件并集;2、如果某参数在多个文件中出现多次,后读取的最终生效;# /usr/local/mysql/bin/mysqld --help --verbose1、显示mysqld程序启动时可用的选项,通常都是长选项2、显示mysqld的配置文件中可用的服务变量mysql> SHOW GLOBAL VARIABLESmysql> SHOW SESSION VARIABLES初始化:第二个操作1、删除所有匿名用户mysql> DROP USER ''@'localhost';mysql> DROP USER ''@'www.magedu.com';用户帐号由两部分组成:username@hosthost还可以使用通配符:%: 任意长度的任意字符_: 匹配任意单个字符2、给所有的root用户设定密码:第一种方式:mysql> SET PASSWORD FOR username@host = PASSWORD('your_passwrod');第二种方式:mysql> UPDATE user SET password = PASSWORD('your_password') WHERE user = 'root';mysql> FLUSH PRIVILEGES;第三种方式:# mysqladmin -uUserName -hHost password 'new_password' -p# mysqladmin -uUserName -hHost -p flush-privileges
接入MySQL;
接入mysql服务器mysql client <---mysql protocol---> mysqld mysqld 接收用户请求的方式有两种:本地通信:客户端与服务器端位于同一主机,而且还要基于127.0.0.1地址或lo接口进行通信linux or unix : unix sock, /tmp/mysql.SOCK /var/lib/mysql/mysql.sockwindows : memory pipe远程通信:客户端与服务器位于不同的主机,或在同一台主机使用非回环地址通信 TCP socket客户端工具:mysql,mysqladmin[client]通行的选项:-u , --user= username-h , --host= hostname host IPAddress-p , --password=--port-protocol={tcp|socket|memory|pipe}--socket =/tmp/mysql.sockmysql 监听的端口 ; 3306 /tcp非客户端的管理工具:myisamchk,myisampack:打包压缩的工具
MySQL 工作模式:
交互式模式 mysql>脚本模式 mysql < /path/to/mysql_script.sql 交互式模式 mysql> 脚本模式 mysql < /path/to/mysql_script.sqlmysql交互式模式: 客户端命令 mysql> help mysql> \? \c \g \G \q \! \s \. /path/to/mysql_script.sql 服务器端命令:需要命令结束符,默认为分号(;) mysql> help contents mysql> help Kerywordmysql命令行选项: --compress --database=, -D -H, --html:输出结果为html格式的文档 -X, --xml: 输出格式为xml --sate-updates: 拒绝使用无where子句的update或delete命令;mysql命令提示符: mysql> 等待输入命令 -> '> "> `> /*>mysql的快捷键: Ctrl + w: 删除光标之前的单词 Ctrl + u: 删除光标之前至命令行首的所有内容 Ctrl + y: 粘贴使用Ctrl+w或Ctrl+u删除的内容 Ctrl + a: 移动光标至行首 Ctrl + e: 移动光标至行尾
客户端工具MySQLadmin;
mysqladmin工具:mysqladmin [options] command [arg] [command [arg]] ...command: create drop debug:打开调试日志并记录与error log中mysqladmin -uroot -p create mydbmysql -uroot -p -e 'show database'mysqladmin -uroot -p status --sleep1 status : 显示简要状态信息 --sleep #:间隔时长 --count #:显示的批次 refresh:相当于同时使用flush-logs 和flush-hosts extended-status: 输出mysqld的各种状态变量及值, variables:: 输出mysqld的各服务器变量 flush-hosts : 清空主机相关的缓存:DNS解析缓存,此前因为连接错误次数过多而被拒绝访问mysqld的主机列表 flush—logs:日志滚动,二进制日志中和中继日志。 flush-privilege : 重载授权表 reload : 功能同flush-privilege一样 flush-status : 重置状态变量的值 mysqladmin -uroot -p flush-status mysqladmin -uroot -p extended-status flush-tables : 关闭当前打开的表文件句柄 flush-threads : 清空线程缓存 kill: 杀死指定的线程,可以一次杀死多个线程,以逗号分隔,但不能有空格 password: 修改当前用户的密码: ping: mysqladmin -uroot -p processlist : 显示mysql线程列表 shutdown : 关闭mysqld进程; start-slave: stop-slave:启动/关闭从服务器线程
GUI客户端工具: Navicat for mysql Toad for mysql mysql front sqlyog phpMyAdmin