实战教程第三章3.5:如何使用 MySQL 租户做常见数据库开发
用户管理
这里用户指租户里的用户,跟传统 MySQL 里的用户概念一样。 OceanBase MySQL 租户创建用户有两个方法:
create user创建用户。grant语句自动创建用户。
示例:
MySQL [oceanbase]> create user user01 identified by 'zfkrcOl5MG'; Query OK, 0 rows affected (0.024 sec) MySQL [oceanbase]> grant all privileges on test.* to user01 ; Query OK, 0 rows affected (0.013 sec) MySQL [oceanbase]> grant all privileges on test.* to user02 identified by 'dQuybvRxM8'; Query OK, 0 rows affected (0.028 sec)
OceanBase MySQL 租户不支持更新用户元数据的密码字段。
查看用户权限用语句 show grants 。
示例:
MySQL [oceanbase]> show grants for user01; +----------------------------------------------+ | Grants for user01@% | +----------------------------------------------+ | GRANT USAGE ON *.* TO 'user01' | | GRANT ALL PRIVILEGES ON `test`.* TO 'user01' | +----------------------------------------------+ 2 rows in set (0.001 sec) MySQL [oceanbase]> show grants for user02; +----------------------------------------------+ | Grants for user02@% | +----------------------------------------------+ | GRANT USAGE ON *.* TO 'user02' | | GRANT ALL PRIVILEGES ON `test`.* TO 'user02' | +----------------------------------------------+ 2 rows in set (0.001 sec)
数据库管理
OceanBase MySQL 租户下可以建多个数据库(database),表只能在具体的数据库下新建。
示例:
MySQL [test]> create database tpccdb;
Query OK, 1 row affected (0.012 sec)
MySQL [test]> show databases;
+--------------------+
| Database |
+--------------------+
| oceanbase |
| information_schema |
| mysql |
| test |
| tpccdb |
+--------------------+
5 rows in set (0.002 sec)
create table ware(w_id int
, w_ytd decimal(12,2)
, w_tax decimal(4,4)
, w_name varchar(10)
, w_street_1 varchar(20)
, w_street_2 varchar(20)
, w_city varchar(20)
, w_state char(2)
, w_zip char(9)
, unique(w_name, w_city)
, primary key(w_id)
);
create table cust (c_w_id int NOT NULL
, c_d_id int NOT null
, c_id int NOT null
, c_discount decimal(4, 4)
, c_credit char(2)
, c_last varchar(16)
, c_first varchar(16)
, c_middle char(2)
, c_balance decimal(12, 2)
, c_ytd_payment decimal(12, 2)
, c_payment_cnt int
, c_credit_lim decimal(12, 2)
, c_street_1 varchar(20)
, c_street_2 varchar(20)
, c_city varchar(20)
, c_state char(2)
, c_zip char(9)
, c_phone char(16)
, c_since date
, c_delivery_cnt int
, c_data varchar(500)
, index icust(c_last, c_d_id, c_w_id, c_first, c_id)
, FOREIGN KEY (c_w_id) REFERENCES ware(w_id)
, primary key (c_w_id, c_d_id, c_id)
);
OceanBase MySQL 租户支持外键。不过在分布式数据库里,如果读写并发很高,不推荐在数据库层面使用外键约束。外键可能会给性能带来负面影响,会增加不必要的阻塞和死锁。
复制表的结构用 like ,包括主键、唯一键、索引名称都会复制。在 MySQL 语法里,主键名\唯一约束\索引名在一个表内不能重复,但是不同表之间可以重复。
create table t1 like ware;
复制表的结构和数据用 create table ... as select 。不过要注意,这个复制的是表的基本数据类型,对于主键、唯一约束、索引信息等不会复制。
create table t2 as select * from ware;
MySQL [test]> show create table t1\G
*************************** 1. row ***************************
Table: t1
Create Table: CREATE TABLE `t1` (
`w_id` int(11) NOT NULL,
`w_ytd` decimal(12,2) DEFAULT NULL,
`w_tax` decimal(4,4) DEFAULT NULL,
`w_name` varchar(10) DEFAULT NULL,
`w_street_1` varchar(20) DEFAULT NULL,
`w_street_2` varchar(20) DEFAULT NULL,
`w_city` varchar(20) DEFAULT NULL,
`w_state` char(2) DEFAULT NULL,
`w_zip` char(9) DEFAULT NULL,
PRIMARY KEY (`w_id`),
UNIQUE KEY `w_name` (`w_name`, `w_city`) BLOCK_SIZE 16384 GLOBAL
) DEFAULT CHARSET = utf8mb4 ROW_FORMAT = COMPACT COMPRESSION = 'zstd_1.3.8' REPLICA_NUM = 1 BLOCK_SIZE = 16384 USE_BLOOM_FILTER = FALSE TABLET_SIZE = 134217728 PCTFREE = 0
1 row in set (0.003 sec)
MySQL [test]> show create table t2\G
*************************** 1. row ***************************
Table: t2
Create Table: CREATE TABLE `t2` (
`w_id` int(11) NOT NULL,
`w_ytd` decimal(12,2) DEFAULT NULL,
`w_tax` decimal(4,4) DEFAULT NULL,
`w_name` varchar(10) DEFAULT NULL,
`w_street_1` varchar(20) DEFAULT NULL,
`w_street_2` varchar(20) DEFAULT NULL,
`w_city` varchar(20) DEFAULT NULL,
`w_state` char(2) DEFAULT NULL,
`w_zip` char(9) DEFAULT NULL
) DEFAULT CHARSET = utf8mb4 ROW_FORMAT = COMPACT COMPRESSION = 'zstd_1.3.8' REPLICA_NUM = 1 BLOCK_SIZE = 16384 USE_BLOOM_FILTER = FALSE TABLET_SIZE = 134217728 PCTFREE = 0
1 row in set (0.002 sec)
观察上面两个表结构,主键、唯一键和索引不同。
附录:
- 3.1 查看 OceanBase 集群资源的使用情况
- 3.2 如何创建和连接 MySQL 租户
- 3.3 如何连接租户
- 3.4 如何对租户参数(或变量)进行设置
- 3.5 如何使用 MySQL 租户做常见数据库开发
- 3.6 如何使用 OceanBase 分区表进行水平拆分
- 3.7 (高级)如何使用 OceanBase 表分组
- 3.8(高级)如何使用 OceanBase 复制表
- 3.9 常见问题
结束语
加入教程直播群方式一:钉钉群号3255 4020
加入教程直播群方式二:扫码下方二维码加入
