一、mysql存储引擎
1、简介
mysql使用插件式存储引擎,支持第三方存储引擎,数据库的很多特性都有存储引擎决定
存储引擎是表级别的概念也称为表类型,在创建表中可以单独定义,同一个数据库不建议使用多个存储引擎
mysql在5.1及之前的版本默认的存储引擎是MyISAM,现在是InnoDB,最大的区别就是InnoDB支持事务而MyISAM不支持
表类型:
CREATE TABLE ... ENGINE=
查看表类型:
show table status;
2、InnoDB
设计目标:处理大量的短期事务,
数据存储于“表空间(table space)”中:
1)所有InnoDB表的数据和索引放置于同一个表空间中;
表空间文件:datadir定义的目录下
数据文件:ibddata1, ibddata2, ... #1个文件不够用会使用多个文件,但在上级表空间看来属于同一个文件
2)每个表单独使用一个表空间存储表的数据和索引;
innodb_file_per_table=ON #在配置文件中添加这个指令使用该特性
查看是否开启了该特性:show [global] variables like 'innodb_file_%'
注意:在mysql有些版本中该值只能为1或0不支持ON,MariaDB中ON和1都支持
数据文件(存储数据和索引):tbl_name.ibd,
表格式定义:tbl_name.frm
基于MVCC来支持高并发,支持所有的四个隔离级别,默认级别为REPEATABLE READ; 间隙锁防止幻读;
使用聚集索引
支持“自适应hash索引”
锁粒度:行级锁
MariaDB (XtraDB (percona))
MariaDB中虽然仍然叫InnoDB其实是percona的XtraDB是对InnoDB的改进增强版
3)InoDB特性总结
数据存储:表空间
并发:MVCC, 间隙锁
索引:聚集索引、辅助索引
性能:预计操作、自适应hash、插入缓存区
备份:支持热备(xtrabacup)
3、MyISAM
支持全文索引(FULLTEXT index)、压缩、空间函数(GIS); 但不支持事务,且为表级锁;
崩溃后无法安全恢复
适用场景:只读(或者写较少)、表较小(可以接受长时间进行修复操作)
Aria:crash-safe(崩溃后安全恢复) #MyISAM的改进增强版
数据文件:
tbl_name.frm: 表格式定义
tbl_name.MYD: 数据文件
tbl_name.MYI: 索引文件
特性:
加锁和并发:表级锁
修复:手工或自动修复、但可能丢失数据
索引:非聚集索引
延迟更新索引键:
压缩表
行格式:dynamic, fixed, compressed, compact, redundent
4、其它的存储引擎:
CSV:将普通的CSV(字段通过逗号分隔)作为MySQL表使用;
MRG_MYISAM:将多个MyISAM表合并成为一个虚拟表;
BLACKHOLE:类似于/dev/null,不真正存储任何数据;
MEMORY:所有数据都保存于内存中,内存表;支持hash索引;表级锁;临时表
PERFORMANCE_SCHEMA:伪存储引擎;
ARCHIVE:只支持SELECT和INSERT操作;支持行级锁和专用缓存区;
FEDERATED:用于访问其它远程MySQL服务器一个代理,它通过创建一个到远程MySQL服务器的客户端连接,并将查询传输到远程服务器执行,而后完成数据存取;
在MariaDB的上实现是FederatedX
MariaDB支持的其它存储引擎:
OQGraph
SphinxSE (常用于搜索引擎)
TokuDB
Cassandra
CONNECT
SQUENCE
二、cmake
1、cmake简介
跨平台编译器
cmake的重要特性之一是其独立于源码(out-of-source)的编译功能,即编译工作可以在另一个指定的目录中而非源码目录中进行,这可以保证源码目录不受任何一次编译的影响,因此在同一个源码树上可以进行多次不同的编译,如针对于不同平台编译。
2、安装cmake
1)编译安装
官网:cmake.org
最新版3.4.1
# tar xf cmake-2.8.8.tar.gz # cd cmake-2.8.8 # ./bootstrap # make # make install
2)yum安装
3、cmake使用
cmake指定编译选项的方式不同于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_<ENGINE>_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 clean
rm CMakeCache.txt
三、编译安装MariaDB
1、创建系统用户mysql和数据存存放目录
[root@BAIYU_180 ~]# cat /etc/passwd|grep mysql [root@BAIYU_180 ~]# useradd -r mysql -s /sbin/nolongin [root@BAIYU_180 ~]# id mysql uid=498(mysql) gid=498(mysql) 组=498(mysql) [root@BAIYU_180 ~]# ls /data lost+found [root@BAIYU_180 ~]# mkdir /data/mydata [root@BAIYU_180 ~]# chown mysql.mysql -R /data/mydata [root@BAIYU_180 ~]# ll /data/mydata -d drwxr-xr-x 2 mysql mysql 4096 10月 27 17:50 /data/mydata
2、安装依赖包
[root@BAIYU_180 mariadb-10.0.13]# yum groupinstall "server platform development" "development tools" -y #2个常用开发包组
3、解压编译安装
[root@BAIYU_180 ~]# ls anaconda-ks.cfg install.log install.log.syslog mariadb-10.0.13.tar.gz trash.sh [root@BAIYU_180 ~]# tar xf mariadb-10.0.13.tar.gz [root@BAIYU_180 ~]# cd mariadb-10.0.13 [root@BAIYU_180 mariadb-10.0.13]# ls BUILD CMakeLists.txt COPYING debian include libmysql mysql-test pcre scripts storage TODO win BUILD-CMAKE cmd-line-utils COPYING.LESSER Docs INSTALL-SOURCE libmysqld mysys plugin sql strings unittest zlib client config.h.cmake CREDITS EXCEPTIONS-CLIENT INSTALL-WIN-SOURCE libservices mysys_ssl randgen sql-bench support-files VERSION cmake configure.cmake dbug extra KNOWN_BUGS.txt man packaging README sql-common tests vio [root@BAIYU_180 mariadb-10.0.13]# cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mariadb-10.0.13 -DMYSQL_DATADIR=/data/mydata -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 -j 2 #make install
4、初始化及配置文件,服务脚本
[root@BAIYU_180 ~]# cd /usr/local/mariadb-10.0.13/ [root@BAIYU_180 mariadb-10.0.13]# ll 总用量 212 drwxr-xr-x 2 root root 4096 10月 27 18:41 bin -rw-r--r-- 1 root root 17987 8月 9 2014 COPYING -rw-r--r-- 1 root root 26545 8月 9 2014 COPYING.LESSER -rw-r--r-- 1 root root 1553 8月 9 2014 CREDITS drwxr-xr-x 3 root root 4096 10月 27 18:41 data drwxr-xr-x 2 root root 4096 10月 27 18:40 docs -rw-r--r-- 1 root root 8245 8月 9 2014 EXCEPTIONS-CLIENT drwxr-xr-x 3 root root 4096 10月 27 18:40 include -rw-r--r-- 1 root root 8694 8月 9 2014 INSTALL-BINARY drwxr-xr-x 3 root root 4096 10月 27 18:40 lib drwxr-xr-x 4 root root 4096 10月 27 18:41 man drwxr-xr-x 11 root root 4096 10月 27 18:41 mysql-test -rw-r--r-- 1 root root 90897 8月 9 2014 README drwxr-xr-x 2 root root 4096 10月 27 18:40 scripts drwxr-xr-x 27 root root 4096 10月 27 18:41 share drwxr-xr-x 4 root root 4096 10月 27 18:41 sql-bench drwxr-xr-x 3 root root 4096 10月 27 18:41 support-files [root@BAIYU_180 mariadb-10.0.13]# chown root.mysql -R . [root@BAIYU_180 mariadb-10.0.13]# ll 总用量 212 drwxr-xr-x 2 root mysql 4096 10月 27 18:41 bin -rw-r--r-- 1 root mysql 17987 8月 9 2014 COPYING -rw-r--r-- 1 root mysql 26545 8月 9 2014 COPYING.LESSER -rw-r--r-- 1 root mysql 1553 8月 9 2014 CREDITS drwxr-xr-x 3 root mysql 4096 10月 27 18:41 data drwxr-xr-x 2 root mysql 4096 10月 27 18:40 docs -rw-r--r-- 1 root mysql 8245 8月 9 2014 EXCEPTIONS-CLIENT drwxr-xr-x 3 root mysql 4096 10月 27 18:40 include -rw-r--r-- 1 root mysql 8694 8月 9 2014 INSTALL-BINARY drwxr-xr-x 3 root mysql 4096 10月 27 18:40 lib drwxr-xr-x 4 root mysql 4096 10月 27 18:41 man drwxr-xr-x 11 root mysql 4096 10月 27 18:41 mysql-test -rw-r--r-- 1 root mysql 90897 8月 9 2014 README drwxr-xr-x 2 root mysql 4096 10月 27 18:40 scripts drwxr-xr-x 27 root mysql 4096 10月 27 18:41 share drwxr-xr-x 4 root mysql 4096 10月 27 18:41 sql-bench drwxr-xr-x 3 root mysql 4096 10月 27 18:41 support-files [root@BAIYU_180 mariadb-10.0.13]# ls /data/mydata/ [root@BAIYU_180 mariadb-10.0.13]# ./scripts/mysql_install_db --user=mysql --datadir=/data/mydata [root@BAIYU_180 mariadb-10.0.13]# ls /data/mydata/ aria_log.00000001 aria_log_control ibdata1 ib_logfile0 ib_logfile1 mysql performance_schema test [root@BAIYU_180 mariadb-10.0.13]# cp support-files/my-large.cnf /etc/my.cnf #配置文件 cp:是否覆盖"/etc/my.cnf"? y [root@BAIYU_180 mariadb-10.0.13]# vi /etc/my.cnf #添加如下三行 43 datadir = /data/mydata 44 innodb_file_per_table = ON 45 skip_name_resolve = ON [root@BAIYU_180 mariadb-10.0.13]# cp support-files/mysql.server /etc/rc.d/init.d/mysqld [root@BAIYU_180 mariadb-10.0.13]# chmod +x /etc/rc.d/init.d/mysqld [root@BAIYU_180 mariadb-10.0.13]# service mysqld start Starting MySQL. SUCCESS! [root@BAIYU_180 mariadb-10.0.13]# mysql_secure_installation #删除匿名用户
5、后续配置
1)输出二进制文件
[root@BAIYU_180 ~]# ln -sv /usr/local/mariadb-10.0.13 /usr/localmysql "mysql" -> "mariadb-10.0.13" [root@BAIYU_180 mysql]# vi /etc/profile.d/Mariadb.sh export PATH=/usr/local/mysql/bin:$PATH
2)导处头文件
[root@BAIYU_180 ~]# ln -sv /usr/local/mysql/include/mysql/ /usr/include/mysql "/usr/include/mysql" -> "/usr/local/mysql/include/mysql/" [root@BAIYU_180 ~]# ls /usr/include/mysql auth_dialog_client.h keycache.h my_dbug.h mysqld_ername.h plugin_auth_common.h service_my_snprintf.h sql_state.h big_endian.h little_endian.h my_decimal_limits.h mysqld_error.h plugin_auth.h service_progress_report.h sslopt-case.h byte_order_generic.h ma_dyncol.h my_dir.h mysql_embed.h plugin_ftparser.h services.h sslopt-longopts.h byte_order_generic_x86_64.h m_ctype.h my_getopt.h mysql.h plugin.h service_sha1.h sslopt-vars.h byte_order_generic_x86.h m_string.h my_global.h mysql_time.h private service_thd_alloc.h typelib.h client_plugin.h my_alloc.h my_list.h mysql_version.h psi service_thd_autoinc.h decimal.h my_attribute.h my_net.h my_sys.h service_debug_sync.h service_thd_error_context.h errmsg.h my_byteorder.h my_pthread.h my_valgrind.h service_kill_statement.h service_thd_timezone.h handler_ername.h my_compiler.h mysql_com.h my_xml.h service_logger.h service_thd_wait.h handler_state.h my_config.h mysql_com_server.h plugin_audit.h service_my_plugin_log.h sql_common.h
3)导出库文件
root@BAIYU_180 ~]# ldconfig -p|grep mysql #查看所有已缓存的和mysql相关的库文件 libmysqlclient_r.so.16 (libc6,x86-64) => /usr/lib64/mysql/libmysqlclient_r.so.16 libmysqlclient.so.16 (libc6,x86-64) => /usr/lib64/mysql/libmysqlclient.so.16 [root@BAIYU_180 ~]# ls /usr/local/mysql/lib/ libmysqlclient.a libmysqlclient_r.so libmysqlclient_r.so.18.0.0 libmysqlclient.so.18 libmysqlservices.a libmysqlclient_r.a libmysqlclient_r.so.18 libmysqlclient.so libmysqlclient.so.18.0.0 plugin [root@BAIYU_180 ~]# rpm -qa|grep mysql mysql-libs-5.1.71-1.el6.x86_64 [root@BAIYU_180 ~]# rpm -ql mysql-libs|grep .*\.so.* #是这个包生成 /etc/ld.so.conf.d/mysql-x86_64.conf /usr/lib64/mysql/libmysqlclient.so.16 /usr/lib64/mysql/libmysqlclient.so.16.0.0 /usr/lib64/mysql/libmysqlclient_r.so.16 /usr/lib64/mysql/libmysqlclient_r.so.16.0.0 [root@BAIYU_180 mysql]# echo "/usr/local/mysql/lib" > /etc/ld.so.conf.d/mysql.conf [root@BAIYU_180 mysql]# ldconfig -p|grep mysql libmysqlclient_r.so.16 (libc6,x86-64) => /usr/lib64/mysql/libmysqlclient_r.so.16 libmysqlclient.so.16 (libc6,x86-64) => /usr/lib64/mysql/libmysqlclient.so.16 [root@BAIYU_180 mysql]# ldconfig #生成缓存 [root@BAIYU_180 mysql]# ldconfig -p|grep mysql libmysqlclient_r.so.16 (libc6,x86-64) => /usr/lib64/mysql/libmysqlclient_r.so.16 libmysqlclient.so.18 (libc6,x86-64) => /usr/local/mysql/lib/libmysqlclient.so.18 libmysqlclient.so.16 (libc6,x86-64) => /usr/lib64/mysql/libmysqlclient.so.16 libmysqlclient.so (libc6,x86-64) => /usr/local/mysql/lib/libmysqlclient.s
4)导出man手册
# vi /etc/man.config 添加 MANPATH /usr/local/mysql/man
四、Mysql并发访问控制
1、锁
锁:
读锁:共享锁 #可以被多个线程使用
写锁:独占锁 #只能被一个线程使用
锁粒度:
表级锁
行级锁
锁策略:在锁粒度及数据安全性寻求的平衡机制;
每种存储引擎都可以自行实现其锁策略和锁粒度;
MySQL在服务器级也实现了锁,表级锁;用户可显式请求;
(1) LOCK TABLES #手动加锁
tbl_name [[AS] alias] lock_type
[, tbl_name [[AS] alias] lock_type] ...
lock_type: #锁类型
READ [LOCAL] #读锁
| [LOW_PRIORITY] WRITE #写锁
UNLOCK TABLES #解锁
例如:LOCK TABLES students READ;
LOCK TABLES students WRITE;
(2) FLUSH TABLES tb_name[,...] [WITH READ LOCK] [FOR UPDATE]
(3) SELECT clase [FOR UPDATE] [WITH READ LOACK]
分类:
隐式锁:由存储引擎自动施加锁;
显式锁:手动添加
五、MySQL事务
事务:一组原子性的SQL查询,或者说一个独立工作单元。
事务日志:重做日志,撤销日志
ACID测试:
A:atomicity,原子性;整个事务中的所有操作要么全部成功执行,要么全部失败后回滚;
C:consistency, 一致性;数据库总是从一个一致性状态转换为另一个一致性状态;
I:Isolation,隔离性;一个事务所做出的操作在提交之前,是不能为其它所见;隔离有多种隔离级别;
D:durability: 持久性;一旦事务提交,其所做的修改会永久保存于数据库中;
事务:
启动事务:START TRANSACTION
...
...
结束事务:
(1) COMMIT:提交
(2) ROLLBACK: 回滚
注意:只有事务型存储引擎方能支持此类操作;
建议:显式请求和提交事务,而不要使用“自动提交”功能;
autocommit={1|0}
事务支持savepoint(保存点)
SAVEPOINT identifier(自定义名称的保存点)
ROLLBACK [WORK] TO [SAVEPOINT] identifier
RELEASE SAVEPOINT identifier #删除保存点
事务隔离级别:
READ UNCOMMITTED (读未提交) 1,2,3)
READ COMMITTED (读提交) 2,3)
REPEATABLE READ (可重读) 3)
SERIALIZABILE (可串行化) 4)
可能存在问题:
1)脏读; #可以读到未提交的数据
2)不可重复读; #每次读时数据不一样
3)幻读; #数据随时发生变化
4)加锁读;
tx_isolation:设置事务隔离级别;服务器变量,默认为REPEATABLE-READ;可在SESSION级进行修改;
SET tx_isolation=' '
READ-UNCOMMITTED
READ-COMMITTED
REPEATABLE-READ
SERIALIZABLE
MVCC: 多版本并发控制
死锁:两个或多个事务在同一资源相互占用,并请求锁定对方占用的资源的状态;
事务日志:
事务日志的写入类型为“追加”,因此其操作为“顺序IO”;此日志通常也被称为“预写式日志(write ahead logging)”;
设置事务日志:不支持运行时修改,在配置文件中定义
innodb_log_file_size #不建议设置很大,默认5M
innodb_log_files_in_group
innodb_log_group_home_dir #存储位置