數(shù)據(jù)庫(kù)高可用MHA和PXC集群搭建 存儲(chǔ)引擎
?
??? MHA軟件介紹
MHA(Master High Availability)
由日本DeNA公司youshimaton開(kāi)發(fā)
是一套優(yōu)秀的實(shí)現(xiàn)MySQL高可用的解決方案
數(shù)據(jù)庫(kù)的自動(dòng)故障切換操作能做到在0~30秒之內(nèi)完成
MHA能確保在故障切換過(guò)程中最大限度保證數(shù)據(jù)的一致性,以達(dá)到真正意義上的高可用
?
MHA集群缺點(diǎn)總結(jié):
??? ??? 必須要有vip地址
? ? ??宕機(jī)的主服務(wù)器需要手動(dòng)添加到集群里,還需要手動(dòng)同步宕機(jī)期間的數(shù)據(jù)
? ? ??管理服務(wù)發(fā)現(xiàn)主服務(wù)器宕機(jī)后,會(huì)調(diào)用故障切換腳本,
?????? 把vip地址部署在新的主數(shù)據(jù)庫(kù)服務(wù)器上。管理服務(wù)會(huì)
?????? 自動(dòng)停止,需要手動(dòng)啟動(dòng)管理服務(wù)器,才能監(jiān)視新的主數(shù)據(jù)服務(wù)器
? ? ? ?故障切換期間會(huì)有數(shù)據(jù)丟失的情況
軟件有2部分組成
???????? 1 管理端軟件(管理節(jié)點(diǎn)) : 安裝管理集群主機(jī)上的軟件
???????? 2 數(shù)據(jù)端軟件(數(shù)據(jù)節(jié)點(diǎn)) : 安裝在數(shù)據(jù)庫(kù)服務(wù)器上的軟件
MHA集群的工作過(guò)程:
???? 由Manager定時(shí)探測(cè)集群中的master節(jié)點(diǎn)
???? 當(dāng)master故障時(shí),Manager自動(dòng)將擁有最新數(shù)據(jù)的slave提升為新的master
???? (如果有多個(gè)從的話,剩下的從會(huì)自動(dòng)更新為新主服務(wù)器的從主機(jī))
?配置MHA集群,具體步驟如下:
?????? 第一步:集群環(huán)境準(zhǔn)備 (在3臺(tái)數(shù)據(jù)庫(kù)服務(wù)器都要做的配置)
????????????? 1)公共配置(3臺(tái)數(shù)據(jù)庫(kù)服務(wù)器都要配置)
???????????????????? #啟用binlog日志?
???????????????????? #開(kāi)啟半同步復(fù)制模式
???????????????????? #禁止刪除本機(jī)的中繼日志文件
???????????????????? #重啟數(shù)據(jù)庫(kù)服務(wù)
???????????????????? #添加從服務(wù)器拷貝sql命令時(shí)連接使用的用戶
三臺(tái)公共步驟
vim /etc/my.cnf?????????
[mysqld]
plugin-load="rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so"
rpl_semi_sync_master_enabled=1
rpl_semi_sync_slave_enabled=1
relay_log_purge=0
server_id=51
log_bin=master51
:wq
[root@host51 ~]# mysql -uroot -p123qqq...A
mysql> grant replication slave on *.* to repluser@"%" Identified by "123qqq...A";
mysql> exit;
2)配置ssh免密登錄
????????????????? ?2.1 所有數(shù)據(jù)庫(kù)服務(wù)器之間可以彼此免密登錄
3)配置MySQL 一主多從 同步結(jié)構(gòu)
? ? ? ? ? ? ? ?#配置主數(shù)據(jù)庫(kù)服務(wù)器?
???????????????????????????? 1 啟用binlog日志? (公共配置已經(jīng)配置了)
???????????????????????????? 2 用戶授權(quán)(公共配置已經(jīng)配置了)
???????????????????????????? 3 查看日志信息
[root@host51 ~]# mysql -uroot -p123qqq...A -e 'show master status'
#配置從數(shù)據(jù)庫(kù)服務(wù)器 192.168.4.52
???????????????????????????? 1 指定server_id? 并重啟數(shù)據(jù)庫(kù)服務(wù) (公共配置已經(jīng)做了)
???????????????????????????? 2 確保數(shù)據(jù)一致(如果一樣就不用做了)
???????????????????????????? 3 指定主服務(wù)器信息
[root@host52 ~]# mysql -uroot -p123qqq...A
mysql> change master to? master_host="192.168.4.51",master_user="repluser",
master_password="123qqq...A",master_log_file="master51.000001",master_log_pos=441;
? ? ? ? ? ? ? ?4 啟動(dòng)slave進(jìn)程
?MySQL>start slave;
? ? ? ? ? ? ? ? ? ?? ?5 查看狀態(tài) (IO線程和 SQL線程都是yes狀態(tài))
mysql> show slave status \G
#配置從數(shù)據(jù)庫(kù)服務(wù)器 192.168.4.53
???????????????????????????? 1 指定server_id? 并重啟數(shù)據(jù)庫(kù)服務(wù)(公共配置已經(jīng)做了)
???????????????????????????? 2 確保數(shù)據(jù)一致(如果一樣就不用做了)
???????????????????????????? 3 指定主服務(wù)器信息
[root@host53 ~]# mysql -uroot -p123qqq...A
mysql> change master to? master_host="192.168.4.51",master_user="repluser",
master_password="123qqq...A",master_log_file="master51.000001",master_log_pos=441;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 4 啟動(dòng)slave進(jìn)程?
MySQL>start slave;
???????????????????????????? 5 查看狀態(tài) (IO線程和 SQL線程都是yes狀態(tài))
mysql> show slave status \G
管理主機(jī)
#安裝依賴軟件
cd mha-soft-student/
yum -y install mha4mysql-node-0.56-0.el6.noarch.rpm
yum -y install perl-*.rpm
yum -y install? perl-ExtUtils-*?? perl-CPAN*
tar -xf mha4mysql-manager-0.56.tar.gz
cd mha4mysql-manager-0.56/??????????????????????
[root@mgm57 mha4mysql-manager-0.56]# perl Makefile.PL?
*** Module::AutoInstall version 1.03
*** Checking for Perl dependencies...
[Core Features]
- DBI?????????????????? ...loaded. (1.627)
- DBD::mysql??????????? ...loaded. (4.023)
- Time::HiRes?????????? ...loaded. (1.9725)
- Config::Tiny????????? ...loaded. (2.14)
- Log::Dispatch???????? ...loaded. (2.41)
- Parallel::ForkManager ...loaded. (1.18)
- MHA::NodeConst??????? ...loaded. (0.56)
*** Module::AutoInstall configuration finished.
Checking if your kit is complete...
Looks good
Writing Makefile for mha4mysql::manager
Writing MYMETA.yml and MYMETA.json
[root@mgm57 mha4mysql-manager-0.56]#? make?? && make? install??
2) 了解相關(guān)管理命令
[root@mgm57 mha4mysql-manager-0.56]# masterha_ 按2次tab鍵列出所有命令
masterha_check_repl?????? masterha_conf_host????? ??masterha_master_switch???
masterha_check_ssh??????? masterha_manager????????? masterha_secondary_check?
masterha_check_status???? masterha_master_monitor?? masterha_stop????????????
[root@mgm57 mha4mysql-manager-0.56]#
3) 創(chuàng)建并編輯管理服務(wù)的主配置文件 (!!!重要!??!)
?????? ????????????? 3.1 創(chuàng)建工作目錄?
[root@mgm57 ~]# mkdir /etc/mha
? ? ? ? ? ? ? ? ? ?3.2 拷貝模板文件創(chuàng)建主配置文件
[root@mgm57 mha-soft-student]# cd? mha4mysql-manager-0.56
[root@mgm57 mha4mysql-manager-0.56]# cp samples/conf/app1.cnf? /etc/mha/
? ? ? ? ? ? ? ? ? ? ?3.3 編輯主配置文件
???????????????????????? 說(shuō)明:模版文件是個(gè)半成品 需要根據(jù)環(huán)境準(zhǔn)備完善
[root@mgm57 ~]# vim /etc/mha/app1.cnf??? (沒(méi)有第4臺(tái)數(shù)據(jù)庫(kù)服務(wù)器所有把[server4]刪除)???????????????????
[server default]
manager_workdir=/etc/mha
manager_log=/etc/mha/manager.log
master_ip_failover_script=/etc/mha/master_ip_failover
?ssh_user=root
ssh_port=22
?repl_user=repluser
repl_password=123qqq...A
?user=plj
password=123qqq...A
?#定義監(jiān)視的數(shù)據(jù)庫(kù)服務(wù)器
[server1]
hostname=192.168.4.51
port=3306
candidate_master=1
?[server2]
hostname=192.168.4.52
port=3306
candidate_master=1
?[server3]
hostname=192.168.4.53
port=3306
candidate_master=1
:wq
?????????? 4) 創(chuàng)建故障切換腳本
????????????????? 創(chuàng)建腳本并指定vip地址部署在哪塊網(wǎng)卡上
[root@mgm57 mha-soft-student]# cp master_ip_failover? /etc/mha/
[root@mgm57 mha-soft-student]# chmod +x /etc/mha/master_ip_failover
?
[root@mgm57 mha-soft-student]# vim +35 /etc/mha/master_ip_failover
my $vip = '192.168.4.100/24';? # Virtual IP
my $key = "1";
my $ssh_start_vip = "/sbin/ifconfig eth0:$key $vip";
my $ssh_stop_vip = "/sbin/ifconfig eth0:$key down";
把故障切換腳本里指定的vip地址
????????????? ?? 配置在當(dāng)前主從結(jié)構(gòu)種的主數(shù)據(jù)庫(kù)服務(wù)器?主機(jī)上
[root@host51 ~]# ifconfig? eth0:1 192.168.4.100/24
[root@host51 ~]# ifconfig? eth0:1
eth0:1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>? mtu 1500
??????? inet 192.168.4.100? netmask 255.255.255.0? broadcast 192.168.4.255
??????? ether 52:54:00:98:33:28? txqueuelen 1000? (Ethernet)
2)安裝軟件(3臺(tái)數(shù)據(jù)庫(kù)器軟件都要安裝)
???????????????????? #先安裝依賴
[root@host51 ~]# cd mha-soft-student/
[root@host51 mha-soft-student]# yum -y install perl-*.rpm
? ? ? ? ? ? ? #在安裝主軟件
[root@host51 mha-soft-student]# yum -y install mha4mysql-node-0.56-0.el6.noarch.rpm?????
? ? ? ? ? ? ?3) 添加監(jiān)控用戶
只需在master服務(wù)器添加 在slave服務(wù)器查看
[root@host51 ~]# mysql -uroot -p123qqq...A
mysql> grant all on *.*? to plj@"%"? identified by "123qqq...A";
mysql> exit;
測(cè)試配置,在管理主機(jī)mgm57 如下測(cè)試:
? ? ? ? ? ? ??1) 測(cè)試ssh免密登錄配置
[root@mgm57 ~]# masterha_check_ssh? --conf=/etc/mha/app1.cnf????????????
Sat Nov 20 16:31:08 2021 - [info] All SSH connection tests passed successfully.? #成功提示
? ? ? ? ??2)測(cè)試主從同步配置
[root@mgm57 ~]# masterha_check_repl --conf=/etc/mha/app1.cnf
MySQL Replication Health is OK.?? #成功提示
啟動(dòng)管理服務(wù)管理主機(jī)
nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf ?\
--ignore_last_failover 2> /dev/null &
?[root@mgm57 ~]# jobs
[1]+? 運(yùn)行中?????????????? nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover 2> /dev/null &
[root@mgm57 ~]# masterha_check_status? --conf=/etc/mha/app1.cnf;
app1 (pid:1977) is running(0:PING_OK), master:192.168.4.51
[root@mgm57 ~]#
[root@host51 ~]# ifconfig? eth0:1
eth0:1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>? mtu 1500
??????? inet 192.168.4.100? netmask 255.255.255.0? broadcast 192.168.4.255
??????? ether 52:54:00:98:33:28? txqueuelen 1000? (Ethernet)
PXC集群
?????? 1.1? PXC介紹
Percona XtraDB Cluster(簡(jiǎn)稱PXC)
是基于Galera的MySQL高可用集群解決方案
Galera Cluster是Codership公司開(kāi)發(fā)的一套免費(fèi)開(kāi)源的高可用方案
PXC集群主要由兩部分組成:
Percona Server with XtraDB和Write Set Replication patches(同步、多主復(fù)制插件)
官網(wǎng)http://galeracluster.com
?
????????????? 1.2? pxc集群特點(diǎn)
1、數(shù)據(jù)強(qiáng)一致性、無(wú)同步延遲
2、沒(méi)有主從切換操作,無(wú)需使用虛擬IP
3、支持InnoDB存儲(chǔ)引擎
4、多線程復(fù)制
5、部署使用簡(jiǎn)單
6、支持節(jié)點(diǎn)自動(dòng)加入,無(wú)需手動(dòng)拷貝數(shù)據(jù)
??1.3? 相關(guān)端口號(hào)
3306 數(shù)據(jù)庫(kù)服務(wù)端口
4444 SST 端口
4567 集群通信端口
4568 IST 端口
SST? State Snapshot Transfer 全量同步
IST Incremental State Transfer 增量同步
?二配置pxc集群
? ? ??第1步:安裝軟件 (3臺(tái)主機(jī)都要安裝)
必須按照順序安裝 因?yàn)檐浖g有依賴
cd pxc/
yum -y install libev-4.15-1.el6.rf.x86_64.rpm
yum -y install percona-xtrabackup-24-2.4.13-1.el7.x86_64.rpm
yum -y install qpress-1.1-14.11.x86_64.rpm
tar -xf Percona-XtraDB-Cluster-5.7.25-31.35-r463-el7-x86_64-bundle.tar
yum -y install Percona-XtraDB-Cluster-*.rpm
?
?
?????? ??????? 第2步:修改配置文件
????????????? ??????? 2.1 指定集群中主機(jī)的server_id? 修改 mysqld.cnf文件
??????????????????????? 2.2 指定集群信息 修改 wsrep.cnf文件
?
????????????? ??????? #修改71主機(jī)的server_id
???????????????????? vim /etc/percona-xtradb-cluster.conf.d/mysqld.cnf
???????????????????? server_id=71
? ? ? ? ? ? ? ? ? ? #修改72主機(jī)的server_id
???????????????????? vim /etc/percona-xtradb-cluster.conf.d/mysqld.cnf
???????????????????? server_id=72
? ? ? ? ? ? ? ? ? ??#修改73主機(jī)的server_id
???????????????????? vim /etc/percona-xtradb-cluster.conf.d/mysqld.cnf
???????????????????? server_id=73
? ? ? ? ? ? ? ? ? ???#修改71主機(jī)的wsrep.cnf 文件
???????????????????? ]# vim /etc/percona-xtradb-cluster.conf.d/wsrep.cnf
???????????????????? 8 wsrep_cluster_address=gcomm://192.168.4.71,192.168.4.72,192.168.4.73
???????????????????? 25 wsrep_node_address=192.168.4.71
???????????????????????? 27 wsrep_cluster_name=pxc-cluster
???????????????????? 30 wsrep_node_name=pxcnode71
??????????????????? 39 wsrep_sst_auth="sstuser:123qqq...A"
???????????????????? :wq
? ? ? ? ? ? ? ? ? ???#修改72主機(jī)的wsrep.cnf 文件
???????????????????? ]# vim /etc/percona-xtradb-cluster.conf.d/wsrep.cnf
???????????????????? 8 wsrep_cluster_address=gcomm://192.168.4.71,192.168.4.72,192.168.4.73
???????????????????? 25 wsrep_node_address=192.168.4.72
???????????????????????? 27 wsrep_cluster_name=pxc-cluster
???????????????????? 30 wsrep_node_name=pxcnode72
???????????????????? 39 wsrep_sst_auth="sstuser:123qqq...A"
???????????????????? :wq
? ? ? ? ? ? ? ? ? ??#修改73主機(jī)的wsrep.cnf 文件
???????????????????? ]# vim /etc/percona-xtradb-cluster.conf.d/wsrep.cnf
???????????????????? 8 wsrep_cluster_address=gcomm://192.168.4.71,192.168.4.72,192.168.4.73
???????????????????? 25 wsrep_node_address=192.168.4.73
???????????????????????? 27 wsrep_cluster_name=pxc-cluster
???????????????????? 30 wsrep_node_name=pxcnode73
???????????????????? 39 wsrep_sst_auth="sstuser:123qqq...A"
???????????????????? :wq
? ?第3步:初始化集群
??? ?????? 說(shuō)明:在任意1臺(tái)服務(wù)器上執(zhí)行初始化集群操作都可以(僅需要執(zhí)行一遍)
? ? ? ? ? ? ? ? ? 統(tǒng)一在71 主機(jī)執(zhí)行 ,具體步驟如下? ? ? ?
????????????????? ??? 1、啟動(dòng)服務(wù)
????????????????? ??? 2、使用初始密碼連接服務(wù)
????????????????? ??? 3、添加授權(quán)用戶sstuser
????????????????? ??? 4、查看數(shù)據(jù)庫(kù)服務(wù)器端口 3306
????????????????? ??? 5、查看集群端口4567
????????????????? ??? 6、管理員root 登錄 建庫(kù)表存儲(chǔ)記錄
? ? ? ? ? ? ? ? ?[root@pxcnode71 ~]# systemctl? start mysql@bootstrap.service??? 初始化集群
?[root@pxcnode71 ~]# ls /var/lib/mysql? 查看數(shù)據(jù)數(shù)據(jù)庫(kù)文件列表 有文件說(shuō)明成功
auto.cnf???????? gvwstate.dat??? mysqld_safe.pid?????? pxcnode71-bin.000002
ca-key.pem?????? ib_buffer_pool? mysql.sock??????????? pxcnode71-bin.index
ca.pem?????????? ibdata1???????? mysql.sock.lock?????? server-cert.pem
client-cert.pem? ib_logfile0???? performance_schema??? server-key.pem
client-key.pem?? ib_logfile1???? private_key.pem?????? sys
galera.cache???? ibtmp1????????? public_key.pem??????? xb_doublewrite
grastate.dat???? mysql?????????? pxcnode71-bin.000001
[root@pxcnode71 ~]# netstat? -utnalp? | grep 3306? #查看數(shù)據(jù)庫(kù)服務(wù)端口
tcp6?????? 0????? 0 :::3306???????????????? :::*???????? ???????????LISTEN????? 5359/mysqld????????
[root@pxcnode71 ~]#
[root@pxcnode71 ~]# netstat? -utnalp? | grep 4567 #查看集群端口
tcp??????? 0????? 0 0.0.0.0:4567??????????? 0.0.0.0:*?????????????? LISTEN????? 5359/mysqld? ? ? ??
[root@pxcnode71 ~]# grep password /var/log/mysqld.log? 查看管理員初始化密碼
2021-11-22T02:49:33.621967Z 1 [Note] A temporary password is generated for root@localhost: UfjF5UQGb/fq
[root@pxcnode71 ~]# mysql -uroot -p'UfjF5UQGb/fq'??? 初始密碼登錄?????????????
mysql> alter user root@"localhost" identified by "123456";? 強(qiáng)制修改密碼
mysql> exit 斷開(kāi)連接
[root@pxcnode71 ~]# mysql -uroot -p123456? 使用修改后的密碼登錄????????????????
mysql> grant all on *.*? to? sstuser@"localhost" identified by "123qqq...A";? 添加全量同步用戶sstuser
Query OK, 0 rows affected, 1 warning (0.10 sec)
?
錯(cuò)誤統(tǒng)一解決辦法:
? ? ? 1、查看mysql服務(wù)的父進(jìn)程pid 通過(guò)kill -9?? 殺死父進(jìn)程
?????????? ]# which?? pstree || yum? -y install psmisc
???? ?? ]# pstree -p | grep mysqld
???? ?? ]# kill? -9? pid號(hào)
? ??2、清空數(shù)據(jù)庫(kù)目錄? rm? -rf? /var/lib/mysql/*
? ? 3、檢查 mysqld.cnf?? 和 wsrep.cnf 文件的配置項(xiàng)目??
???? 4、檢查 防火墻和 selinux服務(wù)關(guān)閉了嗎
? ? 如果初始集群失敗,就重新執(zhí)行集群初始化
???? 如果啟動(dòng)MySQL服務(wù)錯(cuò)誤,就重新執(zhí)行啟動(dòng)mysql服務(wù)
存儲(chǔ)引擎
MySQL服務(wù)軟件自帶的功能程序
當(dāng)對(duì)表里的數(shù)據(jù)做select 或insert 訪問(wèn)時(shí),
會(huì)根據(jù)表使用的存儲(chǔ)引擎對(duì)數(shù)據(jù)做處理。不同的存儲(chǔ)引擎有不同的功能和數(shù)據(jù)存儲(chǔ)方式。
作為可插拔式的組件提供?????????
MySQL 5.0/5.1 (MyISAM)????
MySQL 5.5/5.6 (InnoDB)
1)MySQL服務(wù)體系結(jié)構(gòu) (mysql服務(wù)的功能分類)
? ? ? ? ? ? ?1 管理工具: 安裝MySQL服務(wù)軟件后,提供的管理命令
? ? ? ? ? ? ??2連接池:驗(yàn)證客戶端連接時(shí)使用的用戶和密碼是否正確 同時(shí)驗(yàn)證數(shù)據(jù)庫(kù)服務(wù)器是否有mysqld進(jìn)程相應(yīng)連接
? ? ? ? ? ? ?3 SQL接口: 把用戶執(zhí)行的SQL命令傳遞給本機(jī)的mysqld 進(jìn)程
? ? ? ? ? ? ?4分析器:檢查SQL命令的語(yǔ)句及對(duì)數(shù)據(jù)的訪問(wèn)權(quán)限
? ? ? ? ? ? ?5優(yōu)化器:對(duì)要執(zhí)行的 SQL命令做優(yōu)化(是內(nèi)存自動(dòng)功能程序)
? ? ? ? ? ? 6查詢緩存:劃分出一定的物理內(nèi)存空間給MySQL服務(wù)存儲(chǔ)查找過(guò)的數(shù)據(jù)。
? ? ? ? ? ? 7存儲(chǔ)引擎:當(dāng)對(duì)表里的數(shù)據(jù)做查詢(select) 或?qū)懖僮鳎╥nsert /update /delete)會(huì)調(diào)用存儲(chǔ)引擎對(duì)表中的數(shù)據(jù)做處理,至于如何處理取決表使用的存儲(chǔ)引擎的功能
? ? ? ? ? ?8文件系統(tǒng):通常指的就是電腦的硬盤
? ? ? ? ? ??2)MySQL服務(wù)的工作過(guò)程
????????????????? 2.1 處理查詢select訪問(wèn)的工作過(guò)程
???????????????????? 第1步: 客戶端向服務(wù)器發(fā)起連接請(qǐng)求
???????????????????? 第2步: 服務(wù)器接收到客戶端連接請(qǐng)求并響應(yīng)
???????????????????? 第3步:如果客戶端執(zhí)行的selcet 訪問(wèn),先在查詢緩存里提取數(shù)據(jù)
回復(fù)給客戶端,
如果數(shù)據(jù)庫(kù)服務(wù)器在查詢緩存里沒(méi)有找到用戶訪問(wèn)的數(shù)據(jù),這
時(shí)就要到數(shù)據(jù)庫(kù)服務(wù)器的表里查找數(shù)據(jù),對(duì)數(shù)據(jù)庫(kù)目錄下的表
做訪問(wèn)是就會(huì)調(diào)用表使用的存儲(chǔ)引擎對(duì)表做處理,
然后把查找到的數(shù)據(jù)先放到查詢緩存 在回復(fù)給客戶端
在數(shù)據(jù)庫(kù)服務(wù)器查看與查詢緩存相關(guān)的配置項(xiàng)
???????????????????? ? mysql> show variables like "%query_cache%";
2.2 處理存儲(chǔ)(insert)訪問(wèn)的工作過(guò)程
???????????????????????? 第1步: 客戶端向服務(wù)器發(fā)起連接請(qǐng)求
???????????????????????? 第2步: 服務(wù)器接收到客戶端連接請(qǐng)求并響應(yīng)
???????????????????????? 第3步: 根據(jù)表使用的存儲(chǔ)引擎 對(duì)表中的數(shù)據(jù)做對(duì)應(yīng)的處理。
???????????????????????? 第4步: 斷開(kāi)連接
??? 2.2 存儲(chǔ)引擎管理
?????? ??? 1) 查看存儲(chǔ)引擎
????????????????? 1.1 查看數(shù)據(jù)庫(kù)服務(wù)支持的存儲(chǔ)引擎和默認(rèn)使用的存儲(chǔ)引擎
mysql> show?? engines;
.2 查看當(dāng)前已有表使用的存儲(chǔ)引擎
mysql> show create table DB1.t3 \G
?修改存儲(chǔ)引擎
????????????????? 2.1 修改數(shù)據(jù)庫(kù)服務(wù)默認(rèn)使用的存儲(chǔ)引擎??
[root@host50 ~]#vim /etc/my.cnf
???????? [mysqld]
???????? default-storage-engine=myisam
??
說(shuō)明:
????????????????? memory存儲(chǔ)引擎的表 每個(gè)表對(duì)應(yīng)1個(gè)表文件
????????????????? innodb存儲(chǔ)引擎的表 每個(gè)表對(duì)應(yīng)2個(gè)表文件
????????????????? myisam存儲(chǔ)引擎的表 每個(gè)表對(duì)應(yīng)3個(gè)表文件
? ?
??? 2.3修改表使用的存儲(chǔ)引擎(一般在表存儲(chǔ)存儲(chǔ)數(shù)據(jù)之前修改)
????????????????? 說(shuō)明:存儲(chǔ)引擎修改了,存儲(chǔ)數(shù)據(jù)的位置也會(huì)改變,
2.3 常用存儲(chǔ)引擎特點(diǎn)(生產(chǎn)環(huán)境下常用的存儲(chǔ)引擎)
?????????? 1) myisam存儲(chǔ)引擎特點(diǎn)
???????????? 支持表級(jí)鎖 、不支持事務(wù)、事務(wù)回滾、外鍵
???????????? ?myisam存儲(chǔ)引擎的表 每個(gè)表對(duì)應(yīng)3個(gè)表文件
???????????? ?表名.frm? 存儲(chǔ)表頭信息????? mysql> desc? 庫(kù).表;
???????????? ?表名.MYI? 存儲(chǔ)表索引信息??? mysql> show index from? 庫(kù).表;
???????????? ?表名.MYD? 存儲(chǔ)表里的數(shù)據(jù)??? mysql> select? * from? 庫(kù).表;
? ? ? ? ? ? ? ?2) innodb存儲(chǔ)引擎特點(diǎn)
???????????? 支持行級(jí)、支持事務(wù)、事務(wù)回滾、外鍵
???????????? innodb存儲(chǔ)引擎的表 每個(gè)表對(duì)應(yīng)2個(gè)表文件
表名.frm? 存儲(chǔ)表頭信息????? mysql> desc? 庫(kù).表;
表名.ibd? 存儲(chǔ)表的索引信息+表的數(shù)據(jù)信息????
show index from? 庫(kù).表; +? select? * from? 庫(kù).表;
?????????? 3) 專業(yè)術(shù)語(yǔ)
????????????? 說(shuō)明: 給表加鎖,是為了解決客戶端并發(fā)訪問(wèn)的沖突問(wèn)題
? ? ? ? ?? 3.1 鎖類型:根據(jù)對(duì)數(shù)據(jù)的訪問(wèn)類型加鎖
???????????????? 讀鎖:又稱為共享鎖,對(duì)數(shù)據(jù)做查詢select 訪問(wèn)
???????????????????? ? 加了讀鎖表,允許多個(gè)訪問(wèn)同時(shí)查詢一張。
? ? ? ? ? ? ? ? ? ?寫鎖:又稱為排它鎖或互斥鎖,對(duì)數(shù)據(jù)做寫訪問(wèn)(寫訪問(wèn)通常指定的是 insert | delete | update )加了寫鎖的表,同一時(shí)間只允許1個(gè)連接做寫操作,后續(xù)的讀和寫都得等待,等待寫鎖釋放后,才允許后續(xù)的讀或?qū)懺L問(wèn)。
? ? ? ? ? ?3.2 鎖粒度:指的就是給表加鎖的范圍?
???? 行級(jí)鎖: 僅僅對(duì)被訪問(wèn)的行分別加鎖,沒(méi)有被訪問(wèn)的行不加鎖
???? 表級(jí)鎖: 只要是對(duì)表做訪問(wèn),就會(huì)把整張表加鎖(不管訪問(wèn)的是1行 還是更多行)
?
??? 2.4 事務(wù)特性
?????????? 1)什么是事務(wù)?
指的是一組不可分割的SQL操作。
使用Innodb 存儲(chǔ)引擎的表才支持事務(wù)。
事務(wù)用來(lái)管理對(duì)數(shù)據(jù)的 insert,update,delete 操作
?????????? 2) 事務(wù)的特性簡(jiǎn)稱ACID (表的存儲(chǔ)引擎必須是innodb 才有事務(wù)的特性)
???????????? Atomic :原子性
一個(gè)事務(wù)(transaction)中的所有操作,要么全部完成,要么全部不完成。
? ? ? ? ? ? ?Consistency : 一致性
在事務(wù)開(kāi)始之前和事務(wù)結(jié)束以后,數(shù)據(jù)庫(kù)的完整性不會(huì)被破壞。
?????????????? 執(zhí)行sql命令時(shí),敲回車前 稱為事務(wù)開(kāi)始之前
???????? ?? 執(zhí)行sql命令時(shí),敲回車后 稱為事務(wù)結(jié)束以后
? ? ? ? ? ? Isolation :隔離性
數(shù)據(jù)庫(kù)允許多個(gè)并發(fā)事務(wù)同時(shí)對(duì)其數(shù)據(jù)進(jìn)行讀寫和修改而互不影響。
???????????? MySQL服務(wù)是支持多并連接的服務(wù),同一時(shí)刻可是同時(shí)接收多個(gè)客戶端的訪問(wèn),
???????????? 如果訪問(wèn)的是innodb存儲(chǔ)引擎的表,彼此不知道操作的是同1張表
? ? ? ? ? ? ? Durability :持久性
事務(wù)處理結(jié)束后,對(duì)數(shù)據(jù)的修改就是永久的,即便系統(tǒng)故障也不會(huì)丟失。
???????????? 執(zhí)行回車后,事務(wù)就結(jié)束。數(shù)據(jù)會(huì)永久有效。
??
2.5 事務(wù)隔離級(jí)別
事務(wù)隔離解決的問(wèn)題:臟讀? 、不可重復(fù)讀 、 幻讀 。
?臟讀: 讀到了其他事務(wù)未提交的數(shù)據(jù),讀到的數(shù)據(jù)并不一定是最終存儲(chǔ)到數(shù)據(jù)庫(kù)里的數(shù)據(jù)。
?可重復(fù)讀:可重復(fù)讀指的是在一個(gè)事務(wù)內(nèi),最開(kāi)始讀到的數(shù)據(jù)和事務(wù)結(jié)束前的任意時(shí)刻讀到的同一批數(shù)據(jù)都是一致的。
?不可重復(fù)讀:一個(gè)事務(wù)先后讀取同一條記錄,而事務(wù)在兩次讀取之間該數(shù)據(jù)被其它事務(wù)所修改,則兩次讀取的數(shù)據(jù)不同,這種就是不可重復(fù)讀。
?幻讀:一個(gè)事務(wù)按相同的查詢條件重新讀取以前檢索過(guò)的數(shù)據(jù),卻發(fā)現(xiàn)其他事務(wù)插入了滿足其查詢條件的新數(shù)據(jù),這種現(xiàn)象就稱為幻讀。
? ?事務(wù)隔離級(jí)別
讀未提交(Read? Uncommitted): 最低的隔離級(jí)別,允許讀取尚未提交的數(shù)據(jù)變更;可能會(huì)導(dǎo)致臟讀、幻讀、不可重復(fù)對(duì)。
?讀提交(Read? Committed):允許并發(fā)事務(wù)讀取已經(jīng)提交的數(shù)據(jù),可以阻止臟讀;但幻讀或不可重復(fù)讀仍有可能發(fā)生。
?可重復(fù)讀(Repeatable Read):對(duì)同一字段的多次讀取結(jié)果都是一致的;除非數(shù)據(jù)是被本身事務(wù)自己所修改;可以阻止臟讀和不可重復(fù)讀,但幻讀仍有可能發(fā)生。
?序列化(Serializable):最高的隔離級(jí)別,完全服從ACID的隔離級(jí)別。所有的事務(wù)依次逐個(gè)執(zhí)行,事務(wù)之間完全不可能產(chǎn)生干擾。該級(jí)別可以防止臟讀和不可重復(fù)讀,及幻讀。
??????????????