今天有点累了,废话我在这里就不跟大家多说啦,想必大家都是大神...懂的都比我多啦...

如下图所示: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