您的位置:首页 > 其它

Maridb编译安装及存储引擎、事务

2015-12-11 00:33 441 查看
一、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、后续配置

[b] 1)输出二进制文件[/b]
[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
[b] 3)导出库文件[/b]
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
[b][b] 4)导出man手册[/b][/b]
# 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 #存储位置
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: