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)!