計算節點特色功能
線上修改分片欄位
支援在服務埠直接使用SQL語句進行線上修改分片欄位的操作,業務表在變更期間不會鎖表,業務可對原表進行正常的SIUD操作。
使用方法
alter修改分片欄位語法如下:
alter table table_name change shard column new_column;
例如將源表sbtest1分片欄位id修改為k,執行:
mysql> alter table sbtest1 change shard column k;
Query OK, 0 rows affected (2 min 2.27 sec)
使用限制
- 源表必須具有主鍵或者唯一鍵,且表名長度不能超過45個字元;
- 源表上不能有觸發器,或源表不能被其他觸發器關聯;
- 源表不能有外來鍵約束;
- 新的分片欄位必須是表結構包含的欄位,且不能是表當前正在使用的分片欄位;
- 新的分片欄位資料型別不能是BIT、TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXT、TINYBLOB、BLOB、MEDIUMBLOB、LONGBLOB、GEOMETRY、POINT、LINESTRING、POLYGON、MULTIPOINT、MULTILINESTRING、MULTIPOLYGON、GEOMETRYCOLLECTION、JSON;
- 不支援全域性表、垂直分片表、父表、子表,僅支援對水平分片表使用alter修改分片欄位;
- 水平分片表中,不支援RANGE、MATCH、ROUTE分片規則的源表進行alter修改分片欄位;
- 進行alter修改分片欄位時,源表不能有正在進行的分片方案變更任務;
- 若源表出現主備資料不一致情況,使用alter修改分片欄位時會直接跳過檢測依舊執行(建議執行前人工透過管理平臺進行主備資料一致性檢測);
- 源表開啟全域性唯一約束後,使用alter修改分片欄位時要求源表唯一約束欄位的歷史資料必須唯一;
偽mysql庫的user表
支援在服務埠直接使用SQL語句進行線上查詢mysql系統庫裡的user表資料。偽mysql庫的意思是:計算節點在安裝後,並不會自動建立一個名為 mysql 的資料庫,同時也不允許手動建立mysql庫,但是此mysql庫是隱式存在的,庫中主要儲存的有使用者許可權表,其中user表用來記錄允許連線到計算節點的賬號資訊。
注意
在 user 表裡顯示的所有許可權都是全域性級的,適用於所有資料庫。user表資料不允許手動修改,僅可以透過mysql.user的方式進行查詢。
user表的欄位資訊說明如下:
欄位名 | 說明 |
---|---|
host | 顯示在管理平臺介面上配置的資料庫使用者對應的主機名 |
user | 顯示在管理平臺介面上配置的資料庫使用者名稱 |
authentication_string | 顯示在管理平臺介面上配置的資料庫使用者的主密碼 |
select_priv | 顯示此資料庫使用者是否擁有全域性SELECT命令查詢操作的許可權,與資料庫使用者配置的全域性許可權有關 |
insert_priv | 顯示此資料庫使用者是否擁有全域性INSERT命令插入資料操作的許可權,與資料庫使用者配置的全域性許可權有關 |
update_priv | 顯示此資料庫使用者是否擁有全域性UPDATE命令修改現有資料操作的許可權,與資料庫使用者配置的全域性許可權有關 |
delete_priv | 顯示此資料庫使用者是否擁有全域性DELETE命令刪除現有資料操作的許可權,與資料庫使用者配置的全域性許可權有關 |
create_priv | 顯示此資料庫使用者是否擁有全域性CREATE命令建立新的資料庫或表操作的許可權,與資料庫使用者配置的全域性許可權有關 |
drop_priv | 顯示此資料庫使用者是否擁有全域性DELETE命令刪除現有資料庫或表操作的許可權,與資料庫使用者配置的全域性許可權有關 |
reload_priv | 同super_priv |
shutdown_priv | 固定值為N |
process_priv | 固定值為N |
file_priv | 顯示此資料庫使用者是否擁有全域性FILE命令操作的許可權,與資料庫使用者配置的全域性許可權有關 |
grant_priv | 同super_priv |
references_priv | 同create_priv |
index_priv | 同create_priv |
alter_priv | 顯示此資料庫使用者是否擁有全域性ALTER命令重新命名和修改表結構操作的許可權,與資料庫使用者配置的全域性許可權有關 |
show_db_priv | 固定值為Y |
super_priv | 顯示此資料庫使用者是否擁管理端訪問及操作的許可權,與資料庫使用者配置的全域性許可權有關 |
create_tmp_table_priv | 固定值為N |
lock_tables_priv | 固定值為N |
execute_priv | 固定值為Y |
repl_slave_priv | 固定值為N |
repl_client_priv | 固定值為N |
create_view_priv | 本同create_priv |
show_view_priv | 固定值為Y |
create_routine_priv | 同create_priv |
alter_routine_priv | 同alter_priv |
create_user_priv | 同super_priv |
event_priv | 固定值為N |
trigger_priv | 同create_priv |
create_tablespace_priv | 固定值為N |
ssl_type | 固定值為空 |
ssl_cipher | 固定值為空 |
x509_issuer | 固定值為空 |
x509_subject | 固定值為空 |
max_questions | 固定值為0 |
max_updates | 固定值為0 |
max_connections | 與計算節點引數中maxConnections欄位值保持一致,此值為全域性值,表示為前端最大連線數。 |
max_user_connections | 顯示配置的使用者最大連線數 |
plugin | 固定值為mysql_native_password |
password_expired | 固定值為N |
password_last_changed | 與計算節點的配置庫中hotdb_user表中的update_time欄位值保持一致,為密碼修改的最近的一次時間 |
password_lifetime | 固定值為NULL |
account_locked | 會根據使用者是否被鎖定來進行顯示(Y鎖定,N未鎖定) |
create_role_priv | 固定值為N,僅儲存節點8.0以上版本顯示。 |
drop_role_priv | 固定值為N,僅儲存節點8.0以上版本顯示。 |
password_reuse_history | 固定值為NULL,僅儲存節點8.0以上版本顯示。 |
password_reuse_time | 固定值為NULL,僅儲存節點8.0以上版本顯示。 |
password_reuse_current | 固定值為NULL,僅儲存節點8.0以上版本顯示。 |
user_attributes | 固定值為NULL,僅儲存節點8.0以上版本顯示。 |
查詢mysql.user表資料,執行示例如下:
root@127.0.0.1:hotdb 5.7.25 06:44:26> select * from mysql.user\G
*************************** 1. row ***************************
HOST: %
USER: root
SELECT_PRIV: Y
INSERT_PRIV: Y
UPDATE_PRIV: Y
DELETE_PRIV: Y
CREATE_PRIV: Y
DROP_PRIV: Y
RELOAD_PRIV: Y
SHUTDOWN_PRIV: N
PROCESS_PRIV: N
FILE_PRIV: Y
GRANT_PRIV: Y
REFERENCES_PRIV: Y
INDEX_PRIV: Y
ALTER_PRIV: Y
SHOW_DB_PRIV: Y
SUPER_PRIV: Y
CREATE_TMP_TABLE_PRIV: N
LOCK_TABLES_PRIV: N
EXECUTE_PRIV: Y
REPL_SLAVE_PRIV: N
REPL_CLIENT_PRIV: N
CREATE_VIEW_PRIV: Y
SHOW_VIEW_PRIV: Y
CREATE_ROUTINE_PRIV: Y
ALTER_ROUTINE_PRIV: Y
CREATE_USER_PRIV: Y
EVENT_PRIV: N
TRIGGER_PRIV: Y
CREATE_TABLESPACE_PRIV: N
SSL_TYPE:
SSL_CIPHER:
X509_ISSUER:
X509_SUBJECT:
MAX_QUESTIONS: 0
MAX_UPDATES: 0
MAX_CONNECTIONS: 5000
MAX_USER_CONNECTIONS: 0
PLUGIN: mysql_native_password
AUTHENTICATION_STRING: *7453ab8f069c2d2bafa64669db5771059e3fc946
PASSWORD_EXPIRED: N
PASSWORD_LAST_CHANGED: 2022-12-12 00:00:00
PASSWORD_LIFETIME: NULL
ACCOUNT_LOCKED: N
CREATE_ROLE_PRIV: N
DROP_ROLE_PRIV: N
PASSWORD_REUSE_HISTORY: NULL
PASSWORD_REUSE_TIME: NULL
PASSWORD_REQUIRE_CURRENT: NULL
USER_ATTRIBUTES: NULL
1 row in set (0.00 sec)
DBLINK
支援DBLINK功能,可與MySQL、Oracle或其他流行資料庫建立通訊連線,執行跨不同型別的資料庫的查詢等操作。此外還可使用DBLINK功能讀取外部檔案資料。
建立DBLINK
1.建立DBLINK語法
建立外部資料庫連線
CREATE [PUBLIC] DATABASE LINK link_name
CONNECT TO remote_username IDENTIFIED BY 'remote_password'
USING 'jdbcurl'
WITH 'driver=oracle.jdbc.driver.OracleDriver;jar=ojdbc8.jar,ucp.jar;';
建立外部檔案連線
CREATE [PUBLIC] DATABASE LINK link_name
USING 'file'
WITH 'format=csv;location=/data/csv_data';
2.語法說明
該語句的作用是建立一個資料庫連結,允許當前資料庫與另一個遠端資料庫或外部檔案建立連線,並使用給定的使用者名稱、密碼和JDBC連線等資訊。目前針對外部資料庫,計算節點支援與MySQL、Oracle或其他流行資料庫建立通訊連線。
建立外部資料庫連線語法說明如下:
-
[PUBLIC]:選填;填寫代表公有,意思為所有使用者均可直接使用此DBLINK;未填寫代表私有,表示僅當前使用者可使用;
-
remote_username:遠端連線的資料庫使用者名稱;
-
remote_password:遠端連線的資料庫使用者名稱對應的密碼;
-
jdbcurl:連線資料庫的JDBC連線串,使用提供的JDBC URL來確定如何連線到遠端資料庫;
- Oracle如下:jdbc:oracle:thin:@//
: / - MySQL生態類的庫如下:jdbc:mysql://
: /
- Oracle如下:jdbc:oracle:thin:@//
-
WITH後指定了連線所需的驅動程式資訊和相關選項。不填寫,則預設使用MySQL的JDBC驅動,驅動預設識別到當前主計算節點伺服器的hotdb-server/lib路徑下;
注意
由於不同版本的Oracle有不同的jar包,因此使用者需要自己上傳jar包至/lib路徑下,也就意味著使用Oracle的DBLINK必須填寫WITH語句。
建立外部檔案連線語法說明如下:
USING 'file':區別於USING 'jdbcurl',此處為固定格式,無需修改引數,表示使用外部檔案;
WITH format:指定連線的檔案格式,目前僅支援CSV。CSV檔案需要在首行標明列名和資料型別。
注意
A.支援的資料型別:string、boolean、byte、char、short、int、long、float、double、date、timestamp、time、decimal(a,b)。若不指定資料型別,預設為string。
B.日期型別資料需以短橫線-為分隔符,如:2023-08-23
C.decimal型別的欄位需加雙引號“”,如:“b:decimal(5,2)”
CSV示例:
DEPTNO:int,NAME:string
10,"Sales"
20,"Marketing"
30,"Accounts"
- location:填寫檔案存放目錄路徑,查詢時會去搜尋對應目錄下存放的CSV檔案進行讀取。主備或叢集模式下,各個計算節點均需要建立相同的目錄,並且分別放一份檔案。
3.語法示例
MySQL> CREATE DATABASE LINK linkname1 CONNECT TO test IDENTIFIED BY 'test' USING 'jdbc:oracle:thin:@//192.168.240.66:1521/pdb01' WITH 'driver=oracle.jdbc.driver.OracleDriver;jar=ojdbc8.jar,ucp.jar;';
-- 建立名為linkname1的DBLINK,透過使用者test連線Oracle資料庫。
MySQL> CREATE PUBLIC DATABASE LINK public_linkname1 CONNECT TO test IDENTIFIED BY 'test' USING 'jdbc:oracle:thin:@//192.168.240.66:1521/pdb01' WITH 'driver=oracle.jdbc.driver.OracleDriver;jar=ojdbc8.jar,ucp.jar;';
-- 建立名為public_linkname1的PUBLIC DBLINK,透過使用者test連線Oracle資料庫。
MySQL> CREATE DATABASE LINK linkname2 CONNECT TO test IDENTIFIED BY 'test' USING 'jdbc:mysql://192.168.240.66:3323/hotdb';
-- 建立名為linkname2的DBLINK,透過使用者test連線MySQL的hotdb資料庫。
MySQL> CREATE PUBLIC DATABASE LINK public_linkname2 CONNECT TO test IDENTIFIED BY 'test' USING 'jdbc:mysql://192.168.240.66:3323/hotdb';
-- 建立名為public_linkname2的PUBLIC DBLINK,透過使用者test連線MySQL的hotdb資料庫。
4.注意事項
- DBLINK與使用者繫結,因此可以在不指定當前邏輯庫(use database)的情況下建立DBLINK;
- 使用CREATE DATABASE LINK語句需要有全域性的CREATE許可權,否則報許可權不足提醒:
ERROR: [CREATE] command denied to user '<資料庫使用者>' to database link '<dblink名>'
- 私有DBLINK與公有PUBLIC DBLINK的link_name可以重複,互不影響;但是同種型別的DBLINK不可重名,否則報錯:
ERROR: duplicate database link name
- 允許使用相同的連線字串(JDBC URL)來建立多個公有或私有的資料庫連線(DBLINK),從而在不同的環境中實現不同的訪問需求。
- 在建立DBLINK時,若填寫了[WITH]語句指定驅動,則系統會校驗該驅動是否存在,填寫錯誤或者不存在均報如下錯誤: ERROR: driver '<填寫的driver>' does not exist。
使用DBLIK
外部資料庫DBLINK操作
1.使用DBLINK語法 支援透過SQL語句來使用DBLINK對遠端資料庫的表進行操作,DBLINK的語法格式如下:
<表名>@link_name
2.語法示例
- 查詢資料:
MySQL> SELECT * FROM table1@linkname1;
-- 向linkname1內的表table1查詢資料;
MySQL> SELECT * FROM "TestA"@linkname2;
-- 向linkname2內的表“TestA”(大小寫敏感的表名)查詢資料;
MySQL> SELECT * FROM table0 join table1@linkname1 on join_condition;
-- 查詢table0與linkname1內的表table1的join關聯,根據一定的join條件進行查詢;
- 插入資料:
MySQL> INSERT INTO table1@linkname2 values(aaa,bbb,ccc);
-- 向linkname2內的表table1插入資料:
- 更新資料:
MySQL> UPDATE table1@linkname2 set xxx=yyy where aaa=bbb;
-- 向linkname2內的表table1更新資料:
- 刪除資料:
MySQL> DELETE * from table1@linkname2 where xxx=yyy;
-- 向linkname2內的表table1刪除資料:
3.注意事項
使用DBLINK無法訪問或者JDBC URL填寫錯誤,則報錯無法解析指定的JDBC連線:
ERROR: could not resolve the JDBC connect specified
- 透過DML語句(僅限於SELECT、INSERT、UPDATE、DETELE)使用DBLINK操作遠端資料庫時,若存在同名的私有DBLINK和公有PUBLIC DBLINK,遵循私有優先於公有的原則。
- 在使用Oracle的DBLINK時,需要開啟Oracle語法解析。此外,查詢Oracle內的表時,對於需要區分大小寫的表,需要在表名上加雙引號;若不加雙引號,均預設以大寫進行儲存和匹配。
- 使用者需要對當前邏輯庫具備某種許可權,即可在DBLINK/PUBLIC DBLINK中使用相應的許可權。例如:
資料庫使用者A :僅擁有邏輯庫a的SELECT許可權,沒有全域性的SELECT許可權:
允許的操作:可以在邏輯庫a內使用dblink的select語句,也可以使用public dblink的select語句。
不允許的操作:無法使用除了SELECT以外其他許可權語句,也無法在其他邏輯庫內使用dblink。
資料庫使用者B :僅有全域性的SELECT許可權: 允許的操作:可以在任何邏輯庫內使用dblink的select語句,也可以使用public
dblink的select語句。 不允許的操作:無法使用除了SELECT以外其他許可權語句。
外部檔案資料DBLINK操作
當使用DBLINK與外部檔案建立連結時,計算節點支援對外部檔案資料的查詢,支援與內部表關聯查詢,支援更新與刪除內部表join外部檔案,此時外部檔案資料僅作為SQL語句的執行條件。外部檔案DBLINK的語法格式如下:
<檔名>@link_name
-- <檔名>:填寫存放在計算節點對應目錄下,需要執行操作的CSV檔名;
-- link_name:填寫建立DBLINK時配置的link_name;
-- 執行操作時,會去對應DBLINK配置的路徑下尋找該檔名對應的檔案;
1.支援使用SELECT查詢語句,支援內部表關聯查詢
示例:
SELECT * FROM file1@linkname1;
-- 查詢名為linkname1的DBLINK連結下的file1檔案資料
SELECT * FROM table0 JOIN file1@linkname1 on join_condition;
-- 從內部表table0和名為linkname1的DBLINK連線的外部檔案file1中,根據特定的JOIN關聯條件執行聯接查詢
SELECT * FROM table0 WHERE id in (select id from file1@linkname1);
-- 查詢內部表table0中與DBLINK外部檔案file1中id欄位匹配的所有資料
SELECT * FROM file1@linkname1 WHERE id in (select id from table0);
-- 查詢DBLINK外部檔案file1資料中與內部表table0中id欄位匹配的所有資料
注意
查詢時,系統會自動搜尋搭建DBLINK時配置的檔案路徑,去該目錄下搜尋對應檔案。檔案需存放在所有計算節點的相同路徑下。
2.支援使用INSERT 插入語句,從外部檔案中選擇資料並將其插入到內部表
示例:
INSERT INTO table0 SELECT * FROM file1@linkname1;
-- INSERT INTO table0:表示要將資料插入到名為“table0”的內部表中
-- SELECT * FROM file1@linkname1:表示要從位於DBLINK連結“linkname1”的外部檔案“file1”中選擇所有資料。
-- 透過這個語句,將檔案“file1”中的資料插入到表“table0”中
注意
需要確保連結“linkname1”是正確配置的,並且資料結構與型別等方面是匹配的。
4/支援使用UPDATE修改內部表JOIN外部檔案,此時外部檔案僅作為條件
示例:
UPDATE table0 JOIN file1@linkname1 on join_condition set table0.xxx=file1@linkname1.xxx WHERE file1@linkname1.id=1;
-- 透過連線條件,將內部表table0中與外部檔案file1透過名為linkname1的DBLINK連線的資料進行修改;
-- 將內部表table0的欄位xxx更新為外部檔案file1中id為1的記錄對應的欄位xxx的值
修改DBLINK
1.修改DBLINK語法
修改外部資料庫DBLINK
ALTER [PUBLIC] DATABASE LINK link_name
CONNECT TO remote_username IDENTIFIED BY 'remote_password'
USING 'jdbcurl'
[ WITH 'driver=oracle.jdbc.driver.OracleDriver;jar=ojdbc8.jar,ucp.jar;' ];
修改外部檔案DBLINK
ALTER [PUBLIC] DATABASE LINK link_name
USING 'file'
WITH 'format=csv;location=/data/csv_data';
2.語法說明 該語句中的引數與CREATE DATABASE LINK邏輯一致,其作用是修改一個已存在的資料庫連結的連線資訊,變更其遠端資料庫連線的使用者名稱、密碼、連線字串。或修改一個已存在的外部檔案資料DBLINK的連線資訊,變更需要建立連結的檔案路徑。
3.語法示例
MySQL> ALTER DATABASE LINK linkname1 CONNECT TO test IDENTIFIED BY 'test' USING 'jdbc:oracle:thin:@//192.168.240.66:1521/pdb01' WITH 'driver=oracle.jdbc.driver.OracleDriver;jar=ojdbc8.jar,ucp.jar;';
-- 修改名為linkname1的DBLINK(Oracle),更新remote_username、remote_password、jdbcurl、driver的資訊。
MySQL> ALTER PUBLIC DATABASE LINK public_linkname1 CONNECT TO test IDENTIFIED BY 'test' USING 'jdbc:oracle:thin:@//192.168.240.66:1521/pdb01' WITH 'driver=oracle.jdbc.driver.OracleDriver;jar=ojdbc8.jar,ucp.jar;';
-- 修改名為public_linkname1的PUBLIC DBLINK(Oracle),更新remote_username、remote_password、jdbcurl、driver的資訊。
MySQL> ALTER DATABASE LINK linkname2 CONNECT TO test IDENTIFIED BY 'test' USING 'jdbc:mysql://192.168.240.66:3323/hotdb';
-- 修改名為linkname2的DBLINK(MySQL),更新remote_username、remote_password、jdbcurl的資訊。
MySQL> ALTER PUBLIC DATABASE LINK linkname2 CONNECT TO test IDENTIFIED BY 'test' USING 'jdbc:mysql://192.168.240.66:3323/hotdb';
-- 修改名為public_linkname2的PUBLIC DBLINK(MySQL),更新remote_username、remote_password、jdbcurl的資訊。
4.注意事項
- 使用ALTER DATABASE LINK語句需要有全域性的ALTER許可權,否則報許可權不足提醒:
ERROR: [ALTER] command denied to user '<資料庫使用者>' to database link '<dblink名>'
- DBLINK在建立後,無法修改DBLINK名;需要透過刪除再新建去完成。
刪除DBLINK
1.刪除DBLINK語法
DROP [PUBLIC] DATABASE LINK link_name;
2.語法說明
該語句用於刪除一個已存在的資料庫連結。
3.語法示例
MySQL> DROP DBLINK linkname1;
-- 刪除名為linkname1的DBLINK。
MySQL> DROP PUBLIC DBLINK linkname1;
-- 刪除名為linkname1的PUBLIC DBLINK。
4.注意事項
使用DROP DATABASE LINK語句需要有全域性的DROP許可權,否則報許可權不足提醒:
ERROR: [DROP] command denied to user '<資料庫使用者>' to database link '<dblink名>'
SHOW DBLINKS查詢
使用者可以使用SHOW DBLINKS語句查詢已建立的DBLIINK。
1.欄位說明
- DBLINK:DBLINK的名稱。建立DBLINK時使用者定義的link_name;
- OWNER:展示DBLINK的所有者屬性。若為公有DBLINK,則顯示- PUBLIC;若為私有DBLINK,則顯示DBLINK所屬的資料庫使用者,即建立該連結的資料庫使用者;
- CREATOR:建立該連結的資料庫使用者;
- JDBC_URL:DBLINK對應的JDBC連線的URL;若為外部檔案連結,則顯示file;
- REMOTE_USER:DBLINK對應的遠端連線資料庫使用者名稱;
- REMOTE_PASS:DBLINK對應的遠端連線資料庫使用者密碼;
- ARGUMENTS:展示建立DBLINK時填寫的WITH後的驅動資訊或檔案格式與路徑資訊;
- UPDATE_TIME:更新時間。
2.注意事項
SHOW DBLINKS語句展示當前資料庫使用者下的所有私有DBLINK資訊,及所有公有的PUBLIC DBLINK資訊。若當前資料庫使用者擁有SUPER許可權,則展示所有資料庫使用者下的所有公私有DBLINK資訊。