日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

mysql如何管理innodb元数据_MySQL 8 InnoDB 集群管理

發(fā)布時(shí)間:2023/12/4 数据库 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql如何管理innodb元数据_MySQL 8 InnoDB 集群管理 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

使用?dba.checkInstanceConfiguration()

在添加實(shí)例到集群中前,使用該方法檢查實(shí)例配置是否滿(mǎn)足InnoDB 集群要求。

使用?dba.configureLocalInstance() 配置實(shí)例

在MySQL Server版本不支持持久化功能的實(shí)例上,需要使用該方法添加修改配置信息到本地實(shí)例的選項(xiàng)文件中。比如下面的更改集群配置的操作:

? dba.configureInstance()

? dba.createCluster()

? Cluster.addInstance()

? Cluster.removeInstance()

? Cluster.rejoinInstance()

使用?dba.getCluster() 接收 InnoDB 集群

dba.createCluster() 返回集群對(duì)象。該對(duì)象可以賦值給變量。如果后面需要獲取已創(chuàng)建集群對(duì)象,可以通過(guò)該方法。

使用cluster.describe()

該方法用于獲取集群結(jié)構(gòu)信息。

使用?Cluster.status() 檢查實(shí)例狀態(tài)

在檢查集群狀態(tài)之前,需要通過(guò)連接到集群中的任意實(shí)例獲取集群對(duì)象的引用(reference)。如果需要更改集群對(duì)象,需要連接到R/W 實(shí)例。

實(shí)例狀態(tài)直接反應(yīng)集群狀態(tài)報(bào)告提供的信息,因而需要連接到一個(gè)在線實(shí)例。

擴(kuò)展信息:cluster.status({'extended':0}) 支持extended擴(kuò)展操作,可取值包括:0、1、2、3.

監(jiān)控恢復(fù)操作

cluster.status()如果顯示為Recovering狀態(tài)。存在兩種恢復(fù)方式:克隆、增量。

InnoDB集群和組復(fù)制協(xié)議

從MySQL 8.0.16版本,組復(fù)制有一個(gè)通信協(xié)議。這個(gè)通信協(xié)議一般需要顯式的管理。因?yàn)橥ㄐ艆f(xié)議的版本要兼容最久組復(fù)制成員數(shù)據(jù)庫(kù)版本。但是如果是使用AdminAPI管理集群,一般就不需要管理員干預(yù)了。AdminAPI會(huì)自動(dòng)根據(jù)集群成員版本的變更而自動(dòng)調(diào)整。

檢查實(shí)例的MySQL版本

MySQL文檔給出了三個(gè)方法都可以查看實(shí)例的MySQL版本,但測(cè)試只有cluster.status() 方法可行。

其他兩個(gè)方法:cluster.describe() 和 cluster.rescan()

super read-only 和 實(shí)例

當(dāng)組復(fù)制停止的時(shí)候,會(huì)將實(shí)例設(shè)置為 super read only。有三個(gè)方法可以修改這個(gè)設(shè)置,如果再將super_read_only設(shè)置為off時(shí),注意是否有應(yīng)用程序在修改實(shí)例。

? dba.configureInstance()

? dba.configureLocalInstance()

? dba.dropMetadataSchema()

注:強(qiáng)制設(shè)置super_read_only=off,在方法中添加選項(xiàng):clearReadOnly.比如:

dba.configureInstance(instance, {clearReadOnly: true})

配置管理InnoDB集群的用戶(hù)

前面也提到了,在使用dba.configureInstance() 或者 dba.configureLocalInstance() 配置實(shí)例時(shí),可以通過(guò)clusterAdmin 選項(xiàng)生成一個(gè)集群管用戶(hù)。這也是MySQL推薦的。

也可以通過(guò)手工方法配置集群管理用戶(hù),賦予適當(dāng)?shù)臋?quán)限。如果用戶(hù)只是用于監(jiān)控集群可以賦予更少的權(quán)限。

配置實(shí)例自動(dòng)重新加入

MySQL 8.0.16 版本開(kāi)始,支持組復(fù)制自動(dòng)重新加入功能。 在實(shí)例從集群中剔除后,自動(dòng)重新加入集群。AdminAPI 提供autoRejoinTries 選項(xiàng)控制嘗試次數(shù)。默認(rèn)情況下,自動(dòng)重新加入功能沒(méi)有開(kāi)啟。可以通過(guò)下面方法在集群級(jí)或者實(shí)例級(jí)配置該功能。

? dba.createCluster()

? Cluster.addInstance()

? Cluster.setOption()

? Cluster.setInstanceOption()

在網(wǎng)絡(luò)環(huán)境不穩(wěn)定的集群中,這個(gè)參數(shù)可以考慮設(shè)置。但是如果集群quorum數(shù)量的成員丟失了,autoRejoinTries 選項(xiàng)不起作用。

與這個(gè)參數(shù)相關(guān)的另一個(gè)參數(shù)exitStateActio,在MySQL 8.0.12版本,這個(gè)參數(shù)可以設(shè)置為READ_ONLY,即在實(shí)例異常從集群中離開(kāi)后的動(dòng)作。在MySQL 8.0.18版本,這個(gè)參數(shù)可以設(shè)置為OFFLINE_MODE。這個(gè)模式是比較推薦的,因?yàn)槿绻荝EAD_ONLY,客戶(hù)端應(yīng)用程序可能從該實(shí)例讀取舊的數(shù)據(jù)。exitStateActio 選項(xiàng)起作用是在嘗試完autoRejoinTries 選項(xiàng)配置的次數(shù)后而沒(méi)有加入到集群中的話(huà)。

如果實(shí)例正在重新加入集群,下面的操作可能受影響:

? Cluster.status()

? dba.getCluster()

? Cluster.rejoinInstance()

? Cluster.addInstance()

? Cluster.removeInstance()

? Cluster.rescan()

? Cluster.checkInstanceState()

注:Cluster.removeInstance() 如果發(fā)生在正在重新加入集群,操作失敗,除非指定froce:true 選項(xiàng)。

從InnoDB集群中刪除實(shí)例

Cluster.removeInstance(instance) 方法可以從集群中刪除實(shí)例。這個(gè)方法確保從集群在線的實(shí)例中刪除該實(shí)例的元數(shù)據(jù),以及該實(shí)例本身的存儲(chǔ)的元數(shù)據(jù)。

MySQL Shell dba.gtidWaitTimeout 選項(xiàng)控制如果在刪除實(shí)例時(shí)有GTID事務(wù)正在應(yīng)用的等待時(shí)間。如果超時(shí),刪除操作失敗。如果指定force 選項(xiàng)會(huì)刪除實(shí)例。

force 選項(xiàng)一般不應(yīng)該使用,除非實(shí)例不可達(dá),或者不可處理。如果指定force可能導(dǎo)致刪除的實(shí)例不能重新加入到集群中。

在刪除時(shí),可以指定interactive 選項(xiàng),交互式的刪除實(shí)例,在實(shí)例不可達(dá)(unreachable)時(shí),提示是否繼續(xù)。

重新加入集群

如果實(shí)例離開(kāi)集群,比如丟失連接,并且沒(méi)有自動(dòng)重新加入集群。可以通過(guò)cluster.rejoinInstance() 方法將實(shí)例重新加入到集群中。如果實(shí)例 super_read_only=on,傳遞給這個(gè)方法的URI-Like要有權(quán)限設(shè)置super_read_only=off。

一種可能的情況就是實(shí)例加入集群時(shí),沒(méi)有持久化配置,導(dǎo)致重啟后不能自動(dòng)加入集群。在MySQL 8.0.17,支持PERSIST 命令后這個(gè)問(wèn)題基本不存在了。如果是之前的版本,可以通過(guò)這個(gè)方法重新加入到集群中,同時(shí)注意配置的持久化。

如果實(shí)例離開(kāi)集群后,做了一些操作,比如還原備份,導(dǎo)致實(shí)例Server UUID不同了。可能導(dǎo)致實(shí)例不能加入集群。因?yàn)榧褐蠸erver UUID標(biāo)識(shí)實(shí)例。可以通過(guò)下面的方法處理:

cluster.removeInstance("root@instanceWithOldUUID:3306", {force: true})

cluster.rescan()

注:使用cluster.removeInstance() 方法時(shí),必須指定force 選項(xiàng),因?yàn)閺募航嵌?#xff0c;實(shí)例已經(jīng)不可達(dá)了(unreachable)。先從集群中刪除舊的配置信息。通過(guò)cluster.rescan() 方法將實(shí)例添加到集群元數(shù)據(jù)中。

定制InnoDB 集群

當(dāng)創(chuàng)建集群、添加實(shí)例到集群的時(shí)候,組名、本地地址、seed 實(shí)例都由AdminAPI自動(dòng)配置,這在絕大部分情況下都是推薦的。MySQL也給出了自定義這些選項(xiàng)的方法。在dba.createCluster()或者cluster.addInstance()時(shí)傳遞指定的選項(xiàng)即可。

dba.createCluster()命令傳遞groupName 選項(xiàng)配置集群組名,對(duì)應(yīng)于組復(fù)制的變量:group_replication_group_name。這個(gè)值必須要是一個(gè)有效的Server UUID。如果看過(guò)組復(fù)制那一章節(jié),很多時(shí)候會(huì)把集群中不同實(shí)例組名設(shè)置為各自的Server UUID。這種做法是不對(duì)的。

在dba.createCluster()或者cluster.addInstance()方法中,定制實(shí)例用于集群成員通信的本地地址:localAdress 選項(xiàng)。對(duì)應(yīng)于組復(fù)制的?group_replication_local_address 系統(tǒng)變量。這個(gè)地址:localAdress:port 用于集群成員內(nèi)部通信。不能使用這個(gè)地址連接實(shí)例。

默認(rèn)是主機(jī)名:實(shí)例端口 * 10 + 1

注意這個(gè)地址:端口在集群中所有成員可以訪問(wèn)。

在dba.createCluster()或者cluster.addInstance()方法中,定制seed 實(shí)例,使用選項(xiàng):groupSeeds選項(xiàng)。對(duì)應(yīng)組復(fù)制系統(tǒng)變量:group_replication_group_seeds。

seed 實(shí)例是在添加實(shí)例到集群中時(shí),用于給新增的成員作為數(shù)據(jù)源。

更改集群拓?fù)?/p>

從MySQL 8.0.15開(kāi)始,支持在線更改集群拓?fù)洹V暗陌姹拘枰冉獬?#xff0c;重建集群。

Cluster.setPrimaryInstance(instance) 方法在線設(shè)置 primary 實(shí)例。

通過(guò)AdminAPI命令在線修改集群拓?fù)?#xff1a;

switchToMultiPrimaryMode() 方法切換為多 primary 模式。

注:在切換為多 primary 模式后,6447端口(默認(rèn)只讀)接收讀寫(xiě),并且可通過(guò)該端口訪問(wèn)所有集群成員。而6446端口(默認(rèn)讀寫(xiě))只能連接到其中一個(gè)成員(之前是 primary 成員)。

Cluster.switchToSinglePrimaryMode([instance]) 方法切換到單 primary 模式。

設(shè)置InnoDB 集群選項(xiàng)

cluster.options() 方法查看當(dāng)前集群、實(shí)例選項(xiàng)設(shè)置。添加 all 選項(xiàng)可以查看組復(fù)制系統(tǒng)變量設(shè)置。

Cluster.setOption(option, value) 方法設(shè)置集群、集群所有實(shí)例。

Cluster.setInstanceOption(instance, option, value) 方法設(shè)置單獨(dú)的集群實(shí)例。

集群和實(shí)例級(jí)選項(xiàng):

? exitStateAction

? memberWeight

僅實(shí)例級(jí):

? label

僅集群級(jí):

? consistency

? expelTimeout

? clusterName

檢查實(shí)例狀態(tài)

cluster.checkInstanceState() 方法檢查實(shí)例上已存在的數(shù)據(jù)。通過(guò)對(duì)比實(shí)例上GTID與集群中的GTID作比較。這里會(huì)涉及到實(shí)例添加到集群時(shí),如果做恢復(fù)操作。配合dba.checkInstanceConfiguration() 方法。

創(chuàng)建服務(wù)器白名單

dba.createCluster() 或者 cluster.addInstance() ,ipWhitelist 選項(xiàng)配置白名單,對(duì)應(yīng)于組復(fù)制的group_replication_ip_whitelist 系統(tǒng)變量。

配置故障轉(zhuǎn)移一致性

從MySQL 8.0.14版本開(kāi)始支持使用AdminAPI命令的 consistency 選項(xiàng)。在調(diào)用createCluster() 方法時(shí),可以指定一致性選項(xiàng)。默認(rèn)值是:EVENTUAL。對(duì)應(yīng)于組復(fù)制的group_replication_consistency 系統(tǒng)變量。這個(gè)值在單 primary 選 primary 時(shí),可能導(dǎo)致客戶(hù)端應(yīng)用程序讀取舊的(stable)數(shù)據(jù)。推薦值是:consistency=1 對(duì)應(yīng)于BEFORE_ON_PRIMARY_FAILOVER。

配置選舉過(guò)程

在single primary 模式下,在 primary 故障,集群選 primary 時(shí),默認(rèn)是通過(guò)優(yōu)先通過(guò) memberWeight 選項(xiàng),對(duì)應(yīng)于組復(fù)制的?group_replication_member_weight 系統(tǒng)變量。如果成員權(quán)重相同,對(duì)比Server UUID。

可以通過(guò)指定memberWeight 選項(xiàng),這樣在做primary 選舉時(shí)優(yōu)先選擇。

AdminAPI 腳本

MySQL Shell支持腳本配置、管理集群。比如:

shell> mysqlsh -f setup-innodb-cluster.js

注:腳本名稱(chēng)后的選項(xiàng)是傳給給腳本的。可以通過(guò)JS中的os.argv 或者 Python 中的 sys.argv 傳遞參數(shù)。

解散 InnoDB 集群

Cluster.dissolve() 提供了解散現(xiàn)有集群的方法。刪除元數(shù)據(jù)和集群配置。但保留集群成員之間復(fù)制的數(shù)據(jù)。

如果有集群實(shí)例不可達(dá),先考慮將其加入集群中,然后再解散集群,保證集群成員的一致性。

MySQL Shell 選項(xiàng):dba.gtidWaitTimeout 指定解散集群時(shí)允許處理的GTID時(shí)間。超時(shí)導(dǎo)致解散操作失敗,可以通過(guò)指定force:true強(qiáng)制解散集群。

恢復(fù)丟失Quorum的集群

Cluster.forceQuorumUsingPartitionOf(instance) 方法用于恢復(fù)集群中majority 實(shí)例丟失。這個(gè)方法具有一定的危險(xiǎn)性,可能認(rèn)為產(chǎn)生腦裂問(wèn)題。給該方法傳遞一個(gè)在線實(shí)例,通過(guò)讀取該實(shí)例的元數(shù)據(jù),恢復(fù)集群。

重啟集群

dba.rebootClusterFromCompleteOutage() 方法用于在集群完全斷電后重新配置集群。使用這個(gè)方法前先確認(rèn)集群成員是否啟動(dòng),連接到集群中GTID 超集的實(shí)例。在交互模型下,對(duì)于發(fā)現(xiàn)的實(shí)例,MySQL Shell提示是否加入集群;對(duì)于不可達(dá)的實(shí)例,MySQL Shell提示是否從集群中刪除實(shí)例。如果不是運(yùn)行在交互模式下,可以通過(guò)cluster.rejoinInstance() 和 cluster.removeInstance() 實(shí)現(xiàn)類(lèi)似功能選項(xiàng)。

如果dba.rebootClusterFromCompleteOutage() 方法失敗,可以通過(guò)dba.dropMetadataSchema() 方法刪除集群元數(shù)據(jù),然后dba.createCluster() 重建集群。

RESCAN 集群

如果使用非AdminAPI命令更改集群配置,比如:手工更改實(shí)例配置以解決配置問(wèn)題或者實(shí)例丟失連接。可以通過(guò)cluster.rescan()方法更新InnoDB元數(shù)據(jù)以匹配當(dāng)前實(shí)力配置。

InnoDB集群和Auto-Increment

在InnoDB集群中使用實(shí)例時(shí),為避免多 primary 集群模式下自增長(zhǎng)碰撞(collisions),InnoDB集群自動(dòng)根據(jù)集群模式以及實(shí)例數(shù)量配置?auto_increment_increment 和 auto_increment_offset 系統(tǒng)變量。

單 primary 模式下,設(shè)置auto_increment_increment=1 和 auto_increment_offset=2。

多 primary 模式下配置:

If the group is running in multi-primary mode, then when the cluster has 7 instances or less set auto_increment_increment to 7 and auto_increment_offset to 1 + server_id % 7. If a multiprimary cluster has 8 or more instances set auto_increment_increment to the number of instances and auto_increment_offset to 1 + server_id % the number of instances.

保護(hù)集群

可以配置服務(wù)器使用安全連接。

創(chuàng)建的集群使用了SSL,則必須將服務(wù)器加入到ipWhitelist中。

dba.createCluster() 創(chuàng)建集群時(shí),如果seed 實(shí)例支持SSL連接。則創(chuàng)建的集群支持SSL。通過(guò)cluster.addInstance() 方法添加的實(shí)例也需要支持SSL。

memberSslMode 選項(xiàng)支持三個(gè)可選值:AUTO(默認(rèn))、REQUIRED、DISABLED.

通過(guò)組復(fù)制adoptFromGR方法生成的集群,沒(méi)有SSL設(shè)置選項(xiàng)。集群的SSL配置根據(jù)組復(fù)制設(shè)置而定。

MySQL Router 和 元數(shù)據(jù)服務(wù)器

如果在MySQL Router bootstrap 集群后,集群添加實(shí)例,需要MySQL Router 重新 bootstrap 更新服務(wù)器記錄的實(shí)例地址列表。

可以bootstrap 多個(gè) MySQL Router,信息會(huì)記錄在元數(shù)據(jù)中。從MySQL 8.0.19 版本開(kāi)始,cluster.listRouters() 方法可以查看元數(shù)據(jù)中注冊(cè)的MySQL Router列表。

MySQL 8.0.19 版本,提供方法:Cluster.removeRouterMetadata(router) 從元數(shù)據(jù)中刪除MySQL Router信息。

MySQL 克隆和InnoDB 集群

添加實(shí)例到集群中,可能存在一個(gè)分布式恢復(fù)的過(guò)程:實(shí)例同步集群中的數(shù)據(jù)。之前只有一種方法:增量恢復(fù),也就是異步復(fù)制技術(shù)。存在一個(gè)問(wèn)題:如果實(shí)例需要復(fù)制的GTID事務(wù)已經(jīng)PURGED,即@@gtid_purged > 0。實(shí)例所需要的事務(wù)不能在二進(jìn)制日志中完全找到。這樣情況類(lèi)似做MySQL 主從復(fù)制,解決的方法是利用最近的備份先恢復(fù)到實(shí)例(Slave)中。再利用復(fù)制技術(shù)同步二進(jìn)制日志。

MySQL 8.0.17 版本對(duì)于這種情況提供了方便的解決方案:MySQL 克隆技術(shù)。克隆技術(shù)也是在集群中的donor(數(shù)據(jù)發(fā)送者)做數(shù)據(jù)快照,這個(gè)集群在使用cluster.addInstance() 方法添加實(shí)例時(shí)會(huì)自動(dòng)判斷是否需要通過(guò)克隆來(lái)做分布式恢復(fù)。cluster.addInstance() 方法提供了3個(gè)可選值:auto(默認(rèn))、clone、incremental。

注:如果實(shí)例是通過(guò)克隆技術(shù)完成加入集群的。在克隆操作時(shí)會(huì)將實(shí)例之前的數(shù)據(jù)清除,所有沒(méi)有保存在表中的MySQL設(shè)置保存。在cluster.status() 方法中也會(huì)提供額外信息。

即使donor 實(shí)例的GTID_EXECUTED=0,也不能說(shuō)明donor instance 二進(jìn)制日志包含所有的事務(wù),因?yàn)橛锌赡躣onor server 之前運(yùn)行時(shí)并沒(méi)有啟用GTID。因?yàn)楹?jiǎn)單地使用?recoveryMethod 選項(xiàng)值:incremental 不是合理的。

recoveryMethod 默認(rèn)值:auto。集群會(huì)確定在交互模式下,使用什么方法添加實(shí)例是合理的。如果是非交互模式,恢復(fù)方法需要顯示的設(shè)置。

recoveryMethod 可選值的一些說(shuō)明:

clone:如果準(zhǔn)備加入進(jìn)群的實(shí)例不好數(shù)據(jù),或者數(shù)據(jù)可丟棄。可以使用clone方式。這種方式下,MySQL Clone 插件自動(dòng)安裝,恢復(fù)賬號(hào)自動(dòng)創(chuàng)建。

incremental:使用異步復(fù)制做增量恢復(fù)。這種情況發(fā)生在:確定所有事務(wù)使用GTID,待加入實(shí)例包含集群所有GTID或者子集。

如果增量恢復(fù)與克隆技術(shù)都可以使用的話(huà),MySQL 推薦使用克隆技術(shù),這種做法一般會(huì)比較快的恢復(fù)事務(wù),而且可以清除實(shí)例上不需要的數(shù)據(jù)。

Cluster.checkInstanceState() 與 MySQL?Clone

dba.checkInstanceConfiguration() 和?Cluster.checkInstanceState() :前者驗(yàn)證實(shí)例配置,后者驗(yàn)證實(shí)例數(shù)據(jù)。

使用Cluster.checkInstanceState() 方法可以驗(yàn)證如果donor instances 如果GTID_PURGED <> 0,而clone方法可用時(shí),會(huì)給出建議。如果克隆方法不可用,會(huì)給出實(shí)例不可恢復(fù)警告。

dba.checkInstanceConfiguration() 和 MySQL Clone

如果dba.checkInstanceConfiguration() 發(fā)現(xiàn)MySQL Clone 可用,但是被disable了,會(huì)給出警告信息。

總結(jié)

以上是生活随笔為你收集整理的mysql如何管理innodb元数据_MySQL 8 InnoDB 集群管理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。