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

一、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    #存储位置


你可能感兴趣的:(InnoDB,myisam)