自学内容网 自学内容网

hhdb数据库介绍(9-11)

计算节点特色功能

在线修改分片字段

支持在服务端口直接使用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://:/
  • 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信息。


原文地址:https://blog.csdn.net/m0_61228937/article/details/143717387

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!