数据库技术总结
一、数据库类型
1. 关系型数据库(RDBMS)
传统代表:
MySQL
PostgreSQL
Oracle
SQL Server
国产代表:
达梦数据库(DM)
人大金仓(KingbaseES)
华为 openGauss
阿里 OceanBase
腾讯 TDSQL
南大通用 GBase
2. 非关系型数据库(NoSQL)
文档数据库:MongoDB、CouchDB
键值数据库:Redis、Memcached
时序数据库:InfluxDB、TDengine(国产)
图数据库:Neo4j、Galaxybase(国产)
宽列存储:Cassandra、HBase
二、功能特点对比
类型 | 代表产品 | 特点 |
---|---|---|
传统关系型 | MySQL | ACID事务支持、成熟稳定、生态完善 |
国产关系型 | 达梦DM | 高安全性、兼容Oracle、自主可控 |
分布式关系型 | OceanBase | 分布式架构、强一致性、高可用性、HTAP混合负载 |
文档型 | MongoDB | 灵活JSON结构、动态模式、水平扩展 |
时序数据库 | TDengine | 高性能时序数据处理、列式存储、内置缓存和流式计算(国产) |
图数据库 | Galaxybase | 大规模图分析、并行图计算、支持万亿边关系(国产) |
三、安全模式
通用安全机制
认证方式:
用户名/密码
LDAP集成
Kerberos认证
访问控制:
RBAC(基于角色的访问控制)
细粒度权限管理(表/列级权限)
数据加密:
传输加密(SSL/TLS)
静态加密(透明数据加密TDE)
审计功能:
操作日志记录
异常行为检测
国产数据库安全增强
达梦数据库:
三权分立体系(系统管理员、安全管理员、审计员)
强制访问控制(MAC)
数据脱敏功能
华为 openGauss:
全密态数据库(客户端加密)
动态数据掩码
行级访问控制
四、数据库安全设计
一、数据库安全设计详解
1. 关系型数据库安全
MySQL
认证机制:
本地socket认证
密码认证(mysql_native_password/caching_sha2_password)
支持PAM和LDAP集成
访问控制:
GRANT/REVOKE权限管理
表级、列级权限控制
存储过程权限分离
加密机制:
SSL/TLS传输加密
InnoDB表空间加密
二进制日志加密
审计功能:
企业版提供审计插件
社区版可通过general log实现基础审计
PostgreSQL
认证机制:
pg_hba.conf配置多种认证方式(MD5/SCRAM-SHA-256/GSSAPI等)
支持证书认证
访问控制:
基于角色的权限管理(RBAC)
行级安全策略(RLS)
列级权限控制
加密机制:
SSL连接加密
pgcrypto扩展提供字段级加密
透明数据加密(TDE)通过扩展实现
审计功能:
pgAudit扩展提供详细审计
内置日志记录功能
2. 国产关系型数据库安全
达梦数据库(DM)
三权分立:
系统管理员(SYSDBA):日常运维
安全管理员(SYSSSO):安全策略管理
审计管理员(SYSAUDITOR):审计配置
强制访问控制:
多级安全标签(MLS)
基于Bell-LaPadula模型的访问控制
加密机制:
存储加密(表空间/列级)
传输加密(国密SSL)
全库加密支持
安全审计:
细粒度审计策略
三员操作独立审计
华为 openGauss
全密态数据库:
客户端加密(数据离开客户端即加密)
服务端不解密处理加密数据
动态数据脱敏:
基于策略的敏感数据遮蔽
支持多种脱敏算法(遮盖、替换、扰乱)
行级访问控制:
基于属性的访问控制(ABAC)
策略自动应用到所有查询
统一审计:
审计策略中心化管理
支持审计日志加密存储
3. 非关系型数据库安全
MongoDB
认证机制:
SCRAM-SHA-1/256
x.509证书认证
LDAP代理认证
Kerberos认证
访问控制:
基于角色的访问控制(RBAC)
集合级权限控制
字段级加密(FLE)
加密机制:
传输加密(TLS/SSL)
WiredTiger存储引擎加密
客户端字段级加密
审计功能:
细粒度审计事件捕获
支持审计日志加密
Redis
认证机制:
简单密码认证(requirepass)
ACL用户权限系统(Redis 6+)
访问控制:
命令级权限控制
键空间权限控制
多用户支持
加密机制:
TLS客户端-服务器加密
传输加密(SSL代理)
安全加固:
保护模式(默认绑定127.0.0.1)
禁用危险命令(CONFIG/FLUSHALL等)
TDengine(国产时序数据库)
认证机制:
用户名/密码认证
Token认证(API访问)
访问控制:
数据库级权限控制
表级权限管理
加密机制:
传输加密(TLS)
存储加密(支持国密算法)
审计功能:
操作日志记录
异常访问检测
五、 数据库基本操作命令
关系型数据库操作与特性
1. 传统关系型数据库
MySQL
基本操作命令
-- CRUD
INSERT INTO users (name, email) VALUES ('Alice', 'alice@example.com');
SELECT * FROM users WHERE id = 1;
UPDATE users SET email = 'new@example.com' WHERE id = 1;
DELETE FROM users WHERE id = 1;
-- 批量更新
UPDATE orders SET status = 'shipped' WHERE order_date < '2023-01-01';
-- 导入导出
-- 导出
mysqldump -u root -p mydb > backup.sql
-- 导入
mysql -u root -p mydb < backup.sql
-- 权限管理
CREATE USER 'dev'@'%' IDENTIFIED BY 'password';
GRANT SELECT, INSERT ON mydb.* TO 'dev'@'%';
事务与锁机制
事务隔离级别:
READ UNCOMMITTED(读未提交)
READ COMMITTED(读已提交)← 默认级别
REPEATABLE READ(可重复读)
SERIALIZABLE(串行化)
锁类型:
共享锁(S锁):读锁,允许多事务并发读
排他锁(X锁):写锁,独占资源
意向锁:表级锁,表明事务将在行上获取锁
死锁处理:自动检测并回滚其中一个事务
PostgreSQL
基本操作命令
-- CRUD
INSERT INTO products (name, price) VALUES ('Laptop', 999.99);
SELECT * FROM products WHERE price > 500;
UPDATE products SET price = price * 0.9 WHERE stock > 100;
DELETE FROM logs WHERE created_at < NOW() - INTERVAL '1 year';
-- 批量更新
WITH updated AS (
SELECT id FROM orders WHERE status = 'pending' LIMIT 1000
)
UPDATE orders SET status = 'processing' WHERE id IN (SELECT id FROM updated);
-- 导入导出
-- 导出
pg_dump -U postgres -d mydb > backup.sql
-- 导入
psql -U postgres -d mydb < backup.sql
-- 权限管理
CREATE ROLE analyst;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO analyst;
事务与锁机制
事务隔离级别:
READ COMMITTED(读已提交)← 默认级别
REPEATABLE READ(可重复读)
SERIALIZABLE(串行化)
锁特点:
多版本并发控制(MVCC)
行级锁粒度
咨询锁(advisory locks)用于应用级锁定
死锁处理:自动检测并回滚
2. 国产关系型数据库
达梦数据库 (DM)
基本操作命令
-- CRUD
INSERT INTO employees (id, name) VALUES (1001, '张三');
SELECT * FROM employees WHERE id = 1001 FOR UPDATE; -- 加锁查询
UPDATE employees SET salary = salary * 1.1 WHERE dept = 'IT';
DELETE FROM temp_data;
-- 闪回查询(历史数据)
SELECT * FROM employees WHEN TIMESTAMP '2023-01-01 12:00:00';
-- 插入数据
INSERT INTO employees (id, name, salary) VALUES (1001, '张三', 15000);
INSERT INTO departments SELECT * FROM old_departments WHERE status = 1; -- 批量插入
-- 查询数据
SELECT * FROM employees WHERE salary > 10000;
SELECT name, salary FROM employees WHERE id = 1001 FOR UPDATE; -- 加锁查询
-- 更新数据
UPDATE employees SET salary = salary * 1.1 WHERE dept_id = 2;
UPDATE departments SET manager = (SELECT name FROM employees WHERE id = 1001) WHERE id = 10;
-- 删除数据
DELETE FROM employees WHERE status = 'inactive';
TRUNCATE TABLE temp_data; -- 快速清空表
-- 导入导出
-- 导出
dexp USERID=SYSDBA/SYSDBA@localhost FILE=full.dmp FULL=Y
-- 导入
dimp USERID=SYSDBA/SYSDBA@localhost FILE=full.dmp FULL=Y
# 使用DEXP导出数据(全库)
dexp SYSDBA/SYSDBA@localhost:5236 FULL=Y FILE=full_export.dmp LOG=exp.log
# 使用DEXP导出单表
dexp SYSDBA/SYSDBA@localhost:5236 OWNER=hr TABLES=employees FILE=emp.dmp
# 使用DIMP导入数据
dimp SYSDBA/SYSDBA@localhost:5236 FILE=full_export.dmp FULL=Y LOG=imp.log
# SQL脚本导入
disql SYSDBA/SYSDBA@localhost:5236 `start /path/to/import.sql`
-- 权限管理
CREATE USER audit_user IDENTIFIED BY "Audit123";
GRANT SELECT ANY TABLE TO audit_user;
-- 创建用户
CREATE USER hr_admin IDENTIFIED BY "HrSecure123" DEFAULT TABLESPACE HR_TBS;
-- 授予角色
GRANT RESOURCE TO hr_admin;
GRANT SELECT, INSERT, UPDATE ON hr.employees TO hr_admin;
-- 撤销权限
REVOKE DELETE ON hr.employees FROM hr_admin;
-- 创建角色
CREATE ROLE data_auditor;
GRANT SELECT ON hr.salaries TO data_auditor;
-- 安全管理员操作(SYSSSO)
CREATE AUDIT POLICY emp_audit ACTIONS INSERT, UPDATE, DELETE ON hr.employees;
ENABLE AUDIT POLICY emp_audit;
事务与锁机制
事务隔离级别:
READ COMMITTED(读已提交)← 默认级别
REPEATABLE READ(可重复读)
SERIALIZABLE(串行化)
锁特点:
支持表级锁和行级锁
自动死锁检测与处理
支持NOWAIT选项避免锁等待
特有机制:闪回查询技术,可在事务外查询历史数据
华为 openGauss
基本操作命令
-- CRUD
INSERT INTO customers (cid, name) VALUES (2001, '李四');
SELECT * FROM customers WHERE name LIKE '李%';
UPDATE accounts SET balance = balance - 100 WHERE account_id = 3001;
DELETE FROM session_logs WHERE create_time < NOW() - INTERVAL '1 month';
-- 插入数据
INSERT INTO customers (cid, cname, phone) VALUES (3001, '李四', '13800138000');
INSERT INTO orders (order_id, customer_id) VALUES (5001, 3001) RETURNING order_id; -- 返回生成的ID
-- 查询数据
SELECT * FROM customers WHERE phone LIKE '138%';
SELECT cname, COUNT(order_id) FROM customers JOIN orders USING (cid) GROUP BY cname;
-- 更新数据
UPDATE products SET stock = stock - 1 WHERE product_id = 1001;
UPDATE employees SET salary = salary * 1.05 WHERE performance_rating > 4;
-- 删除数据
DELETE FROM temp_data;
VACUUM FULL; -- 回收空间
-- 批量更新
UPDATE products SET stock = stock - orders.quantity
FROM orders WHERE orders.product_id = products.id;
-- 导入导出
-- 导出
gs_dump -U omm -W 'password' -f backup.sql mydb
-- 导入
gs_restore -U omm -d mydb backup.sql
# 使用gs_dump导出
gs_dump -U omm -W 'password' -f /backup/db_full.sql mydb
# 导出特定模式
gs_dump -U omm -n hr -f /backup/hr_schema.sql mydb
# 使用gs_restore导入
gs_restore -U omm -d mydb /backup/db_full.sql
# gsql执行SQL文件
gsql -U omm -W 'password' -d mydb -f /path/to/import.sql
# COPY命令
-- 导出
COPY (SELECT * FROM products) TO '/data/products.csv' WITH (FORMAT csv, HEADER);
-- 导入
COPY sales FROM '/data/sales.csv' WITH (FORMAT csv, DELIMITER '|');
-- 权限管理
CREATE USER sec_admin PASSWORD 'Sec@2023';
GRANT ALL ON SCHEMA hr TO sec_admin;
-- 创建用户
CREATE USER security_officer WITH PASSWORD 'Sec@2023' SYSADMIN;
-- 授予权限
GRANT ALL PRIVILEGES ON DATABASE mydb TO security_officer;
GRANT SELECT ON TABLE hr.salaries TO audit_user;
-- 行级访问控制
CREATE ROW LEVEL SECURITY POLICY sales_policy ON sales
USING (sales_person = CURRENT_USER);
-- 数据脱敏
CREATE MASKING POLICY phone_mask ON customers(phone)
USING ('***-****-' || SUBSTR(phone, 9, 4));
事务与锁机制
事务隔离级别:
READ COMMITTED(读已提交)← 默认级别
REPEATABLE READ(可重复读)
锁特点:
多版本并发控制(MVCC)
行级锁粒度
支持LOCK TABLE显式表锁
优化特性:
基于代价的死锁检测
快速提交机制
人大金仓 (KingbaseES)
基本操作命令
-- CRUD
INSERT INTO books (title, author) VALUES ('数据库系统', '王教授');
SELECT * FROM books WHERE price > 50;
UPDATE inventory SET quantity = quantity - 1 WHERE product_id = 101;
DELETE FROM user_logs WHERE log_date < CURRENT_DATE - 30;
-- 插入数据
INSERT INTO products (id, name, price) VALUES (2001, '笔记本电脑', 5999);
INSERT INTO sales SELECT * FROM temp_sales; -- 批量插入
-- 查询数据
SELECT * FROM products WHERE price BETWEEN 1000 AND 5000;
SELECT name, price FROM products WHERE category = '电子产品' ORDER BY price DESC;
-- 更新数据
UPDATE products SET price = price * 0.9 WHERE stock > 100;
UPDATE sales SET status = 'completed' WHERE sale_date < '2023-01-01';
-- 删除数据
DELETE FROM logs WHERE log_date < CURRENT_DATE - INTERVAL '1 year';
-- 导入导出
-- 导出
sys_dump -U system -d mydb -f backup.sql
-- 导入
sys_restore -U system -d mydb backup.sql
# 使用sys_dump导出
sys_dump -U system -d mydb -f /backup/mydb.sql
# 导出单表
sys_dump -U system -t employees -f /backup/employees.sql mydb
# 使用sys_restore导入
sys_restore -U system -d mydb /backup/mydb.sql
# COPY命令导入导出
-- 导出到CSV
COPY (SELECT * FROM products) TO '/data/products.csv' WITH CSV HEADER;
-- 从CSV导入
COPY sales FROM '/data/new_sales.csv' WITH CSV;
-- 权限管理
CREATE ROLE finance;
GRANT SELECT, UPDATE ON accounting.* TO finance;
-- 创建用户
CREATE USER audit_user WITH PASSWORD 'AuditPass123';
-- 授予权限
GRANT CONNECT ON DATABASE mydb TO audit_user;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO audit_user;
-- 创建角色
CREATE ROLE finance_rw;
GRANT SELECT, INSERT, UPDATE ON accounting.* TO finance_rw;
-- 行级安全策略
CREATE POLICY sales_access ON sales FOR SELECT
USING (sales_region = CURRENT_USER);
ALTER TABLE sales ENABLE ROW LEVEL SECURITY;
事务与锁机制
事务隔离级别:
READ COMMITTED(读已提交)← 默认级别
REPEATABLE READ(可重复读)
SERIALIZABLE(串行化)
锁特点:
兼容PostgreSQL锁机制
支持行级锁和表级锁
死锁自动检测超时时间可配置
安全特性:强制访问控制(MAC)支持
阿里 (OceanBase)
基本操作命令
-- 插入数据
INSERT INTO transactions (txn_id, amount, account_id) VALUES (9001, 500.00, 10001);
INSERT INTO account_hist SELECT * FROM transactions WHERE txn_date = SYSDATE;
-- 查询数据
SELECT * FROM accounts WHERE balance > 1000000;
SELECT account_id, SUM(amount) FROM transactions GROUP BY account_id;
-- 更新数据
UPDATE accounts SET balance = balance - 500 WHERE account_id = 10001;
UPDATE transactions SET status = 'processed' WHERE txn_date < SYSDATE - 1;
-- 删除数据
DELETE FROM session_logs WHERE create_time < SYSDATE - 30;
# 使用obdumper导出
obdumper -h 127.0.0.1 -P 2881 -u admin -p 'password' -t 8 -c mycluster -D mytenant -d mydb -o /data/export
# 使用obloader导入
obloader -h 127.0.0.1 -P 2881 -u admin -p 'password' -c mycluster -D mytenant -d mydb -f /data/export
# 使用LOAD DATA导入
LOAD DATA INFILE '/data/accounts.csv' INTO TABLE accounts FIELDS TERMINATED BY ',';
# 导出查询结果
SELECT * FROM transactions INTO OUTFILE '/data/txns.csv' FIELDS TERMINATED BY ',';
-- 创建用户
CREATE USER ob_user IDENTIFIED BY 'OceanBase123';
-- 授予角色
GRANT CDB_DBA TO ob_user;
GRANT SELECT ANY TABLE TO ob_user;
-- 权限管理
GRANT INSERT, UPDATE ON finance.* TO ob_user;
REVOKE DELETE ON finance.accounts FROM ob_user;
-- 审计配置
ALTER SYSTEM SET enable_sql_audit = true;
CREATE AUDIT POLICY trans_audit ACTIONS ALL ON finance.transactions;
腾讯 TDSQL(mysql兼容)
基本操作命令
-- 插入数据
INSERT INTO users (user_id, username, email) VALUES (4001, '王五', 'wangwu@example.com');
INSERT IGNORE INTO logins SELECT user_id, login_time FROM temp_logins; -- 忽略错误
-- 查询数据
SELECT * FROM orders WHERE order_date BETWEEN '2023-01-01' AND '2023-01-31';
EXPLAIN SELECT * FROM products WHERE price > 1000; -- 查看执行计划
-- 更新数据
UPDATE products SET stock = stock - quantity FROM orders WHERE orders.product_id = products.id;
UPDATE users SET last_login = NOW() WHERE user_id = 4001;
-- 删除数据
DELETE FROM sessions WHERE last_activity < NOW() - INTERVAL 1 HOUR;
-- 插入数据
INSERT INTO users (user_id, username, email) VALUES (4001, '王五', 'wangwu@example.com');
INSERT IGNORE INTO logins SELECT user_id, login_time FROM temp_logins; -- 忽略错误
-- 查询数据
SELECT * FROM orders WHERE order_date BETWEEN '2023-01-01' AND '2023-01-31';
EXPLAIN SELECT * FROM products WHERE price > 1000; -- 查看执行计划
-- 更新数据
UPDATE products SET stock = stock - quantity FROM orders WHERE orders.product_id = products.id;
UPDATE users SET last_login = NOW() WHERE user_id = 4001;
-- 删除数据
DELETE FROM sessions WHERE last_activity < NOW() - INTER# 使用mysqldump导出
mysqldump -h 127.0.0.1 -u root -p mydb > /backup/mydb.sql
# 导出单表
mysqldump -h 127.0.0.1 -u root -p mydb users > /backup/users.sql
# 导入数据
mysql -h 127.0.0.1 -u root -p mydb < /backup/mydb.sql
# LOAD DATA导入
LOAD DATA LOCAL INFILE '/data/users.csv' INTO TABLE users FIELDS TERMINATED BY ',';
# SELECT INTO导出
SELECT * FROM orders INTO OUTFILE '/data/orders.csv' FIELDS TERMI-- 创建用户
CREATE USER 'td_admin'@'%' IDENTIFIED BY 'TDSQL_pass123';
-- 授予权限
GRANT ALL PRIVILEGES ON mydb.* TO 'td_admin'@'%';
GRANT SHOW VIEW, EXECUTE ON mydb.* TO 'td_admin'@'%';
-- 撤销权限
REVOKE DROP, ALTER ON mydb.* FROM 'td_admin'@'%';
-- 查看权限
SHOW GRANTS FOR 'td_admin'@'%';NATED BY ',';VAL 1 HOUR;
南大通用GBase
基本操作命令
-- 插入数据
INSERT INTO inventory (item_id, warehouse, quantity) VALUES (7001, '北京仓', 500);
INSERT INTO sales (sale_id, item_id, qty) VALUES (8001, 7001, 2) RETURNING sale_id;
-- 查询数据
SELECT item_id, SUM(quantity) FROM inventory GROUP BY item_id HAVING SUM(quantity) > 100;
SELECT * FROM sales WHERE sale_date = CURRENT_DATE;
-- 更新数据
UPDATE inventory SET quantity = quantity - sales.qty
FROM sales WHERE sales.item_id = inventory.item_id;
-- 删除数据
DELETE FROM archived_sales WHERE sale_date < '2022-01-01';
# 使用gbasedbt导出
gbasedbt -export -db mydb -table inventory -file /data/inventory.exp
# 导入数据
gbasedbt -import -db mydb -table inventory -file /data/inventory.exp
# 使用unload/load
-- 导出
UNLOAD TO '/data/inventory.unl' SELECT * FROM inventory;
-- 导入
LOAD FROM '/data/new_inventory.unl' INSERT INTO i-- 创建用户
CREATE USER gbase_user WITH PASSWORD 'GBase123';
-- 授予权限
GRANT CONNECT TO gbase_user;
GRANT SELECT, UPDATE ON inventory TO gbase_user;
-- 创建角色
CREATE ROLE warehouse_manager;
GRANT ALL ON inventory TO warehouse_manager;
-- 审计配置
AUDIT SELECT, UPDATE, DELETE ON inventory;nventory;
非关系型数据库操作与特性
1. 文档数据库:MongoDB
基本操作命令
// CRUD
db.users.insertOne({name: "John", age: 30, email: "john@example.com"});
db.users.find({age: {$gt: 25}});
db.users.updateOne({name: "John"}, {$set: {age: 31}});
db.users.deleteMany({status: "inactive"});
// 批量操作
db.products.bulkWrite([
{insertOne: {document: {name: "Phone", price: 599}}},
{updateOne: {
filter: {name: "Laptop"},
update: {$set: {price: 899}}
}}
]);
// 导入导出
// 导出JSON
mongoexport --uri="mongodb://user:pwd@host/db" --collection=users --out=users.json
// 导入JSON
mongoimport --uri="mongodb://user:pwd@host/db" --collection=users --file=users.json
// 权限管理
db.createUser({
user: "admin",
pwd: "password",
roles: [{role: "readWrite", db: "mydb"}]
});
事务与锁机制
事务支持:多文档ACID事务(4.0+版本)
隔离级别:
读未提交(默认)
读已提交(可配置)
锁机制:
全局锁(WiredTiger引擎前)
文档级锁(WiredTiger引擎)
意向锁模式
特点:写操作期间允许并发读
2. 键值数据库:Redis
基本操作命令
# CRUD
SET user:1000 "John Doe"
GET user:1000
HSET user:1001 name "Alice" age 30
DEL user:1000
# 批量操作
MULTI
INCR counter
SET log:20230101 "data"
EXPIRE user:1001 3600
EXEC
# 数据持久化
# RDB快照
SAVE # 阻塞式保存
BGSAVE # 后台保存
# AOF持久化
CONFIG SET appendonly yes
# 权限管理
ACL SETUSER alice ON >pass123 +@write ~mydata:*
事务与锁机制
事务支持:MULTI/EXEC命令(非ACID)
隔离级别:单线程模型保证操作原子性
锁机制:
单线程处理命令,无竞争锁
WATCH命令实现乐观锁
特点:
所有操作原子执行
无回滚机制(EXEC后命令全部执行)
3. 时序数据库:TDengine (国产)
基本操作命令
-- 创建超级表
CREATE STABLE sensors (
ts TIMESTAMP,
temperature FLOAT,
humidity FLOAT
) TAGS (location BINARY(20));
-- CRUD
INSERT INTO sensor_beijing USING sensors TAGS ('Beijing') VALUES (NOW, 23.5, 45.2);
SELECT AVG(temperature) FROM sensors WHERE ts > NOW - 1h;
DELETE FROM sensors WHERE ts < '2023-01-01';
-- 创建超级表
CREATE STABLE sensors (ts TIMESTAMP, temperature FLOAT, humidity FLOAT)
TAGS (location BINARY(20), type BINARY(10));
-- 创建子表
CREATE TABLE sensor_beijing USING sensors TAGS ('Beijing', 'temperature');
-- 插入数据
INSERT INTO sensor_beijing VALUES (NOW, 23.5, 45.2);
INSERT INTO sensor_shanghai USING sensors TAGS ('Shanghai', 'humidity') VALUES (NOW, 25.1, 60.5);
-- 查询数据
SELECT AVG(temperature) FROM sensors WHERE location = 'Beijing' AND ts > NOW - 1h;
SELECT FIRST(temperature), LAST(humidity) FROM sensor_beijing INTERVAL(10m);
-- 删除数据
DELETE FROM sensors WHERE ts < '2023-01-01 00:00:00';
-- 导入导出
-- 导出
taosdump -o /backup -D mydb
-- 导入
taosdump -i /backup
# 导出数据
taosdump -o /backup -D mydb
# 导入数据
taosdump -i /backup
# CSV导入
taos -s "LOAD FILE '/data/sensors.csv' INTO TABLE sensor1 FIELDS TERMINATED BY ','"
# 导出查询结果
taos -s 'SELECT * FROM sensors' -o /data/sensors.csv
-- 权限管理
CREATE USER monitor PASS 'monitor123';
GRANT READ ON mydb.* TO monitor;
-- 创建用户
CREATE USER monitor_user PASS 'Monitor123';
-- 授予权限
GRANT READ ON mydb.* TO monitor_user;
GRANT WRITE ON mydb.sensors TO monitor_user;
-- 撤销权限
REVOKE WRITE ON mydb.sensors FROM monitor_user;
-- 查看权限
SHOW GRANTS;
事务与锁机制
事务支持:有限事务支持(集群版)
隔离级别:读已提交(主要级别)
锁特点:
写操作采用时间分区锁
读操作无锁设计
优化:针对时序数据高并发写入优化
4. 图数据库:Galaxybase (国产)
基本操作命令
// CRUD
CREATE VERTEX Person (name STRING, age INT) PRIMARY KEY name;
INSERT VERTEX Person (name, age) VALUES ('张工程师', 35);
MATCH (p:Person) WHERE p.name = '张工程师' RETURN p;
UPDATE VERTEX Person SET age = 36 WHERE name = '张工程师';
DELETE VERTEX '张工程师';
// 创建顶点
CREATE VERTEX Person (name STRING, age INT) PRIMARY KEY name;
CREATE VERTEX Company (name STRING, address STRING) PRIMARY KEY name;
// 创建边
CREATE EDGE WORKS_AT (since DATE, position STRING);
// 插入数据
INSERT VERTEX Person (name, age) VALUES ('张三', 30);
INSERT EDGE WORKS_AT (since, position) VALUES
'张三' -> '腾讯公司' : ('2020-01-15', '工程师');
// 查询数据
MATCH (p:Person)-[w:WORKS_AT]->(c:Company)
WHERE p.name = '张三'
RETURN p.name, w.position, c.name;
// 更新数据
UPDATE VERTEX Person SET age = 31 WHERE name = '张三';
// 删除数据
DELETE VERTEX '张三';
// 批量导入
// CSV格式
LOAD CSV FROM '/data/persons.csv' AS row
CREATE (:Person {name: row[0], age: toInteger(row[1])});
# 导出全库
galaxybase export -f /backup/full_export.gbf
# 导出子图
galaxybase export -q "MATCH (p:Person) RETURN p" -f /backup/persons.gbf
# 导入数据
galaxybase import -f /backup/full_export.gbf
# CSV导入顶点
galaxybase load vertices -f persons.csv -label Person -header
// 权限管理
CREATE USER graph_user IDENTIFIED BY 'Graph123';
GRANT READ ON GRAPH social TO graph_user;
-- 创建用户
CREATE USER graph_admin IDENTIFIED BY 'GraphPass123';
-- 授予权限
GRANT READ ON GRAPH social TO graph_admin;
GRANT WRITE ON VERTEX Person TO graph_admin;
-- 创建角色
CREATE ROLE data_scientist;
GRANT READ ON GRAPH * TO data_scientist;
-- 审计配置
ENABLE AUDIT ALL COMMANDS;
事务与锁机制
事务支持:ACID事务(支持多操作事务)
隔离级别:读已提交(默认)
锁特点:
顶点和边粒度的锁
死锁自动检测
乐观并发控制
优化:支持大规模并行图计算
总结对比
数据库 | CRUD特点 | 导入导出工具 | 权限模型 |
---|---|---|---|
达梦DM | 支持闪回查询、批量操作 | dexp/dimp工具集 | 三权分立安全模型 |
人大金仓 | 兼容PostgreSQL语法 | sys_dump/sys_restore | RBAC+行级安全 |
openGauss | 支持RETURNING子句 | gs_dump/gs_restore | 全密态+动态脱敏 |
OceanBase | 分布式事务支持 | obdumper/obloader | 多租户权限隔离 |
TDSQL | MySQL高度兼容 | mysqldump | MySQL标准权限 |
GBase | 支持RETURNING子句 | 专用export/import工具 | 标准SQL权限 |
TDengine | 超级表模板、时序聚合查询 | taosdump | 库/表级权限 |
Galaxybase | 原生图查询语言 | galaxybase import/export | 图元素级权限控制 |
六、事务隔离级别对比
数据库类型 | 支持的隔离级别 | 默认级别 | 特点说明 |
---|---|---|---|
MySQL | READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ, SERIALIZABLE | REPEATABLE READ | 使用MVCC实现非锁定读,可重复读级别通过快照实现 |
PostgreSQL | READ COMMITTED, REPEATABLE READ, SERIALIZABLE | READ COMMITTED | 真正的可串行化隔离级别,使用谓词锁防止幻读 |
达梦DM | READ COMMITTED, REPEATABLE READ, SERIALIZABLE | READ COMMITTED | 支持闪回查询,可在不开启事务的情况下查询历史数据 |
openGauss | READ COMMITTED, REPEATABLE READ | READ COMMITTED | 基于MVCC,REPEATABLE READ级别使用事务快照 |
MongoDB | 读未提交, 读已提交(可配置) | 读未提交 | 多文档事务支持,文档级锁保证写操作一致性 |
Redis | 单线程原子性 | N/A | 所有操作在单线程中顺序执行,无需传统事务隔离机制 |
TDengine | 读已提交(主要) | READ COMMITTED | 时序数据场景下优化,高并发写入设计 |
Galaxybase | READ COMMITTED, SERIALIZABLE(部分) | READ COMMITTED | 图元素级别锁,支持复杂图操作的ACID事务 |
七、备份与恢复专用工具
1. 通用备份工具
工具名称 | 支持数据库 | 特点 |
---|---|---|
Percona XtraBackup | MySQL, MariaDB | 物理热备份,不影响数据库运行,支持增量备份 |
pgBackRest | PostgreSQL | 支持全量/增量备份,并行备份恢复,备份压缩 |
mongodump/mongorestore | MongoDB | 官方工具,支持逻辑备份,可备份特定集合 |
Redis RDB/AOF | Redis | 内置持久化机制,RDB为快照,AOF记录所有写操作 |
2. 国产数据库备份工具
数据库 | 备份工具 | 特点 |
---|---|---|
达梦DM | dexp/dimp | 逻辑备份工具,支持全库/模式/表级备份,并行导出导入 |
人大金仓 | sys_dump/sys_restore | 类似pg_dump,支持自定义格式压缩备份 |
openGauss | gs_dump/gs_restore | 支持并行备份恢复,可备份特定模式或表 |
OceanBase | obdumper/obloader | 分布式备份工具,支持多线程导出导入 |
TDengine | taosdump | 专用备份工具,支持数据压缩,可备份特定数据库或表 |
Galaxybase | galaxybase export/import | 支持全图或子图备份,可导出为多种格式(GBF/CSV/JSON) |
八、事务与锁
一、事务与锁的核心关系
事务和锁是数据库管理系统(DBMS)中密不可分的两个核心概念,它们共同协作以保证数据库的ACID特性(原子性、一致性、隔离性、持久性)。
核心关系:
事务是目标:事务定义了数据库操作的逻辑单元
锁是手段:锁是实现事务隔离性和一致性的关键技术
协同工作:锁机制确保事务执行过程中数据不被意外修改
二、事务的基本概念
ACID特性:
原子性 (Atomicity):事务中的所有操作要么全部完成,要么全部不完成
一致性 (Consistency):事务执行前后数据库处于一致状态
隔离性 (Isolation):并发事务互不干扰
持久性 (Durability):事务提交后对数据库的改变是永久性的
事务生命周期:
START TRANSACTION; -- 事务开始
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT; -- 事务提交
-- 或 ROLLBACK; 事务回滚
三、锁的基本概念
锁的主要类型:
锁类型 | 别名 | 描述 | 兼容性 |
---|---|---|---|
共享锁 (S Lock) | 读锁 | 允许多事务并发读取 | 与共享锁兼容 |
排他锁 (X Lock) | 写锁 | 独占资源,防止其他访问 | 不兼容任何锁 |
意向共享锁 (IS) | - | 表明将在更细粒度加共享锁 | 与意向锁兼容 |
意向排他锁 (IX) | - | 表明将在更细粒度加排他锁 | 仅与意向锁兼容 |
锁的粒度:
行级锁(最细粒度,并发度高)
页级锁(折中方案)
表级锁(最粗粒度,并发度低)
四、事务与锁的协同工作原理
工作流程:
关键交互点:
读操作:自动获取共享锁(S Lock)
写操作:自动获取排他锁(X Lock)
锁升级:当读取后需要修改时,S锁升级为X锁
锁释放:事务结束时自动释放所有锁
五、锁在事务中的核心作用
1. 保证隔离性(Isolation)
防止脏读:排他锁阻止读取未提交的数据
避免不可重复读:共享锁阻止其他事务修改已读数据
消除幻读:范围锁阻止插入新行到已查询范围
2. 维护一致性(Consistency)
通过锁强制数据修改顺序
确保外键约束等完整性规则不被破坏
防止并发修改导致数据逻辑冲突
3. 实现原子性(Atomicity)
锁保护事务中的所有操作作为一个整体
回滚时确保所有修改被撤销
4. 控制并发冲突
乐观锁(版本控制)与悲观锁(物理锁)策略
死锁检测与处理机制
六、不同隔离级别下的锁行为
隔离级别 | 锁持有时间 | 锁类型 | 解决的问题 | 存在的问题 |
---|---|---|---|---|
读未提交 | 写操作期间 | 仅写锁 | 无 | 脏读、不可重复读、幻读 |
读已提交 | 语句执行期间 | 读写锁 | 脏读 | 不可重复读、幻读 |
可重复读 | 整个事务期间 | 读写锁+间隙锁 | 脏读、不可重复读 | 幻读(部分解决) |
串行化 | 整个事务期间 | 范围锁+读写锁 | 所有问题 | 并发性能低 |
九、数据库结构体系详解:从物理存储到逻辑视图
一、表(Tables)
概念与作用
概念:数据库中最基本的存储单元,由行(记录)和列(字段)组成的二维结构
核心作用:
结构化存储业务数据
建立数据之间的关系
作为其他数据库对象的基础
CRUD操作
-- 创建表 (Create)
CREATE TABLE employees (
id INT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
salary DECIMAL(10,2),
hire_date DATE DEFAULT CURRENT_DATE
);
-- 查询数据 (Read)
SELECT * FROM employees WHERE salary > 5000;
-- 更新数据 (Update)
UPDATE employees SET salary = salary * 1.1 WHERE id = 1001;
-- 删除数据 (Delete)
DELETE FROM employees WHERE id = 1005;
-- 修改表结构 (Alter)
ALTER TABLE employees ADD COLUMN department VARCHAR(50);
ALTER TABLE employees DROP COLUMN hire_date;
-- 删除表 (Drop)
DROP TABLE employees;
二、视图(Views)
概念与作用
概念:基于SQL查询的虚拟表,不存储实际数据
核心作用:
简化复杂查询
提供数据安全层(隐藏敏感列)
保持应用层与数据层的独立性
CRUD操作
-- 创建视图 (Create)
CREATE VIEW high_salary_employees AS
SELECT id, name, salary
FROM employees
WHERE salary > 10000
WITH CHECK OPTION; -- 确保通过视图的修改符合条件
-- 查询视图 (Read)
SELECT * FROM high_salary_employees
WHERE name LIKE '张%';
-- 更新视图数据 (Update)
-- 注意:仅适用于简单视图(单表、无聚合)
UPDATE high_salary_employees
SET salary = 12000
WHERE id = 1001;
-- 删除视图 (Drop)
DROP VIEW high_salary_employees;
三、索引(Indexes)
概念与作用
概念:提高查询性能的数据结构(如B树、哈希表)
核心作用:
加速数据检索速度
强制唯一性约束
优化连接操作性能
CRUD操作
-- 创建索引 (Create)
CREATE INDEX idx_emp_name ON employees(name);
CREATE UNIQUE INDEX idx_emp_email ON employees(email);
-- 查询索引信息 (Read)
-- MySQL
SHOW INDEX FROM employees;
-- PostgreSQL
SELECT * FROM pg_indexes WHERE tablename = 'employees';
-- 重建索引 (Update)
-- Oracle
ALTER INDEX idx_emp_name REBUILD;
-- SQL Server
ALTER INDEX idx_emp_name ON employees REORGANIZE;
-- 删除索引 (Delete)
DROP INDEX idx_emp_name;
四、存储过程(Stored Procedures)
概念与作用
概念:预编译并存储在数据库中的SQL代码块
核心作用:
提高性能(减少网络传输)
实现业务逻辑封装
增强安全性(减少SQL注入风险)
CRUD操作
-- 创建存储过程 (Create)
-- MySQL示例
DELIMITER $$
CREATE PROCEDURE raise_salary(IN emp_id INT, IN percent DECIMAL(5,2))
BEGIN
UPDATE employees
SET salary = salary * (1 + percent/100)
WHERE id = emp_id;
END$$
DELIMITER ;
-- 执行存储过程 (Call)
CALL raise_salary(1001, 5.0);
-- 修改存储过程 (Alter)
-- MySQL(实际是先删除再创建)
DROP PROCEDURE IF EXISTS raise_salary;
CREATE PROCEDURE raise_salary(...) ...
-- 删除存储过程 (Drop)
DROP PROCEDURE raise_salary;
五、触发器(Triggers)
概念与作用
概念:在特定数据库事件发生时自动执行的代码块
核心作用:
自动维护数据完整性
实现审计跟踪
执行业务规则
CRUD操作
-- 创建触发器 (Create)
CREATE TRIGGER audit_employee_changes
AFTER UPDATE OR DELETE ON employees
FOR EACH ROW
BEGIN
INSERT INTO employee_audit (
action_type,
employee_id,
changed_at
)
VALUES (
CASE
WHEN UPDATING THEN 'UPDATE'
WHEN DELETING THEN 'DELETE'
END,
OLD.id,
CURRENT_TIMESTAMP
);
END;
-- 查看触发器 (Read)
-- MySQL
SHOW TRIGGERS;
-- SQL Server
SELECT * FROM sys.triggers;
-- 修改触发器 (Alter)
-- 多数数据库不支持直接修改,需删除重建
DROP TRIGGER audit_employee_changes;
-- 然后重新创建
-- 禁用/启用触发器
-- SQL Server
DISABLE TRIGGER audit_employee_changes ON employees;
ENABLE TRIGGER audit_employee_changes ON employees;
-- 删除触发器 (Drop)
DROP TRIGGER audit_employee_changes;
六、约束(Constraints)
概念与作用
概念:强制数据完整性规则
核心作用:
保证数据准确性和一致性
维护表间关系
防止无效数据输入
CRUD操作
-- 创建约束 (Create)
-- 创建表示例
CREATE TABLE orders (
order_id INT PRIMARY KEY,
customer_id INT NOT NULL,
amount DECIMAL(10,2) CHECK (amount > 0),
order_date DATE DEFAULT CURRENT_DATE,
CONSTRAINT fk_customer
FOREIGN KEY (customer_id)
REFERENCES customers(id)
);
-- 添加约束 (Alter)
ALTER TABLE employees
ADD CONSTRAINT uk_email UNIQUE (email);
ALTER TABLE orders
ADD CONSTRAINT chk_amount CHECK (amount >= 0);
-- 删除约束 (Drop)
ALTER TABLE orders
DROP CONSTRAINT fk_customer;
-- 禁用/启用约束
-- Oracle
ALTER TABLE employees DISABLE CONSTRAINT uk_email;
ALTER TABLE employees ENABLE CONSTRAINT uk_email;
七、物化视图(Materialized Views)
概念与作用
概念:物理存储查询结果的特殊视图
核心作用:
预计算和缓存复杂查询结果
提高聚合查询性能
支持离线数据分析
CRUD操作
-- 创建物化视图 (Create)
-- Oracle示例
CREATE MATERIALIZED VIEW sales_summary
REFRESH FAST ON COMMIT
AS
SELECT product_id,
SUM(quantity) AS total_quantity,
AVG(unit_price) AS avg_price
FROM sales
GROUP BY product_id;
-- PostgreSQL示例
CREATE MATERIALIZED VIEW mv_emp_dept AS
SELECT d.name AS dept_name,
COUNT(e.id) AS emp_count
FROM departments d
LEFT JOIN employees e ON d.id = e.dept_id
GROUP BY d.name;
-- 查询物化视图 (Read)
SELECT * FROM sales_summary
WHERE product_id = 100;
-- 刷新物化视图 (Update)
-- Oracle
EXEC DBMS_MVIEW.REFRESH('sales_summary');
-- PostgreSQL
REFRESH MATERIALIZED VIEW mv_emp_dept;
-- 删除物化视图 (Drop)
DROP MATERIALIZED VIEW sales_summary;
八、同义词(Synonyms)
概念与作用
概念:数据库对象的别名
核心作用:
简化对象引用
提供位置透明性
方便对象重命名或迁移
CRUD操作
-- 创建同义词 (Create)
-- 私有同义词
CREATE SYNONYM emp FOR hr.employees;
-- 公有同义词
CREATE PUBLIC SYNONYM dept FOR hr.departments;
-- 使用同义词 (Read)
SELECT * FROM emp WHERE dept_id = 10;
-- 修改同义词 (Alter)
-- 同义词不能直接修改,需删除重建
DROP SYNONYM emp;
CREATE SYNONYM emp FOR hr.new_employees;
-- 删除同义词 (Drop)
DROP SYNONYM emp;
DROP PUBLIC SYNONYM dept;
九、序列(Sequences)
概念与作用
概念:生成唯一数值序列的对象
核心作用:
为主键列提供唯一值
生成订单号等业务序列
避免主键冲突
CRUD操作
-- 创建序列 (Create)
CREATE SEQUENCE order_id_seq
START WITH 1000
INCREMENT BY 1
MAXVALUE 999999
CACHE 20;
-- 使用序列 (Read/Next Value)
INSERT INTO orders (order_id, customer_id, amount)
VALUES (order_id_seq.NEXTVAL, 2001, 150.99);
-- 查看当前值
SELECT order_id_seq.CURRVAL FROM dual; -- Oracle
-- 修改序列 (Alter)
ALTER SEQUENCE order_id_seq
INCREMENT BY 5
MAXVALUE 9999999;
-- 删除序列 (Drop)
DROP SEQUENCE order_id_seq;
十、物理存储结构
1. 数据文件(Data Files)
概念:存储实际数据的操作系统文件
作用:
持久化存储表数据和索引
管理磁盘空间分配
管理:
-- 添加数据文件 (Oracle)
ALTER TABLESPACE users ADD DATAFILE '/u01/oradata/users02.dbf' SIZE 500M;
-- 查看数据文件 (MySQL)
SHOW VARIABLES LIKE 'innodb_data_file_path';
2. 日志文件(Log Files)
重做日志(Redo Log):
- 作用:记录所有数据修改,用于故障恢复
回滚日志(Undo Log):
- 作用:存储旧数据版本,支持事务回滚
管理:
-- 查看日志配置 (PostgreSQL)
SELECT name, setting FROM pg_settings WHERE name LIKE '%wal%';
3. 控制文件(Control Files)
概念:数据库的元数据文件
作用:
记录数据库物理结构信息
维护数据库一致性状态
特性:通常需要多副本保证安全
结构关系与最佳实践
最佳实践建议:
表设计:
优先选择适当的数据类型(如INT vs VARCHAR)
使用规范化设计消除冗余
为大型表考虑分区策略
索引策略:
在WHERE子句常用列上创建索引
避免在频繁更新的列上过多索引
定期分析索引使用效率
视图应用:
使用视图封装复杂连接查询
通过视图实现列级安全控制
避免多层嵌套视图影响性能
存储过程使用:
将频繁业务逻辑封装为存储过程
避免在存储过程中进行复杂计算
使用参数化查询防止SQL注入
约束管理:
始终定义主键和外键约束
使用CHECK约束防止无效数据
在开发环境启用所有约束,生产环境酌情禁用
物理存储优化:
分离数据和索引到不同磁盘
定期维护表空间和文件组
监控日志文件大小和切换频率
关键提示:不同数据库系统(Oracle/MySQL/SQL Server/PostgreSQL)以及国产数据库(达梦/人大金仓/openGauss)在实现细节上存在差异,上述示例主要使用标准SQL语法。实际应用中请参考具体数据库的官方文档。
十、国产数据库 vs 传统数据库:结构体系深度对比
一、核心结构:高度相似性
国产数据库与传统数据库(如Oracle、MySQL)在核心逻辑结构上保持高度一致,均遵循SQL标准和关系型数据库基本原理。
二、关键差异领域
1. 安全体系结构
国产数据库强化安全设计:
2. 物理存储结构
组件 | 传统数据库 | 国产数据库 | 特点差异 |
---|---|---|---|
存储引擎 | InnoDB (MySQL) | 达梦行列混合存储 | 混合引擎优化分析型负载 |
数据文件 | .ibd (MySQL) | .dbf (达梦) | 文件结构专有格式 |
日志系统 | Redo/Undo Log (Oracle) | 达梦双日志(REDO/ARCHIVE) | 增强故障恢复能力 |
表空间 | Tablespace (Oracle) | 达梦表空间支持加密属性 | 国密算法集成 |
3. 分布式架构
国产数据库原生分布式支持:
4. 特殊结构组件
国产数据库特有结构:
安全审计结构:
国密算法支持:
闪回查询结构
三、核心结构对比表
数据库结构 | 传统数据库 | 国产数据库 | 差异说明 |
---|---|---|---|
表(Table) | 标准行存储 | 支持行列混合存储 | HTAP场景优化 |
索引 | B树/哈希/全文 | 增加国密算法索引 | 安全增强 |
视图 | 标准视图 | 支持安全策略视图 | 数据脱敏集成 |
存储过程 | PL/SQL, T-SQL | 兼容+扩展安全语法 | 三权分立权限控制 |
物理文件 | 通用文件格式 | 专有加密格式 | 国密算法支持 |
事务日志 | Redo/Undo | 双日志+国密校验 | 安全增强 |
分布式表 | 需中间件 | 原生分布式支持 | OceanBase/TiDB等原生实现 |
四、开发操作差异示例
安全增强操作(国产数据库)
分布式操作(OceanBase)
兼容性操作(国产数据库)
五、结构差异总结
维度 | 传统数据库 | 国产数据库 |
---|---|---|
设计理念 | 通用性优先 | 安全可控优先 |
核心架构 | 单机/共享磁盘集群 | 原生分布式架构 |
存储引擎 | 行存储为主 | 行列混合存储 |
加密支持 | 国际标准算法 | 国密算法(SM2/SM3/SM4) |
权限模型 | RBAC标准模型 | 三权分立强化模型 |
高可用机制 | 主从复制/共享存储 | 多副本Paxos/Raft协议 |
生态兼容 | 自有生态 | 多生态兼容(Oracle/MySQL/PG) |
十一、数据库分片详解:分布式架构的核心技术
一、分片本质:水平切分数据
数据库分片(Sharding) 是将单一大型数据库的水平分割成多个小型数据库子集的技术。每个子集称为一个分片(Shard),包含原数据的子集,共同组成完整的逻辑数据集。
二、为什么需要分片?
单机数据库的瓶颈
问题类型 | 具体表现 | 分片解决方案 |
---|---|---|
存储瓶颈 | 单机磁盘空间不足 | 数据分散到多台机器 |
性能瓶颈 | 高并发下CPU/内存超载 | 负载均衡到多个计算节点 |
可用性风险 | 单点故障导致全面宕机 | 故障隔离,部分分片仍可用 |
运维困难 | 巨型表备份/索引耗时过长 | 小规模分片独立管理 |
典型应用场景
用户超过千万的社交平台
日订单百万级的电商系统
物联网设备海量数据采集
金融交易高频处理系统
三、分片核心实现机制
1. 分片键(Shard Key)
作用:决定数据分布规则的列(如
user_id
,order_date
)选择原则:
高基数(大量唯一值)
数据均匀分布
匹配查询模式
2. 分片策略对比
策略类型 | 工作原理 | 优点 | 缺点 |
---|---|---|---|
范围分片 | 按分片键值范围划分 (如user_id 1-1000在分片1) |
范围查询高效 | 容易产生热点数据 |
哈希分片 | 对分片键哈希取模分配 (hash(user_id) % N) |
数据分布均匀 | 范围查询效率低 |
地理分片 | 按地理位置分配 (如华北、华东区域) |
符合业务特征 | 需要预定义分区规则 |
目录分片 | 查表路由到具体分片 | 灵活调整 | 需维护映射表 |
3. 分片架构组件
分片路由器(Router):解析SQL并路由到目标分片
配置服务器(Config Server):存储分片元数据和映射规则
数据节点(Shard):实际存储数据的数据库实例
管理节点(Control Plane):负责分片均衡、扩缩容
四、分片的技术挑战与解决方案
挑战类型 | 问题表现 | 解决方案 |
---|---|---|
跨分片事务 | 分布式事务一致性难保证 | 使用两阶段提交(2PC) TSO全局时间戳 |
跨分片查询 | JOIN/聚合操作效率低下 | 全局二级索引 结果归并优化 |
数据均衡 | 新增分片后数据分布不均 | 动态再平衡算法 虚拟分片技术 |
分片管理 | 扩缩容操作复杂 | 在线分片迁移工具 自动化运维平台 |
开发复杂性 | 需要处理分片路由逻辑 | 智能中间件(ShardingSphere) ORM框架集成 |
五、分片 vs 分区 vs 分库分表
特性 | 分片(Sharding) | 分区(Partitioning) | 分库分表 |
---|---|---|---|
数据分布 | 跨物理服务器/节点 | 单机内部存储划分 | 跨多个数据库实例 |
扩展性 | 线性扩展能力强 | 受单机资源限制 | 扩展性中等 |
事务支持 | 需分布式事务协调 | 标准ACID事务 | 跨库事务复杂 |
管理复杂度 | 高(需专用工具) | 低(数据库内置支持) | 中(需应用层管理) |
典型产品 | OceanBase, TiDB, CockroachDB | MySQL Partitioning, PostgreSQL | MyCat, ShardingSphere |
适用场景 | 超大规模分布式系统 | 单机大表管理 | 中等规模分布式系统 |
六、最佳实践指南
1. 分片决策流程
2. 分片键选择原则
高频查询字段:WHERE条件中最常出现的列
数据均匀性:确保分片间数据量平衡
业务关联性:相关联的数据尽量在同一分片
避免热点:不选单调递增的列(如自增ID)
3. 分片扩容步骤
添加新物理节点到集群
设置新分片并配置路由规则
自动迁移10%-15%数据到新分片
验证数据一致性
逐步增加迁移比例至完成
移除旧节点(可选)
4. 应避免分片的情况
数据量小于500GB
事务密集型应用(如银行核心系统)
复杂分析查询为主的场景
缺乏专业运维团队时
结论:分片的本质是权衡
数据库分片通过空间换时间和复杂度换扩展性的权衡,解决了海量数据场景下的存储与计算瓶颈。现代分布式数据库(尤其是国产数据库如OceanBase/TiDB)通过以下创新降低了分片复杂度:
自动化分片管理:自动平衡+在线扩缩容
分布式事务优化:高性能TSO+优化2PC
智能查询路由:自动识别跨分片操作
混合负载支持:TP与AP查询的统一处理
十二、数据库分片详解:分表还是分库?
一、分片的本质:数据分布的维度
数据库分片的核心是分数据,根据切分粒度的不同,主要分为两种类型:
1. 表级别分片(最常见)
本质:将单个大表拆分成多个小表
特点:
表结构相同,数据不同
每个分片存储部分数据行
共享同一个数据库实例
2. 数据库级别分片
本质:将整个数据库拆分成多个独立子库
特点:
每个分片是完整数据库实例
包含多张表及其关系
部署在不同物理节点
二、表级别分片详解(分表)
水平分表 vs 垂直分表
水平分表(最常用)
原理:按行切分,每个分片存储不同数据行
分片键:用户ID、订单日期等
示例:
-- 原始订单表(1亿行) CREATE TABLE orders ( order_id BIGINT PRIMARY KEY, user_id INT, amount DECIMAL(10,2), order_date DATE ); -- 水平分表(按用户ID哈希分片) CREATE TABLE orders_0000 ... ; -- 存储user_id % 4 = 0的数据 CREATE TABLE orders_0001 ... ; -- 存储user_id % 4 = 1的数据 CREATE TABLE orders_0002 ... ; -- 存储user_id % 4 = 2的数据 CREATE TABLE orders_0003 ... ; -- 存储user_id % 4 = 3的数据
垂直分表
原理:按列切分,将宽表拆分为多个窄表
适用场景:包含大量不常用列的表
示例:
-- 原始用户表(含不常用列) CREATE TABLE users ( user_id INT PRIMARY KEY, username VARCHAR(50), password VARCHAR(100), last_login DATETIME, profile_json TEXT, -- 不常用的大字段 preferences TEXT ); -- 垂直拆分 CREATE TABLE users_basic ( user_id INT PRIMARY KEY, username VARCHAR(50), password VARCHAR(100) ); CREATE TABLE users_extended ( user_id INT PRIMARY KEY, last_login DATETIME, profile_json TEXT, preferences TEXT );
三、数据库级别分片详解(分库)
1. 分库分表(Sharding Database & Table)
本质:表分片 + 库分片
特点:
分片存储在不同数据库实例
每个实例包含部分表分片
真正实现分布式存储
2. 逻辑数据库分片
本质:单实例内的多逻辑库
特点:
单个物理数据库实例
创建多个逻辑数据库
每个逻辑库存储部分数据
示例:
-- 物理服务器上创建多个逻辑库 CREATE DATABASE shard_1; CREATE DATABASE shard_2; -- 每个逻辑库有相同的表结构 USE shard_1; CREATE TABLE orders (...); USE shard_2; CREATE TABLE orders (...);
四、分片类型对比表
特性 | 表级别分片 | 数据库级别分片 | 逻辑数据库分片 |
---|---|---|---|
切分对象 | 单表 | 数据库实例 | 逻辑数据库 |
存储位置 | 同库不同表 | 不同物理节点 | 同实例不同库 |
扩展性 | 中等 | 高(分布式) | 低 |
管理复杂度 | 中等 | 高 | 低 |
事务支持 | 简单 | 需分布式事务 | 简单 |
典型产品 | MySQL分区表 | OceanBase, TiDB | SQL Server分片 |
适用场景 | 单表过大 | 超高并发/海量数据 | 简单隔离需求 |
五、如何选择分片策略?
决策流程图
选择建议:
优先表分片:
单表超过5000万行
查询性能明显下降
使用数据库内置分区功能(如MySQL Partitioning)
考虑分库分表:
数据总量超过1TB
并发请求超10K QPS
需要水平扩展写能力
使用分布式数据库(如OceanBase/TiDB)
避免分片:
数据量小于100GB
事务密集型应用
缺乏专业运维团队
六、分片最佳实践
1. 分片键选择原则
高基数:用户ID > 订单状态
均匀分布:避免数据倾斜
业务相关:匹配查询模式
2. 分片数量规划
数据规模 | 建议分片数 | 说明 |
---|---|---|
< 500GB | 2-4 | 避免过度分片 |
500GB-2TB | 8-16 | 平衡性能与管理 |
> 2TB | 32+ | 支持线性扩展 |
3. 分片管理工具
国产:
OceanBase OCP(运维平台)
TiDB Dashboard
开源:
Apache ShardingSphere
Vitess(Kubernetes原生)
商业:
AWS DMS(分片迁移)
Aliyun DTS
结论:分片本质是数据分布策略
表分片是基础:
解决单表过大问题
在单个数据库实例内实现
分库分表是进阶:
真正实现分布式架构
需要处理跨节点事务
现代数据库趋势:
国产分布式数据库(如OceanBase/TiDB)已原生集成分片能力
自动处理数据分布、事务协调和查询路由
开发者无需关注底层分片细节
无论分表还是分库,分片的最终目标都是:通过数据分布解决单点瓶颈。选择合适的分片策略,需要根据数据规模、业务特征和技术栈综合决策。对于大多数现代应用,优先考虑原生支持分布式架构的数据库,可以大幅降低分片管理的复杂度。