1. 为什么需要手动创建DM8示例库
在达梦数据库(DM8)的实际运维中,手动创建示例库是一项基础但关键的技能。很多DBA新手习惯直接使用安装时自带的示例库,但当遇到"索引无法通过表空间扩展"这类报错时(比如常见的c##hf_hshun_yd.pk_sd_shipment_dtl索引在users表空间扩展失败),才发现对表空间机制理解不足。
手动创建示例库的过程,本质上是对DM8存储架构的深度实践。通过这个练习,你能掌握:
- 表空间与数据文件的映射关系
- 用户权限与默认表空间的绑定
- 对象存储的物理分布规律
这比直接使用现成库更能理解后续运维中遇到的ORA-01652类错误(在DM8中表现为类似无法通过128扩展的报错)的本质原因。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 准备工作:环境与权限检查
2.1 确认数据库状态
首先通过管理员账号登录(通常为SYSDBA):
sql复制-- 检查数据库服务状态
select status$ from v$instance;
-- 查看已有表空间
select tablespace_name, status from dba_tablespaces;
2.2 规划存储路径
建议为示例库单独规划存储路径,避免与系统表空间混用。DM8默认安装后通常有这些关键路径:
- 数据文件存放:
/dm8/data/DAMENG - 归档日志:
/dm8/arch - 备份文件:
/dm8/backup
新建专属目录:
bash复制mkdir -p /dm8/data/SAMPLE
chown dmdba:dinstall /dm8/data/SAMPLE
3. 表空间创建实战
3.1 主表空间配置
创建主数据表空间SAMPLE_DATA,注意关键参数:
sql复制CREATE TABLESPACE SAMPLE_DATA
DATAFILE '/dm8/data/SAMPLE/SAMPLE_DATA01.dbf' SIZE 1024
AUTOEXTEND ON NEXT 100
MAXSIZE 20480
EXTENT MANAGEMENT LOCAL
SEGMENT SPACE MANAGEMENT AUTO;
重要参数解析:
AUTOEXTEND ON:启用自动扩展,避免无法扩展错误NEXT 100:每次扩展100MB,根据磁盘IOPS调整MAXSIZE 20480:限制最大20GB,防止失控增长
3.2 临时表空间配置
针对排序操作创建专用临时表空间:
sql复制CREATE TEMPORARY TABLESPACE SAMPLE_TEMP
TEMPFILE '/dm8/data/SAMPLE/SAMPLE_TEMP01.dbf' SIZE 512
AUTOEXTEND ON NEXT 50
MAXSIZE 10240;
3.3 回滚表空间配置
确保事务隔离的回滚空间:
sql复制CREATE UNDO TABLESPACE SAMPLE_UNDO
DATAFILE '/dm8/data/SAMPLE/SAMPLE_UNDO01.dbf' SIZE 1024
AUTOEXTEND ON NEXT 100
MAXSIZE 10240;
4. 用户与权限体系搭建
4.1 创建专属用户
sql复制CREATE USER SAMPLE_USER IDENTIFIED BY "Sample#1234"
DEFAULT TABLESPACE SAMPLE_DATA
TEMPORARY TABLESPACE SAMPLE_TEMP
QUOTA UNLIMITED ON SAMPLE_DATA;
4.2 权限分配策略
sql复制-- 基础权限
GRANT CREATE SESSION, CREATE TABLE TO SAMPLE_USER;
-- 开发常用权限
GRANT CREATE VIEW, CREATE PROCEDURE, CREATE SEQUENCE TO SAMPLE_USER;
-- 特殊场景权限(按需)
GRANT SELECT ANY DICTIONARY TO SAMPLE_USER;
5. 示例对象创建与验证
5.1 基础表结构创建
sql复制-- 创建部门表
CREATE TABLE SAMPLE_USER.DEPARTMENTS (
DEPT_ID NUMBER PRIMARY KEY,
DEPT_NAME VARCHAR2(100) NOT NULL,
LOCATION VARCHAR2(100)
) TABLESPACE SAMPLE_DATA;
-- 创建员工表(带外键)
CREATE TABLE SAMPLE_USER.EMPLOYEES (
EMP_ID NUMBER PRIMARY KEY,
EMP_NAME VARCHAR2(100) NOT NULL,
DEPT_ID NUMBER,
SALARY NUMBER(10,2),
CONSTRAINT FK_DEPT FOREIGN KEY (DEPT_ID)
REFERENCES SAMPLE_USER.DEPARTMENTS(DEPT_ID)
) TABLESPACE SAMPLE_DATA;
5.2 索引优化实践
针对常见查询创建索引,注意表空间指定:
sql复制-- 普通B树索引
CREATE INDEX SAMPLE_USER.IDX_EMP_DEPT ON SAMPLE_USER.EMPLOYEES(DEPT_ID)
TABLESPACE SAMPLE_DATA;
-- 函数索引示例
CREATE INDEX SAMPLE_USER.IDX_EMP_UPPER_NAME ON SAMPLE_USER.EMPLOYEES(UPPER(EMP_NAME))
TABLESPACE SAMPLE_DATA;
6. 监控与维护方案
6.1 表空间使用率监控
sql复制SELECT
a.tablespace_name,
a.bytes/1024/1024 "Total(MB)",
(a.bytes-b.bytes)/1024/1024 "Used(MB)",
b.bytes/1024/1024 "Free(MB)",
round(((a.bytes-b.bytes)/a.bytes)*100,2) "Used(%)"
FROM
(select tablespace_name, sum(bytes) bytes from dba_data_files group by tablespace_name) a,
(select tablespace_name, sum(bytes) bytes from dba_free_space group by tablespace_name) b
WHERE
a.tablespace_name = b.tablespace_name
AND a.tablespace_name = 'SAMPLE_DATA';
6.2 自动扩展告警设置
通过作业监控表空间使用率,当超过80%时触发告警:
sql复制BEGIN
DBMS_SCHEDULER.CREATE_JOB (
job_name => 'CHECK_SAMPLE_SPACE',
job_type => 'PLSQL_BLOCK',
job_action => 'BEGIN
IF get_tablespace_usage(''SAMPLE_DATA'') > 80 THEN
send_alert(''SAMPLE_DATA空间即将耗尽'');
END IF;
END;',
start_date => SYSTIMESTAMP,
repeat_interval => 'FREQ=HOURLY',
enabled => TRUE);
END;
7. 常见问题排查手册
7.1 空间不足错误处理
当出现无法通过128扩展类错误时:
- 检查表空间剩余:
sql复制SELECT tablespace_name, sum(bytes)/1024/1024 free_mb FROM dba_free_space WHERE tablespace_name = 'USERS' GROUP BY tablespace_name; - 临时解决方案:
sql复制ALTER TABLESPACE USERS ADD DATAFILE '/path/to/newfile.dbf' SIZE 2048M; - 根本解决:优化存储架构,避免系统用户使用默认
USERS表空间
7.2 性能问题定位
针对慢查询检查物理存储分布:
sql复制SELECT
segment_name,
segment_type,
tablespace_name,
bytes/1024/1024 size_mb
FROM
dba_segments
WHERE
owner = 'SAMPLE_USER'
ORDER BY
bytes DESC;
8. 高级配置技巧
8.1 表空间文件分散存储
将数据文件分布到不同磁盘,提升IO并行度:
sql复制-- 添加第二个数据文件到不同物理磁盘
ALTER TABLESPACE SAMPLE_DATA
ADD DATAFILE '/dm8/data2/SAMPLE/SAMPLE_DATA02.dbf' SIZE 1024
AUTOEXTEND ON NEXT 100
MAXSIZE 20480;
8.2 自动维护任务配置
设置定期重组任务:
sql复制BEGIN
DBMS_SCHEDULER.CREATE_JOB (
job_name => 'REBUILD_FRAGMENTED_INDEXES',
job_type => 'PLSQL_BLOCK',
job_action => 'BEGIN
FOR idx IN (SELECT owner, index_name
FROM dba_indexes
WHERE tablespace_name=''SAMPLE_DATA''
AND status=''VALID'')
LOOP
EXECUTE IMMEDIATE ''ALTER INDEX ''||idx.owner||''.''||idx.index_name||'' REBUILD'';
END LOOP;
END;',
start_date => SYSTIMESTAMP,
repeat_interval => 'FREQ=WEEKLY; BYDAY=SUN; BYHOUR=2',
enabled => TRUE);
END;
在实际操作中发现,达梦的表空间管理比Oracle更依赖手动规划。特别是在国产化替代场景中,许多从Oracle迁移过来的系统会因为默认参数差异导致空间问题。建议在创建初期就明确每个表空间的增长策略,避免后期被动调整。
