hhdb資料庫介紹(9-12)

恒辉信达發表於2024-11-28

計算節點特色功能

線上修改分片欄位

支援在服務埠直接使用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功能讀取外部檔案資料。

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://:/
  • 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的值

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名;需要透過刪除再新建去完成。

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資訊。

相關文章