真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

MySQLVersionTokens

MySQL 5.7.8或更高版本的發(fā)行版包括版本令牌,該特性支持創(chuàng)建和同步服務(wù)器令牌,應(yīng)用程序可以使用這些令牌來(lái)防止訪問(wèn)不正確或過(guò)時(shí)的數(shù)據(jù)。

蘆山網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)建站,蘆山網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為蘆山1000+提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站建設(shè)公司要多少錢(qián),請(qǐng)找那個(gè)售后服務(wù)好的蘆山做網(wǎng)站的公司定做!

版本令牌接口具有這些特征:
.版本令牌是由用作鍵或標(biāo)識(shí)符的名稱和一個(gè)值組成的對(duì)
.版本令牌可以被鎖定。應(yīng)用程序可以使用令牌鎖向其他協(xié)作應(yīng)用程序表明正在使用令牌,不應(yīng)該修改它們。
.每個(gè)服務(wù)器都建立版本令牌列表;例如,指定服務(wù)器分配或操作狀態(tài)。此外,與服務(wù)器通信的應(yīng)用程序可以注冊(cè)自己的令牌列表,這些令牌表示它需要服務(wù)器處于的狀態(tài)。應(yīng)用程序發(fā)送到不處于所需狀態(tài)的服務(wù)器的SQL語(yǔ)句將產(chǎn)生錯(cuò)誤。這是給應(yīng)用程序的一個(gè)信號(hào),它應(yīng)該尋找另一個(gè)處于所需狀態(tài)的服務(wù)器來(lái)接收SQL語(yǔ)句。

以下部分描述了版本令牌的組件,討論了如何安裝和使用它,并為其組件提供參考信息。

版本標(biāo)識(shí)組件
名為version_token的服務(wù)器端插件持有與服務(wù)器關(guān)聯(lián)的版本令牌列表,并訂閱語(yǔ)句執(zhí)行事件的通知。version_token插件使用審計(jì)插件API來(lái)監(jiān)視來(lái)自客戶端的傳入語(yǔ)句,并將每個(gè)客戶端特定于會(huì)話的版本令牌列表與服務(wù)器版本令牌列表進(jìn)行匹配。如果存在匹配,插件允許語(yǔ)句通過(guò),服務(wù)器繼續(xù)處理它。否則,插件將向客戶端返回一個(gè)錯(cuò)誤,語(yǔ)句將失敗。

一組用戶定義函數(shù)(udf)提供了一個(gè)sql級(jí)別的API,用于操作和檢查插件維護(hù)的服務(wù)器版本令牌列表。調(diào)用任何的令牌udf版本

系統(tǒng)變量允許客戶端指定注冊(cè)所需服務(wù)器狀態(tài)的版本令牌列表。如果客戶端發(fā)送語(yǔ)句時(shí)服務(wù)器處于不同的狀態(tài),則客戶端接收到一個(gè)錯(cuò)誤

安裝或卸載版本令牌

這里介紹如何安裝或卸載版本令牌,這些令牌是在包含插件和用戶定義函數(shù)的插件庫(kù)文件中實(shí)現(xiàn)的。有關(guān)安裝或卸載插件和udf的一般信息要使服務(wù)器可用,插件庫(kù)文件必須位于MySQL插件目錄中(由plugin_dir系統(tǒng)變量命名的目錄)。如果需要,在服務(wù)器啟動(dòng)時(shí)設(shè)置plugin_dir的值,告訴服務(wù)器插件目錄的位置

插件庫(kù)的基本名是version_token。文件名后綴因平臺(tái)而異(例如,對(duì)于Unix和類Unix系統(tǒng),.dll為Windows).

要安裝版本令牌插件和udf,請(qǐng)使用install plugin并創(chuàng)建函數(shù)語(yǔ)句(根據(jù)需要調(diào)整.so后綴):

mysql> INSTALL PLUGIN version_tokens SONAME 'version_token.so';
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id:    39
Current database: mysql
Query OK, 0 rows affected (0.07 sec)
mysql> CREATE FUNCTION version_tokens_set RETURNS STRING SONAME 'version_token.so';
Query OK, 0 rows affected (0.02 sec)
mysql> CREATE FUNCTION version_tokens_show RETURNS STRING SONAME 'version_token.so';
Query OK, 0 rows affected (0.02 sec)
mysql> CREATE FUNCTION version_tokens_edit RETURNS STRING SONAME 'version_token.so';
Query OK, 0 rows affected (0.02 sec)
mysql> CREATE FUNCTION version_tokens_delete RETURNS STRING SONAME 'version_token.so';
CREATE FUNCTION version_tokens_lock_shared RETURNS STRING SONAME 'version_token.so';
Query OK, 0 rows affected (0.02 sec)
mysql> CREATE FUNCTION version_tokens_lock_shared RETURNS STRING SONAME 'version_token.so';
Query OK, 0 rows affected (0.00 sec)
mysql> CREATE FUNCTION version_tokens_lock_exclusive RETURNS STRING SONAME 'version_token.so';
Query OK, 0 rows affected (0.00 sec)
mysql> CREATE FUNCTION version_tokens_unlock RETURNS STRING SONAME 'version_token.so';
Query OK, 0 rows affected (0.03 sec)

您必須安裝udf來(lái)管理服務(wù)器的版本令牌列表,但是您還必須安裝插件,因?yàn)闆](méi)有它udf將無(wú)法正常工作。

如果在主復(fù)制服務(wù)器上使用插件和udf,也要將它們安裝在所有從服務(wù)器上,以避免復(fù)制問(wèn)題

如前所述,一旦安裝完成,版本令牌插件和udf將一直保持安裝狀態(tài),直到卸載為止。要?jiǎng)h除它們,使用UNINSTALL插件和DROP FUNCTION語(yǔ)句:

mysql> uninstall plugin version_tokens;
Query OK, 0 rows affected, 1 warning (0.02 sec)
mysql> drop function version_tokens_set;
drop function version_tokens_show;
Query OK, 0 rows affected (0.02 sec)
mysql> drop function version_tokens_show;
drop function version_tokens_edit;
Query OK, 0 rows affected (0.00 sec)
mysql> drop function version_tokens_edit;
Query OK, 0 rows affected (0.00 sec)
mysql> drop function version_tokens_delete;
Query OK, 0 rows affected (0.01 sec)
mysql> drop function version_tokens_lock_shared;
Query OK, 0 rows affected (0.00 sec)
mysql> drop function version_tokens_lock_exclusive;
Query OK, 0 rows affected (0.00 sec)
mysql> drop function version_tokens_unlock;
Query OK, 0 rows affected (0.02 sec)

使用版本標(biāo)記
版本令牌可能有用的一個(gè)場(chǎng)景是,系統(tǒng)訪問(wèn)MySQL服務(wù)器集合,但是需要通過(guò)監(jiān)視它們并根據(jù)負(fù)載變化調(diào)整服務(wù)器分配來(lái)管理它們,以實(shí)現(xiàn)負(fù)載平衡。這樣一個(gè)系統(tǒng)包括這些組件
.要管理的MySQL服務(wù)器集合
.與服務(wù)器通信并將它們組織成高可用性組的管理或管理應(yīng)用程序。組有不同的用途,每個(gè)組中的服務(wù)器可能有不同的分配。某個(gè)組內(nèi)的服務(wù)器的分配可以隨時(shí)更改
.訪問(wèn)服務(wù)器以檢索和更新數(shù)據(jù)的客戶機(jī)應(yīng)用程序,根據(jù)分配給它們的用途選擇服務(wù)器。例如,客戶端不應(yīng)該向只讀服務(wù)器發(fā)送更新

版本令牌允許根據(jù)分配對(duì)服務(wù)器訪問(wèn)進(jìn)行管理,而不需要客戶端重復(fù)查詢服務(wù)器的分配
.管理應(yīng)用程序執(zhí)行服務(wù)器分配并在每個(gè)服務(wù)器上建立版本令牌以反映其分配。應(yīng)用程序緩存此信息以提供對(duì)其的中央訪問(wèn)點(diǎn)。如果在某個(gè)時(shí)候管理應(yīng)用程序需要更改服務(wù)器分配(例如,將其從允許寫(xiě)改為僅允許讀),則它將更改服務(wù)器的版本令牌列表并更新其緩存。

.為了提高性能,客戶端應(yīng)用程序從管理應(yīng)用程序獲取緩存信息,使它們不必為每個(gè)語(yǔ)句檢索關(guān)于服務(wù)器分配的信息?;谒鼘l(fā)出的語(yǔ)句類型(例如,讀與寫(xiě)),客戶端選擇適當(dāng)?shù)姆?wù)器并連接到它

.此外,客戶端向服務(wù)器發(fā)送自己的客戶端特定版本的令牌來(lái)注冊(cè)它需要的服務(wù)器分配。對(duì)于客戶端發(fā)送到服務(wù)器的每個(gè)語(yǔ)句,服務(wù)器將自己的令牌列表與客戶端令牌列表進(jìn)行比較。如果服務(wù)器令牌列表包含客戶端令牌列表中所有具有相同值的令牌,則存在匹配,服務(wù)器執(zhí)行該語(yǔ)句
。

另一方面,可能管理應(yīng)用程序更改了服務(wù)器分配及其版本令牌列表。在這種情況下,新的服務(wù)器分配現(xiàn)在可能與客戶端需求不兼容。服務(wù)器和客戶端令牌列表之間的令牌不匹配,服務(wù)器返回一個(gè)錯(cuò)誤作為對(duì)語(yǔ)句的應(yīng)答。這指示客戶機(jī)從管理應(yīng)用程序緩存中刷新其版本令牌信息,并選擇要與之通信的新服務(wù)器。

檢測(cè)版本令牌錯(cuò)誤和選擇新服務(wù)器的客戶端邏輯可以通過(guò)不同的方式實(shí)現(xiàn):
.客戶端可以自己處理所有版本令牌注冊(cè)、不匹配檢測(cè)和連接切換
.這些操作的邏輯可以在管理客戶端和MySQL服務(wù)器之間連接的連接器中實(shí)現(xiàn)。這樣的連接器可以處理錯(cuò)配錯(cuò)誤檢測(cè)和語(yǔ)句重新發(fā)送本身,也可以將錯(cuò)誤傳遞給應(yīng)用程序,并將其留給應(yīng)用程序重新發(fā)送語(yǔ)句。

下面的例子以更具體的形式說(shuō)明了前面的討論。
當(dāng)版本令牌在給定服務(wù)器上初始化時(shí),服務(wù)器的版本令牌列表為空。通過(guò)調(diào)用用戶定義函數(shù)(udf)來(lái)執(zhí)行令牌列表維護(hù)。調(diào)用任何版本令牌udf都需要超級(jí)特權(quán),因此具有該特權(quán)的管理或管理應(yīng)用程序需要修改令牌列表。

假設(shè)一個(gè)管理應(yīng)用程序與一組服務(wù)器通信,客戶端查詢這些服務(wù)器以訪問(wèn)雇員和產(chǎn)品數(shù)據(jù)庫(kù)(分別名為emp和prod)。所有服務(wù)器都被允許處理數(shù)據(jù)檢索語(yǔ)句,但只有一部分服務(wù)器被允許進(jìn)行數(shù)據(jù)庫(kù)更新。為了在特定于數(shù)據(jù)庫(kù)的基礎(chǔ)上處理這個(gè)問(wèn)題,管理應(yīng)用程序在每個(gè)服務(wù)器上建立一個(gè)版本令牌列表。在給定服務(wù)器的令牌列表中,令牌名稱表示數(shù)據(jù)庫(kù)名稱,讀寫(xiě)令牌值取決于數(shù)據(jù)庫(kù)是否必須以只讀方式使用,或者是否可以進(jìn)行讀寫(xiě)。

客戶端應(yīng)用程序通過(guò)設(shè)置系統(tǒng)變量來(lái)注冊(cè)它們需要服務(wù)器匹配的版本令牌列表。變量設(shè)置是在客戶端特定的基礎(chǔ)上進(jìn)行的,因此不同的客戶端可以注冊(cè)不同的需求。默認(rèn)情況下,客戶端令牌列表是空的,它匹配任何服務(wù)器令牌列表。當(dāng)客戶端將其令牌列表設(shè)置為非空值時(shí),匹配可能成功也可能失敗,這取決于服務(wù)器版本令牌列表。

為了定義服務(wù)器的版本令牌列表,管理應(yīng)用程序調(diào)用version_token_set() UDF。(稍后將介紹用于修改和顯示令牌列表的udf。)例如,應(yīng)用程序可能將這些語(yǔ)句發(fā)送到三個(gè)服務(wù)器組成的組
服務(wù)器1:

mysql> SELECT version_tokens_set('emp=read;prod=read');
+------------------------------------------+
| version_tokens_set('emp=read;prod=read') |
+------------------------------------------+
| 2 version tokens set.                    |
+------------------------------------------+
1 row in set (0.03 sec)

服務(wù)器2:

mysql> SELECT version_tokens_set('emp=write;prod=read');
+-------------------------------------------+
| version_tokens_set('emp=write;prod=read') |
+-------------------------------------------+
| 2 version tokens set.                     |
+-------------------------------------------+
1 row in set (0.00 sec)

服務(wù)器3:

mysql> SELECT version_tokens_set('emp=read;prod=write');
+-------------------------------------------+
| version_tokens_set('emp=read;prod=write') |
+-------------------------------------------+
| 2 version tokens set.                     |
+-------------------------------------------+
1 row in set (0.00 sec)

在每種情況下,令牌列表都被指定為以分號(hào)分隔的名稱=值對(duì)列表。產(chǎn)生的令牌列表值導(dǎo)致這些服務(wù)器連接:
.任何服務(wù)器都會(huì)接受對(duì)兩個(gè)數(shù)據(jù)庫(kù)中的任意一個(gè)進(jìn)行讀取
.只有服務(wù)器2接受對(duì)emp數(shù)據(jù)庫(kù)的更新
.只有服務(wù)器3接受對(duì)prod數(shù)據(jù)庫(kù)的更新

除了為每個(gè)服務(wù)器分配一個(gè)版本令牌列表外,管理應(yīng)用程序還維護(hù)一個(gè)反映服務(wù)器分配的緩存。

在與服務(wù)器通信之前,客戶機(jī)應(yīng)用程序與管理應(yīng)用程序進(jìn)行聯(lián)系,并檢索關(guān)于服務(wù)器分配的信息。然后客戶端根據(jù)這些分配選擇服務(wù)器。假設(shè)客戶機(jī)希望同時(shí)執(zhí)行對(duì)emp數(shù)據(jù)庫(kù)的讀寫(xiě)操作。根據(jù)前面的分配,只有服務(wù)器2合格??蛻魴C(jī)連接到服務(wù)器2,并通過(guò)設(shè)置
version_tokens_session系統(tǒng)變量在服務(wù)器2上注冊(cè)服務(wù)器需求:

mysql> SET @@session.version_tokens_session = 'emp=write';
Query OK, 0 rows affected (0.00 sec)

對(duì)于客戶機(jī)發(fā)送到服務(wù)器2的后續(xù)語(yǔ)句,服務(wù)器將自己的版本令牌列表與客戶機(jī)列表進(jìn)行比較,以檢查它們是否匹配。如果是,則語(yǔ)句正常執(zhí)行:

mysql> UPDATE emp.employee SET salary = salary * 1.1 WHERE id = 4981;
Query OK, 1 row affected (0.07 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> SELECT last_name, first_name FROM emp.employee WHERE id = 4981;
+-----------+------------+
| last_name | first_name |
+-----------+------------+
| Smith | Abe |
+-----------+------------+
1 row in set (0.01 sec)

服務(wù)器和客戶端版本令牌列表之間的差異可能以兩種方式出現(xiàn):
.version_tokens_session值中的令牌名稱在服務(wù)器令牌列表中不存在。在這種情況下會(huì)發(fā)生ER_VTOKEN_PLUGIN_TOKEN_NOT_FOUND錯(cuò)誤
.version_tokens_session值中的令牌值與服務(wù)器令牌列表中相應(yīng)令牌的值不同。在這種情況下將出現(xiàn)ER_VTOKEN_PLUGIN_TOKEN_MISMATCH錯(cuò)誤

只要服務(wù)器2的分配沒(méi)有改變,客戶端就會(huì)繼續(xù)使用它進(jìn)行讀寫(xiě)。但是,假設(shè)管理應(yīng)用程序希望更改服務(wù)器分配,以便emp數(shù)據(jù)庫(kù)的寫(xiě)操作必須發(fā)送到服務(wù)器1而不是服務(wù)器2。為此,它使用version_tokens_edit()修改兩個(gè)服務(wù)器上的emp令牌值(并更新其服務(wù)器分配緩存):
服務(wù)器1:

mysql> SELECT version_tokens_edit('emp=write');
+----------------------------------+
| version_tokens_edit('emp=write') |
+----------------------------------+
| 1 version tokens updated.        |
+----------------------------------+
1 row in set (0.00 sec)

服務(wù)器2:

mysql> SELECT version_tokens_edit('emp=read');
+---------------------------------+
| version_tokens_edit('emp=read') |
+---------------------------------+
| 1 version tokens updated.       |
+---------------------------------+
1 row in set (0.00 sec)

version_tokens_edit()修改服務(wù)器令牌列表中的指定令牌而其它的令牌不會(huì)改變。

當(dāng)客戶機(jī)下一次向服務(wù)器2發(fā)送一條語(yǔ)句時(shí),它自己的令牌列表將不再與服務(wù)器令牌列表匹配,并出現(xiàn)一個(gè)錯(cuò)誤

mysql> UPDATE emp.employee SET salary = salary * 1.1 WHERE id = 4982;
ERROR 3136 (42000): Version token mismatch for emp. Correct value read

在這種情況下,客戶端應(yīng)該聯(lián)系管理應(yīng)用程序以獲得關(guān)于服務(wù)器分配的更新信息,選擇一個(gè)新服務(wù)器,并將失敗的語(yǔ)句發(fā)送到新服務(wù)器

注意:每個(gè)客戶端必須與版本令牌進(jìn)行協(xié)作,僅根據(jù)它在給定服務(wù)器上注冊(cè)的令牌列表發(fā)送語(yǔ)句。例如,如果客戶端注冊(cè)了一個(gè)'emp=read'的令牌列表,版本令牌中沒(méi)有任何內(nèi)容可以阻止客戶端發(fā)送emp數(shù)據(jù)庫(kù)的更新。客戶本身必須避免這樣做

對(duì)于從客戶機(jī)接收到的每個(gè)語(yǔ)句,服務(wù)器隱式地使用鎖,如下所示:
.為客戶端令牌列表(即version_tokens_session值)中命名的每個(gè)令牌獲取一個(gè)共享鎖
.執(zhí)行服務(wù)器和客戶端令牌列表之間的比較
.根據(jù)比較結(jié)果執(zhí)行語(yǔ)句或產(chǎn)生錯(cuò)誤
.釋放鎖

服務(wù)器使用共享鎖,以便可以在不阻塞的情況下對(duì)多個(gè)會(huì)話進(jìn)行比較,同時(shí)防止對(duì)任何試圖在操作服務(wù)器令牌列表中具有相同名稱的令牌之前獲取獨(dú)占鎖的會(huì)話的令牌進(jìn)行更改

前面的例子只使用了版本標(biāo)記插件庫(kù)中包含的一些用戶定義,但是還有其他的。一組udf允許對(duì)服務(wù)器的版本令牌列表進(jìn)行操作和檢查。另一組udf允許鎖定和解鎖版本標(biāo)記

這些udf允許創(chuàng)建、更改、刪除和檢查服務(wù)器的版本標(biāo)記列表:
.version_tokens_set()完全替換當(dāng)前列表并分配一個(gè)新列表。參數(shù)是一個(gè)以分號(hào)分隔的名稱=值對(duì)列表。
.version_tokens_edit()支持對(duì)當(dāng)前列表進(jìn)行部分修改。它可以添加新的令牌或更改現(xiàn)有令牌的值。參數(shù)是一個(gè)以分號(hào)分隔的名稱=值對(duì)列表
.version_tokens_delete()從當(dāng)前列表中刪除令牌。參數(shù)是一個(gè)用分號(hào)分隔的令牌名稱列表
.version_tokens_show()顯示當(dāng)前令牌列表。不需要任何論證

這些函數(shù)中的每一個(gè),如果成功,將返回一個(gè)指示操作發(fā)生的二進(jìn)制字符串。下面的示例建立服務(wù)器令牌列表,通過(guò)添加新令牌對(duì)其進(jìn)行修改,刪除一些令牌,并顯示生成的令牌列表:

mysql> SELECT version_tokens_set('tok1=a;tok2=b');
+-------------------------------------+
| version_tokens_set('tok1=a;tok2=b') |
+-------------------------------------+
| 2 version tokens set.               |
+-------------------------------------+
1 row in set (0.00 sec)
mysql> SELECT version_tokens_edit('tok3=c');
+-------------------------------+
| version_tokens_edit('tok3=c') |
+-------------------------------+
| 1 version tokens updated.     |
+-------------------------------+
1 row in set (0.00 sec)
mysql> SELECT version_tokens_delete('tok2;tok1');
+------------------------------------+
| version_tokens_delete('tok2;tok1') |
+------------------------------------+
| 2 version tokens deleted.          |
+------------------------------------+
1 row in set (0.00 sec)
mysql> SELECT version_tokens_show();
+-----------------------+
| version_tokens_show() |
+-----------------------+
| tok3=c;               |
+-----------------------+
1 row in set (0.00 sec)

如果令牌列表格式不正確,就會(huì)出現(xiàn)警告:

mysql> SELECT version_tokens_set('tok1=a; =c');
+----------------------------------+
| version_tokens_set('tok1=a; =c') |
+----------------------------------+
| 1 version tokens set.            |
+----------------------------------+
1 row in set, 1 warning (0.00 sec)
mysql> show warnings \G
*************************** 1. row ***************************
  Level: Warning
   Code: 42000
Message: Invalid version token pair encountered. The list provided is only partially updated.
1 row in set (0.00 sec)

如前所述,版本標(biāo)記是使用一個(gè)以分號(hào)分隔的名稱=值對(duì)列表來(lái)定義的??紤]一下version_tokens_set()的調(diào)用:

mysql> SELECT version_tokens_set('tok1=b;;; tok2= a = b ; tok1 = 1\'2 3"4');
+---------------------------------------------------------------+
| version_tokens_set('tok1=b;;; tok2= a = b ; tok1 = 1\'2 3"4') |
+---------------------------------------------------------------+
| 3 version tokens set.                                         |
+---------------------------------------------------------------+
1 row in set (0.00 sec)

版本標(biāo)記對(duì)參數(shù)的解釋如下:
.名稱和值周?chē)目瞻讓⒈缓雎?。允許在名稱和值中使用空格。(對(duì)于version_tokens_delete(),它接受一個(gè)沒(méi)有值的名稱列表,名稱周?chē)目瞻讓⒈缓雎浴?
.沒(méi)有報(bào)價(jià)機(jī)制
.令牌的順序并不重要,除非令牌列表包含給定令牌名稱的多個(gè)實(shí)例,否則最后一個(gè)值優(yōu)先于前面的值

根據(jù)這些規(guī)則,前面的version_tokens_set()調(diào)用會(huì)產(chǎn)生一個(gè)令牌列表,其中包含兩個(gè)令牌:tok1的值是1’2 3’4,tok2的值是a = b。

mysql> SELECT version_tokens_show();
+--------------------------+
| version_tokens_show()    |
+--------------------------+
| tok2=a = b;tok1=1'2 3"4; |
+--------------------------+
1 row in set (0.01 sec)

如果令牌列表包含兩個(gè)令牌,為什么version_tokens_set()返回設(shè)置的值3版本令牌?這是因?yàn)樵瓉?lái)的令牌列表包含兩個(gè)tok1定義,而第二個(gè)定義替換了第一個(gè)定義。

版本標(biāo)記令牌操作udf將這些約束放在令牌名稱和值上:
.令牌名稱不能包含=或;字符,最大長(zhǎng)度為64個(gè)字符
.令牌值不能包含;字符。值的長(zhǎng)度受到max_allowed_packet系統(tǒng)變量的值的限制
.版本令牌將令牌名稱和值視為二進(jìn)制字符串,因此比較是區(qū)分大小寫(xiě)的

版本令牌還包括一組udf,允許對(duì)令牌進(jìn)行鎖定和解鎖:
.version_tokens_lock_exclusive()獲得獨(dú)占的版本令牌鎖。它接受一個(gè)或多個(gè)鎖名和超時(shí)值的列表
.version_tokens_lock_shared()獲得共享版本令牌鎖。它接受一個(gè)或多個(gè)鎖名和超時(shí)值的列表
.version_tokens_unlock()釋放版本令牌鎖(獨(dú)占和共享)。不需要任何論證

每個(gè)鎖定函數(shù)都返回非零表示成功。否則,將發(fā)生錯(cuò)誤:

mysql> SELECT version_tokens_lock_shared('lock1', 'lock2', 0);
+-------------------------------------------------+
| version_tokens_lock_shared('lock1', 'lock2', 0) |
+-------------------------------------------------+
| 1 |
+-------------------------------------------------+
mysql> SELECT version_tokens_lock_shared(NULL, 0);
ERROR 3131 (42000): Incorrect locking service lock name '(null)'.

使用版本標(biāo)記鎖定功能的鎖定是建議的;申請(qǐng)必須同意合作。

可以鎖定不存在的令牌名稱。這不會(huì)創(chuàng)建令牌。

對(duì)于版本令牌鎖定函數(shù),令牌名稱參數(shù)完全按照指定的方式使用。周?chē)目瞻撞槐缓雎?,并?和;字符是允許的。這是因?yàn)榱钆浦皇窍駛鬟f
給鎖定服務(wù)一樣傳遞要鎖定的令牌名稱。

版本標(biāo)記引用

版本標(biāo)記功能
版本令牌插件庫(kù)包含幾個(gè)用戶定義的函數(shù)。一組udf允許對(duì)服務(wù)器的版本令牌列表進(jìn)行操作和檢查。另一組udf允許鎖定和解鎖版本標(biāo)記。調(diào)用任何版本令牌UDF都需要超級(jí)特權(quán)。

下面的udf允許創(chuàng)建、更改、刪除和檢查服務(wù)器的版本令牌列表:
.version_tokens_delete (name_list)
使用name_list參數(shù)從服務(wù)器的版本令牌列表中刪除令牌,并返回指示操作結(jié)果的二進(jìn)制字符串。name_list是要?jiǎng)h除的版本令牌名稱的分號(hào)分隔列表。

mysql> SELECT version_tokens_delete('tok1;tok3');
+------------------------------------+
| version_tokens_delete('tok1;tok3') |
+------------------------------------+
| 2 version tokens deleted.          |
+------------------------------------+
1 row in set (0.00 sec)

從MySQL 5.7.9開(kāi)始,NULL參數(shù)被視為空字符串,這對(duì)令牌列表沒(méi)有影響。
version_tokens_delete()刪除其參數(shù)中指定的標(biāo)記(如果它們存在的話)。(刪除不存在的令牌不是錯(cuò)誤。)要在不知道列表中有哪些令牌的情況下完全清除令牌列表,請(qǐng)將NULL或不包含令牌的字符串傳遞給version_tokens_set():

mysql> SELECT version_tokens_set(NULL);
+------------------------------+
| version_tokens_set(NULL)     |
+------------------------------+
| Version tokens list cleared. |
+------------------------------+
1 row in set (0.00 sec)
mysql> SELECT version_tokens_set('');
+------------------------------+
| version_tokens_set('')       |
+------------------------------+
| Version tokens list cleared. |
+------------------------------+
1 row in set (0.00 sec)

.version_tokens_edit (token_list)
使用token_list參數(shù)修改服務(wù)器的版本令牌列表,并返回指示操作結(jié)果的二進(jìn)制字符串。token_list是一個(gè)以分號(hào)分隔的名稱=值對(duì)列表,它指定要定義的每個(gè)令牌的名稱及其值。如果存在令牌,則使用給定的值更新其值。如果標(biāo)記不存在,則使用給定的值創(chuàng)建它。如果參數(shù)為NULL或字符串不包含令牌,則令牌列表保持不變。

mysql> SELECT version_tokens_set('tok1=value1;tok2=value2');
+-----------------------------------------------+
| version_tokens_set('tok1=value1;tok2=value2') |
+-----------------------------------------------+
| 2 version tokens set.                         |
+-----------------------------------------------+
1 row in set (0.00 sec)
mysql> SELECT version_tokens_edit('tok2=new_value2;tok3=new_value3');
+--------------------------------------------------------+
| version_tokens_edit('tok2=new_value2;tok3=new_value3') |
+--------------------------------------------------------+
| 2 version tokens updated.                              |
+--------------------------------------------------------+
1 row in set (0.00 sec)

.version_tokens_set (token_list)
用token_list參數(shù)中定義的令牌替換服務(wù)器的版本令牌列表,并返回指示操作結(jié)果的二進(jìn)制字符串。token_list是一個(gè)用分號(hào)分隔的名稱=值對(duì)列表,指定要定義的每個(gè)令牌的名稱及其值。如果參數(shù)為空或字符串不包含令牌,則清除令牌列表。

mysql> SELECT version_tokens_set('tok1=value1;tok2=value2');
+-----------------------------------------------+
| version_tokens_set('tok1=value1;tok2=value2') |
+-----------------------------------------------+
| 2 version tokens set.                         |
+-----------------------------------------------+
1 row in set (0.00 sec)

.version_tokens_show()
以二進(jìn)制字符串的形式返回服務(wù)器的版本標(biāo)記列表,其中包含一個(gè)以分號(hào)分隔的名稱=值對(duì)列表。

mysql> SELECT version_tokens_show();
+--------------------------+
| version_tokens_show()    |
+--------------------------+
| tok2=value2;tok1=value1; |
+--------------------------+
1 row in set (0.00 sec)

下面的udf允許鎖定和解鎖版本標(biāo)記:
.version_tokens_lock_exclusive (token_name [token_name]…超時(shí))
獲取一個(gè)或多個(gè)版本令牌(按名稱指定為字符串)上的獨(dú)占鎖,如果未在給定的超時(shí)值內(nèi)獲取鎖,則超時(shí)并報(bào)錯(cuò)

mysql> SELECT version_tokens_lock_exclusive('lock1', 'lock2', 10);
+-----------------------------------------------------+
| version_tokens_lock_exclusive('lock1', 'lock2', 10) |
+-----------------------------------------------------+
| 1 |
+-----------------------------------------------------+

這個(gè)函數(shù)是在MySQL 5.7.8中添加的,名為vtoken_get_write_locks(),在5.7.9中重命名為version_tokens_lock_exclusive()

.version_tokens_lock_shared (token_name [token_name]…超時(shí))
獲取一個(gè)或多個(gè)版本令牌(按名稱指定為字符串)上的共享鎖,如果未在給定的超時(shí)值內(nèi)獲取鎖,則超時(shí)并報(bào)錯(cuò)

mysql> SELECT version_tokens_lock_shared('lock1', 'lock2', 10);
+--------------------------------------------------+
| version_tokens_lock_shared('lock1', 'lock2', 10) |
+--------------------------------------------------+
| 1 |
+--------------------------------------------------+

這個(gè)函數(shù)是在MySQL 5.7.8中添加的,名為vtoken_get_read_locks(),在5.7.9中重命名為version_tokens_lock_shared()

.version_tokens_unlock ()
使用version_tokens_lock_exclusive()和version_tokens_lock_shared()釋放在當(dāng)前會(huì)話中獲取的所有鎖。

mysql> SELECT version_tokens_unlock();
+-------------------------+
| version_tokens_unlock() |
+-------------------------+
| 1 |
+-------------------------+

這個(gè)函數(shù)是在MySQL 5.7.8中添加的,名為vtoken_release_locks(),在5.7.9中重命名為version_tokens_unlock()。

鎖定功能共享這些特性:
.對(duì)于成功,返回值為非零。否則,將發(fā)生錯(cuò)誤
.令牌名稱是字符串
.與操作服務(wù)器令牌列表的udf的參數(shù)處理不同,令牌名稱參數(shù)周?chē)目瞻撞粫?huì)被忽略,并且=和;字符是允許的
.可以鎖定不存在的令牌名稱。這不會(huì)創(chuàng)建令牌
.超時(shí)值是非負(fù)整數(shù),表示在出現(xiàn)錯(cuò)誤超時(shí)之前等待獲取鎖所需的時(shí)間(以秒為單位)。如果超時(shí)為0,則不存在等待,如果不能立即獲取鎖,則該函數(shù)將產(chǎn)生一個(gè)錯(cuò)誤
.版本令牌鎖定功能基于所描述的鎖定服務(wù)在Section 28.3.1 鎖服務(wù)中描述。

版本令牌系統(tǒng)變量
版本標(biāo)記支持以下系統(tǒng)變量。這些變量不可用,除非安裝版本令牌插件

系統(tǒng)變量:
.version_tokens_session
命令行格式:--version-tokens-session=value
變量范圍:Global,Session
動(dòng)態(tài):Yes
允許的值:類型為字符串,默認(rèn)值為NULL
此變量的會(huì)話值指定客戶端版本令牌列表,并指示客戶端會(huì)話要求服務(wù)器版本令牌列表具有的令牌。

如果version_tokens_session變量為NULL(默認(rèn)值)或值為空,則任何服務(wù)器版本令牌列表都是匹配的。(實(shí)際上,空值會(huì)禁用匹配需求。)

如果version_tokens_session變量有一個(gè)非空值,那么它的值與服務(wù)器版本令牌列表之間的任何不匹配都會(huì)導(dǎo)致會(huì)話發(fā)送給服務(wù)器的任何語(yǔ)句出錯(cuò)。在這種情況下會(huì)發(fā)生失配:
.version_tokens_session值中的令牌名稱在服務(wù)器令牌列表中不存在。在本例中,發(fā)生了ER_VTOKEN_PLUGIN_TOKEN_NOT_FOUND錯(cuò)誤
.version_tokens_session值中的令牌值與服務(wù)器令牌列表中相應(yīng)令牌的值不同。在本例中,將出現(xiàn)ER_VTOKEN_PLUGIN_TOKEN_MISMATCH錯(cuò)誤

服務(wù)器版本令牌列表中包含沒(méi)有在version_tokens_session值中命名的令牌不是不匹配的

假設(shè)一個(gè)管理應(yīng)用程序?qū)⒎?wù)器令牌列表設(shè)置為如下所示:

mysql> SELECT version_tokens_set('tok1=a;tok2=b;tok3=c');
+--------------------------------------------+
| version_tokens_set('tok1=a;tok2=b;tok3=c') |
+--------------------------------------------+
| 3 version tokens set. |
+--------------------------------------------+

客戶端通過(guò)設(shè)置其version_tokens_session值來(lái)注冊(cè)它需要服務(wù)器匹配的令牌。然后,對(duì)于客戶端發(fā)送的每個(gè)后續(xù)語(yǔ)句,服務(wù)器將根據(jù)客戶
端version_tokens_session值檢查其令牌列表,如果存在不匹配,則產(chǎn)生一個(gè)錯(cuò)誤:

mysql> SET @@session.version_tokens_session = 'tok1=a;tok2=b';
mysql> SELECT 1;
+---+
| 1 |
+---+
| 1 |
+---+
mysql> SET @@session.version_tokens_session = 'tok1=b';
mysql> SELECT 1;
ERROR 3136 (42000): Version token mismatch for tok1. Correct value a

第一個(gè)選擇成功是因?yàn)榭蛻舳肆钆苩ok1和tok2出現(xiàn)在服務(wù)器令牌列表中,并且每個(gè)令牌在服務(wù)器列表中具有相同的值。第二個(gè)SELECT失敗是因?yàn)?,雖然tok1出現(xiàn)在服務(wù)器令牌列表中,但它的值與客戶機(jī)指定的值不同

此時(shí),客戶端發(fā)送的任何語(yǔ)句都將失敗,除非服務(wù)器令牌列表發(fā)生更改,使其再次匹配。假設(shè)管理應(yīng)用程序按如下方式更改服務(wù)器令牌列表:

mysql> SELECT version_tokens_edit('tok1=b');
+-------------------------------+
| version_tokens_edit('tok1=b') |
+-------------------------------+
| 1 version tokens updated. |
+-------------------------------+
mysql> SELECT version_tokens_show();
+-----------------------+
| version_tokens_show() |
+-----------------------+
| tok3=c;tok1=b;tok2=b; |
+-----------------------+

現(xiàn)在,客戶機(jī)version_tokens_session值與服務(wù)器令牌列表匹配,客戶機(jī)可以再次成功執(zhí)行語(yǔ)句:

mysql> SELECT 1;
+---+
| 1 |
+---+
| 1 |
+---+

這個(gè)變量是在MySQL 5.7.8中添加的
.version_tokens_session_number
命令行格式:--version-tokens-session-number=N
變量范圍:Global,Session
動(dòng)態(tài):NO
允許的值:類型為整型,默認(rèn)值為0
此變量供內(nèi)部使用。
這個(gè)變量是在MySQL 5.7.8中添加的。


網(wǎng)站標(biāo)題:MySQLVersionTokens
網(wǎng)站路徑:http://weahome.cn/article/jpcpjc.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部