从 MySQL 到 KingbaseES:Database、Schema、User 一次讲透
从 MySQL 到 KingbaseES:核心概念迁移指南
前言
对于长期使用 MySQL 的开发者或 DBA 来说,初次接触 KingbaseES(金仓数据库)时,可能会对其中的 Database、Schema、User 等核心概念感到困惑。这些概念在 KingbaseES 中的层级关系、权限模型与 MySQL 存在显著差异,理解这些差异是顺利迁移和运维的关键。
本文将从 MySQL 使用者的视角出发,系统性地对比和讲解 KingbaseES 中 Database、Schema、User 的概念、关系及最佳实践,帮助你一次理清思路,平滑过渡。
1. 概念对比:MySQL vs KingbaseES
在深入细节之前,我们先从宏观上对比两者在这些核心概念上的不同。
| 概念 | MySQL | KingbaseES | 核心差异 |
|---|---|---|---|
| 实例 (Instance) | 一个 mysqld 进程服务一个数据目录,通常包含多个数据库。 |
一个 kingbase 进程服务一个集群 (Cluster),一个集群包含多个数据库 (Database)。 |
KingbaseES 的“实例”通常指整个数据库集群。 |
| 数据库 (Database) | 数据库是顶层对象,用于逻辑隔离数据。用户直接连接到某个数据库。 | 数据库是集群内的一个独立命名空间,是最高级别的逻辑隔离单元。用户连接时必须指定一个数据库。 | 关键差异:在 KingbaseES 中,Database 之间完全隔离,不能跨库查询。 |
| 模式 (Schema) | 在 MySQL 中,Schema 是 Database 的同义词。CREATE DATABASE 和 CREATE SCHEMA 是等价的。 |
Schema 是 Database 内部的命名空间,用于组织表、视图、函数等对象。一个数据库可以有多个 Schema。 |
关键差异:KingbaseES 的 Schema 提供了第二层的逻辑分组,类似于文件系统的目录。 |
| 用户 (User) | 用户账号,拥有全局或数据库级别的权限。用户身份与主机名绑定 ('user'@'host')。 |
用户是集群级别的登录角色 (ROLE),拥有 LOGIN 属性。权限可以授予到数据库、Schema 或具体对象。 |
KingbaseES 的用户/角色系统更强大,支持角色继承和更细粒度的权限控制。 |
| 权限体系 | 权限主要在全局、数据库、表级别进行授予。 | 权限可以在集群、数据库、Schema、表等多个层级进行授予,更加灵活。 |
简单来说,可以这样理解层级关系:
- MySQL:
实例 (Instance)->数据库/模式 (Database/Schema)->表 (Table) - KingbaseES:
集群 (Cluster)->数据库 (Database)->模式 (Schema)->表 (Table)
KingbaseES 在 Database 和 Table 之间多了一层 Schema,这带来了更好的组织性和灵活性。
2. Database:独立的王国
在 KingbaseES 中,Database 是最高级别的逻辑隔离单位。这与你熟悉的 MySQL 数据库概念有本质区别。
2.1 核心特性
- 完全隔离:不同的 Database 之间无法直接进行 SQL 查询(如
JOIN,UNION)。它们拥有独立的系统目录、用户定义对象,甚至连接也是独立的。 - 独立连接:客户端连接 KingbaseES 时,必须指定一个 Database(类似于 MySQL 的
USE database,但是在连接时就确定)。常见的连接字符串格式为jdbc:kingbase8://host:port/database_name。 - 专属属主:每个 Database 都有一个属主(Owner),通常是创建它的用户。属主自动拥有该数据库的所有权限。
2.2 操作示例
-- 1. 创建数据库 (需要 CREATEDB 权限)
CREATE DATABASE sales_db
ENCODING 'UTF8'
LC_COLLATE 'zh_CN.UTF-8'
LC_CTYPE 'zh_CN.UTF-8'
TEMPLATE template0
OWNER sales_admin;
-- 2. 查看所有数据库
\l
-- 或
SELECT datname FROM pg_database;
-- 3. 修改数据库属主
ALTER DATABASE sales_db OWNER TO new_admin;
-- 4. 删除数据库 (需要权限,且不能有活跃连接)
DROP DATABASE IF EXISTS sales_db;
迁移提示:在 MySQL 中,你可能习惯将不同业务的数据放在同一个实例的不同 Database 中,并且可以方便地跨库查询。迁移到 KingbaseES 时,需要重新评估:
- 如果业务模块间确实需要频繁跨库关联查询,应考虑将它们合并到同一个 KingbaseES Database 中,利用 Schema 进行逻辑分离。
- 如果业务模块完全独立,无需联合查询,则可以保持为不同的 Database,享受物理隔离带来的安全性和管理便利。
3. Schema:数据库内的命名空间
Schema 是 KingbaseES 中一个非常强大的特性,它解决了“一个数据库内如何优雅地组织大量对象”的问题。
3.1 核心特性
- 逻辑分组:可以将表、视图、索引、函数、类型等数据库对象分组到不同的 Schema 下。例如,可以为
hr(人力资源)、finance(财务)、report(报表)分别创建 Schema。 - 权限控制:可以针对整个 Schema 授予权限(如
USAGE,CREATE),简化权限管理。 - 搜索路径 (search_path):这是一个关键概念。当你执行
SELECT * FROM my_table;时,KingbaseES 会按照search_path中定义的 Schema 顺序去查找my_table。默认的search_path通常是"$user", public,意味着它会先找与当前用户同名的 Schema,再找publicSchema。
3.2 操作示例
-- 1. 创建 Schema
CREATE SCHEMA hr;
CREATE SCHEMA finance AUTHORIZATION finance_user; -- 指定属主
-- 2. 在指定 Schema 中创建表
CREATE TABLE hr.employees (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
department_id INT
);
CREATE TABLE finance.invoices (
invoice_id BIGSERIAL PRIMARY KEY,
amount DECIMAL(15,2),
issue_date DATE
);
-- 3. 查看当前搜索路径
SHOW search_path;
-- 默认可能是: "$user", public
-- 4. 修改当前会话的搜索路径 (方便查询)
SET search_path TO hr, public;
-- 现在可以直接查询 employees,而无需加 hr. 前缀
SELECT * FROM employees;
-- 5. 为用户设置默认搜索路径
ALTER USER app_user SET search_path = hr, public;
-- 6. 删除 Schema (CASCADE 会删除其下所有对象)
DROP SCHEMA IF EXISTS old_schema CASCADE;
迁移提示:对于从 MySQL 迁移过来的应用,最常见的做法是将所有表都放在 public Schema 中,这可以快速兼容。但从长远看,合理规划和使用 Schema 能让数据库结构更清晰、更易于管理。
4. User/Role:统一的权限主体
KingbaseES 遵循 PostgreSQL 的模型,使用 Role(角色) 来统一管理用户和组。一个拥有 LOGIN 属性的 Role 就是一个 User。
4.1 核心特性
- 角色继承:角色可以继承其他角色的权限,实现权限的复用和层级管理。
- 灵活的权限:权限可以授予给角色,角色可以再被授予给其他角色或用户。权限粒度可以细到具体某张表、某个列。
- 集群级别:用户/角色是在集群级别创建的,但他们的权限作用范围可以是具体的 Database、Schema 或对象。
4.2 操作示例
-- 1. 创建具有登录权限的用户(等同于 MySQL 的 CREATE USER)
CREATE USER app_user WITH PASSWORD 'StrongPass123!';
-- 或者使用 ROLE(加上 LOGIN 属性)
CREATE ROLE app_user WITH LOGIN PASSWORD 'StrongPass123!';
-- 2. 创建角色(组),用于权限分组
CREATE ROLE read_only;
CREATE ROLE data_writer;
-- 3. 授予角色权限
-- 授予 read_only 角色对 hr Schema 下所有现有表的 SELECT 权限
GRANT USAGE ON SCHEMA hr TO read_only;
GRANT SELECT ON ALL TABLES IN SCHEMA hr TO read_only;
-- 让 data_writer 角色可以在 finance Schema 中创建表并插入数据
GRANT CREATE, USAGE ON SCHEMA finance TO data_writer;
GRANT INSERT, UPDATE ON ALL TABLES IN SCHEMA finance TO data_writer;
-- 4. 将角色权限授予用户
GRANT read_only TO app_user;
GRANT data_writer TO app_user;
-- 5. 查看用户权限
\du app_user -- 命令行查看
-- 或通过系统视图查询
SELECT r.rolname, array_agg(b.rolname) as member_of
FROM pg_roles r
LEFT JOIN pg_auth_members m ON r.oid = m.member
LEFT JOIN pg_roles b ON m.roleid = b.oid
WHERE r.rolname = 'app_user'
GROUP BY r.rolname;
-- 6. 修改用户密码
ALTER USER app_user WITH PASSWORD 'NewStrongPass456!';
-- 7. 删除用户
DROP USER IF EXISTS app_user;
迁移提示:MySQL 的权限管理通常更直接(GRANT ALL ON db.* TO 'user'@'host')。迁移到 KingbaseES 后,需要花时间设计角色体系。一个好的实践是:先创建功能角色(如 read_only, read_write),再创建业务用户,并将功能角色授予业务用户。
5. 最佳实践与迁移建议
5.1 命名规范
- Database: 使用小写、下划线,代表一个完整的业务系统或完全独立的应用,如
order_center,crm_system。 - Schema: 使用小写,代表一个业务模块或功能域,如
inventory,billing,analytics。 - User/Role: 使用小写,用户以
_user结尾(如report_user),角色以_role结尾或描述权限(如dev_readwrite_role)。
5.2 权限设计四步法
- 创建业务数据库:
CREATE DATABASE myapp OWNER admin_user; - 创建业务 Schema:在数据库内,
CREATE SCHEMA module1 AUTHORIZATION admin_user; - 创建功能角色:
CREATE ROLE module1_read_only;然后授予该 Schema 的USAGE和表SELECT权限。 - 创建应用用户:
CREATE USER app1 WITH PASSWORD 'xxx';然后GRANT module1_read_only TO app1;
5.3 连接与搜索路径配置
在应用连接配置(如 JDBC URL)或用户属性中,设置好默认的 search_path,可以避免在 SQL 中写冗长的 Schema 前缀。
# JDBC 连接示例
jdbc:kingbase8://localhost:54321/myapp_db?currentSchema=hr&user=app_user&password=xxx
5.4 迁移检查清单
- 分析现有 MySQL 实例中 Database 间的关联关系,决定在 KingbaseES 中是合并为一个 Database(用 Schema 分隔)还是保持为多个 Database。
- 为新的 KingbaseES 数据库设计清晰的 Schema 结构。
- 将 MySQL 的用户权限映射为 KingbaseES 的角色体系。
- 修改应用程序的连接字符串,指定正确的 Database 和(可选的)
currentSchema。 - 测试应用的查询、事务和权限控制是否正常工作。
6. 总结
从 MySQL 到 KingbaseES 的迁移,在 Database、Schema、User 这三个核心概念上需要完成一次思维转换:
- Database 从“可互联的仓库”变成了“隔离的王国”,规划时需慎重。
- Schema 从“Database 的同义词”变成了“王国内的行政区划”,是组织代码和权限的利器。
- User/Role 从“用户账号”融入了更强大的“角色系统”,让权限管理更加灵活和精细。
理解并善用这些概念,不仅能帮助你顺利完成迁移,更能为你的 KingbaseES 数据库奠定一个清晰、安全、易于维护的架构基础。
希望这篇讲解能帮助你一次理清这些关键概念,在迁移之路上更加从容。
更多推荐



所有评论(0)