安全警告:检测到异常行为,所有操作已被记录!
用户ID: 加载中...

数据库技术总结

    

数据库分类
关系型数据库
非关系型数据库
传统关系型
MySQL/PostgreSQL
国产关系型
DM/Kingbase/openGauss
文档型 MongoDB
键值型 Redis
时序型 TDengine
图数据库 Galaxybase

一、数据库类型

1. 关系型数据库(RDBMS)

2. 非关系型数据库(NoSQL)

二、功能特点对比

类型 代表产品 特点
传统关系型 MySQL ACID事务支持、成熟稳定、生态完善
国产关系型 达梦DM 高安全性、兼容Oracle、自主可控
分布式关系型 OceanBase 分布式架构、强一致性、高可用性、HTAP混合负载
文档型 MongoDB 灵活JSON结构、动态模式、水平扩展
时序数据库 TDengine 高性能时序数据处理、列式存储、内置缓存和流式计算(国产)
图数据库 Galaxybase 大规模图分析、并行图计算、支持万亿边关系(国产)

三、安全模式

通用安全机制

国产数据库安全增强

  1. 达梦数据库

    • 三权分立体系(系统管理员、安全管理员、审计员)

    • 强制访问控制(MAC)

    • 数据脱敏功能

  2. 华为 openGauss

    • 全密态数据库(客户端加密)

    • 动态数据掩码

    • 行级访问控制

四、数据库安全设计

数据库安全设计
认证机制
访问控制
数据加密
审计监控
国产增强

一、数据库安全设计详解

1. 关系型数据库安全

MySQL

PostgreSQL

2. 国产关系型数据库安全

达梦数据库(DM)

华为 openGauss

3. 非关系型数据库安全

MongoDB

Redis

TDengine(国产时序数据库)

五、 数据库基本操作命令

关系型数据库操作与特性

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'@'%';

事务与锁机制

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;

事务与锁机制

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;

事务与锁机制

华为 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));

事务与锁机制

人大金仓 (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;

事务与锁机制

阿里 (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"}]
});

事务与锁机制

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:*

事务与锁机制

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;

事务与锁机制

总结对比

数据库 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)

八、事务与锁

一、事务与锁的核心关系

事务
需要数据一致性
使用锁机制
控制并发访问
保证ACID特性

事务和锁是数据库管理系统(DBMS)中密不可分的两个核心概念,它们共同协作以保证数据库的ACID特性(原子性、一致性、隔离性、持久性)。

核心关系:

  1. 事务是目标:事务定义了数据库操作的逻辑单元

  2. 锁是手段:锁是实现事务隔离性和一致性的关键技术

  3. 协同工作:锁机制确保事务执行过程中数据不被意外修改

二、事务的基本概念

ACID特性:

  1. 原子性 (Atomicity):事务中的所有操作要么全部完成,要么全部不完成

  2. 一致性 (Consistency):事务执行前后数据库处于一致状态

  3. 隔离性 (Isolation):并发事务互不干扰

  4. 持久性 (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) - 表明将在更细粒度加排他锁 仅与意向锁兼容

锁的粒度:

  1. 行级锁(最细粒度,并发度高)

  2. 页级锁(折中方案)

  3. 表级锁(最粗粒度,并发度低)

四、事务与锁的协同工作原理

工作流程:

事务A数据库锁管理器开始事务,读取数据行X请求X的共享锁(S)授予S锁返回数据更新数据行X请求升级为排他锁(X)检查冲突(等待其他锁释放)授予X锁更新成功提交事务释放所有锁事务A数据库锁管理器

关键交互点:

  1. 读操作:自动获取共享锁(S Lock)

  2. 写操作:自动获取排他锁(X Lock)

  3. 锁升级:当读取后需要修改时,S锁升级为X锁

  4. 锁释放:事务结束时自动释放所有锁

五、锁在事务中的核心作用

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)

概念与作用

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)

概念与作用

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)

概念与作用

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)

-- 查看日志配置 (PostgreSQL)
SELECT name, setting FROM pg_settings WHERE name LIKE '%wal%';

3. 控制文件(Control Files)

结构关系与最佳实践

查询
基于
使用
包含
触发
调用
操作
提供ID
加速
应用系统
视图
索引
约束
触发器
存储过程
序列
物化视图

最佳实践建议:

  1. 表设计

    • 优先选择适当的数据类型(如INT vs VARCHAR)

    • 使用规范化设计消除冗余

    • 为大型表考虑分区策略

  2. 索引策略

    • 在WHERE子句常用列上创建索引

    • 避免在频繁更新的列上过多索引

    • 定期分析索引使用效率

  3. 视图应用

    • 使用视图封装复杂连接查询

    • 通过视图实现列级安全控制

    • 避免多层嵌套视图影响性能

  4. 存储过程使用

    • 将频繁业务逻辑封装为存储过程

    • 避免在存储过程中进行复杂计算

    • 使用参数化查询防止SQL注入

  5. 约束管理

    • 始终定义主键和外键约束

    • 使用CHECK约束防止无效数据

    • 在开发环境启用所有约束,生产环境酌情禁用

  6. 物理存储优化

    • 分离数据和索引到不同磁盘

    • 定期维护表空间和文件组

    • 监控日志文件大小和切换频率

关键提示:不同数据库系统(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. 分布式架构

国产数据库原生分布式支持

客户端
协调节点
数据分片1
数据分片2
数据分片N
计算节点
存储节点

4. 特殊结构组件

国产数据库特有结构

  1. 安全审计结构

  2. 国密算法支持

  3. 闪回查询结构

三、核心结构对比表

数据库结构 传统数据库 国产数据库 差异说明
表(Table) 标准行存储 支持行列混合存储 HTAP场景优化
索引 B树/哈希/全文 增加国密算法索引 安全增强
视图 标准视图 支持安全策略视图 数据脱敏集成
存储过程 PL/SQL, T-SQL 兼容+扩展安全语法 三权分立权限控制
物理文件 通用文件格式 专有加密格式 国密算法支持
事务日志 Redo/Undo 双日志+国密校验 安全增强
分布式表 需中间件 原生分布式支持 OceanBase/TiDB等原生实现

四、开发操作差异示例

  1. 安全增强操作(国产数据库)

  2. 分布式操作(OceanBase)

  3. 兼容性操作(国产数据库)

五、结构差异总结

维度 传统数据库 国产数据库
设计理念 通用性优先 安全可控优先
核心架构 单机/共享磁盘集群 原生分布式架构
存储引擎 行存储为主 行列混合存储
加密支持 国际标准算法 国密算法(SM2/SM3/SM4)
权限模型 RBAC标准模型 三权分立强化模型
高可用机制 主从复制/共享存储 多副本Paxos/Raft协议
生态兼容 自有生态 多生态兼容(Oracle/MySQL/PG)

十一、数据库分片详解:分布式架构的核心技术

一、分片本质:水平切分数据

原始大表
分片1
分片2
分片3
...
分片N
应用请求
分片路由器

数据库分片(Sharding) 是将单一大型数据库的水平分割成多个小型数据库子集的技术。每个子集称为一个分片(Shard),包含原数据的子集,共同组成完整的逻辑数据集。

二、为什么需要分片?

单机数据库的瓶颈

问题类型 具体表现 分片解决方案
存储瓶颈 单机磁盘空间不足 数据分散到多台机器
性能瓶颈 高并发下CPU/内存超载 负载均衡到多个计算节点
可用性风险 单点故障导致全面宕机 故障隔离,部分分片仍可用
运维困难 巨型表备份/索引耗时过长 小规模分片独立管理

典型应用场景

  1. 用户超过千万的社交平台

  2. 日订单百万级的电商系统

  3. 物联网设备海量数据采集

  4. 金融交易高频处理系统

三、分片核心实现机制

1. 分片键(Shard Key)

2. 分片策略对比

策略类型 工作原理 优点 缺点
范围分片 按分片键值范围划分
(如user_id 1-1000在分片1)
范围查询高效 容易产生热点数据
哈希分片 对分片键哈希取模分配
(hash(user_id) % N)
数据分布均匀 范围查询效率低
地理分片 按地理位置分配
(如华北、华东区域)
符合业务特征 需要预定义分区规则
目录分片 查表路由到具体分片 灵活调整 需维护映射表

3. 分片架构组件

客户端
分片路由器
配置服务器
分片1
分片2
分片3
数据节点1-1
数据节点1-2
数据节点2-1
数据节点3-1
管理节点
监控报警

四、分片的技术挑战与解决方案

挑战类型 问题表现 解决方案
跨分片事务 分布式事务一致性难保证 使用两阶段提交(2PC)
TSO全局时间戳
跨分片查询 JOIN/聚合操作效率低下 全局二级索引
结果归并优化
数据均衡 新增分片后数据分布不均 动态再平衡算法
虚拟分片技术
分片管理 扩缩容操作复杂 在线分片迁移工具
自动化运维平台
开发复杂性 需要处理分片路由逻辑 智能中间件(ShardingSphere)
ORM框架集成

五、分片 vs 分区 vs 分库分表

特性 分片(Sharding) 分区(Partitioning) 分库分表
数据分布 跨物理服务器/节点 单机内部存储划分 跨多个数据库实例
扩展性 线性扩展能力强 受单机资源限制 扩展性中等
事务支持 需分布式事务协调 标准ACID事务 跨库事务复杂
管理复杂度 高(需专用工具) 低(数据库内置支持) 中(需应用层管理)
典型产品 OceanBase, TiDB, CockroachDB MySQL Partitioning, PostgreSQL MyCat, ShardingSphere
适用场景 超大规模分布式系统 单机大表管理 中等规模分布式系统

六、最佳实践指南

1. 分片决策流程

评估需求
数据量 > 1TB?
并发 > 10K QPS?
无需分片
需要分片
考虑读写分离

2. 分片键选择原则

3. 分片扩容步骤

  1. 添加新物理节点到集群

  2. 设置新分片并配置路由规则

  3. 自动迁移10%-15%数据到新分片

  4. 验证数据一致性

  5. 逐步增加迁移比例至完成

  6. 移除旧节点(可选)

4. 应避免分片的情况

结论:分片的本质是权衡

数据库分片通过空间换时间复杂度换扩展性的权衡,解决了海量数据场景下的存储与计算瓶颈。现代分布式数据库(尤其是国产数据库如OceanBase/TiDB)通过以下创新降低了分片复杂度:

  1. 自动化分片管理:自动平衡+在线扩缩容

  2. 分布式事务优化:高性能TSO+优化2PC

  3. 智能查询路由:自动识别跨分片操作

  4. 混合负载支持:TP与AP查询的统一处理


十二、数据库分片详解:分表还是分库?

分片对象
表级别分片
数据库级别分片
水平分表
垂直分表
分库分表
逻辑数据库分片

一、分片的本质:数据分布的维度

数据库分片的核心是分数据,根据切分粒度的不同,主要分为两种类型:

1. 表级别分片(最常见)

2. 数据库级别分片

二、表级别分片详解(分表)

水平分表 vs 垂直分表

原始表
水平分表
垂直分表
分片1
行子集
分片2
行子集
分片N
行子集
分片A
列子集
分片B
列子集
水平分表(最常用)
垂直分表

三、数据库级别分片详解(分库)

1. 分库分表(Sharding Database & Table)

应用
分片路由器
数据库实例1
数据库实例2
数据库实例3
orders_0000
orders_0001
orders_0002
orders_0003
orders_0004

2. 逻辑数据库分片

四、分片类型对比表

特性 表级别分片 数据库级别分片 逻辑数据库分片
切分对象 单表 数据库实例 逻辑数据库
存储位置 同库不同表 不同物理节点 同实例不同库
扩展性 中等 高(分布式)
管理复杂度 中等
事务支持 简单 需分布式事务 简单
典型产品 MySQL分区表 OceanBase, TiDB SQL Server分片
适用场景 单表过大 超高并发/海量数据 简单隔离需求

五、如何选择分片策略?

决策流程图

需要分片吗?
数据量 > 1TB?
并发 > 10K QPS?
无需分片
需要强事务?
考虑读写分离
选择分库分表+分布式事务
选择表级别分片

选择建议:

  1. 优先表分片

    • 单表超过5000万行

    • 查询性能明显下降

    • 使用数据库内置分区功能(如MySQL Partitioning)

  2. 考虑分库分表

    • 数据总量超过1TB

    • 并发请求超10K QPS

    • 需要水平扩展写能力

    • 使用分布式数据库(如OceanBase/TiDB)

  3. 避免分片

    • 数据量小于100GB

    • 事务密集型应用

    • 缺乏专业运维团队

六、分片最佳实践

1. 分片键选择原则

2. 分片数量规划

数据规模 建议分片数 说明
< 500GB 2-4 避免过度分片
500GB-2TB 8-16 平衡性能与管理
> 2TB 32+ 支持线性扩展

3. 分片管理工具

结论:分片本质是数据分布策略

  1. 表分片是基础

    • 解决单表过大问题

    • 在单个数据库实例内实现

  2. 分库分表是进阶

    • 真正实现分布式架构

    • 需要处理跨节点事务

  3. 现代数据库趋势

单机数据库
主从复制
表分区
分库分表
原生分布式数据库

    

无论分表还是分库,分片的最终目标都是:通过数据分布解决单点瓶颈。选择合适的分片策略,需要根据数据规模、业务特征和技术栈综合决策。对于大多数现代应用,优先考虑原生支持分布式架构的数据库,可以大幅降低分片管理的复杂度。