DM8支持图形化和命令行两种安装方式。推荐练熟命令行:
sudo mkdir -p /dm/dmdbms su - dmdba ./DMInstall.bin -i sudo /dm/dmdbms/script/root/root_installer.sh
-i 进入交互式安装,依次选语言、key文件(可跳过)、安装路径、安装类型。装完必须执行 root_installer.sh,它负责创建DmAPService等系统服务,漏掉这一步后面注册实例服务会出问题。安装前可以用 ldd --version 和 uname -r 确认glibc和内核版本满足要求,DM对麒麟、统信等国产系统都有适配。
实例由 dminit 创建:
/dm/dmdbms/bin/dminit path=/dm/data DB_NAME=HRDB INSTANCE_NAME=HRSVR \ PORT_NUM=5237 CHARSET=1 PAGE_SIZE=16 EXTENT_SIZE=16 \ LOG_SIZE=512 LOG_PATH=/dm/data/HRDB/DM01.log \ LOG_PATH=/dm/data/HRDB/DM02.log LOG_PATH=/dm/data/HRDB/DM03.log \ SYSDBA_PWD=Dameng123 SYSAUDITOR_PWD=Dameng123
需要特别注意的是一组"建库即定型"的参数:CHARSET(1为UTF-8,0为GB18030)、PAGE_SIZE(页大小,4/8/16/32K)、EXTENT_SIZE(簇大小)、CASE_SENSITIVE(大小写敏感性)。这些在实例创建后都无法修改,选错了就得重建。
实例创建后,数据文件、控制文件、联机日志都落在 path 指定目录下,主配置文件是 dm.ini,后续内存、连接数、兼容性参数都在里面调。
实例注册为系统服务后通过脚本启停:
sudo /dm/dmdbms/script/root/dm_service_installer.sh -t dmserver \
-dm_ini /dm/data/HRDB/dm.ini -p DMSERVER
./DmServiceDMSERVER start # start | stop | restart | status
一台服务器只能安装一套DM软件,装新版本前要先卸载旧版。卸载同样分图形化和命令行两种方式,命令行是 uninstall.sh -i,交互中会询问是否删除 dm_svc.conf 配置文件。卸载前先停掉所有实例服务。
表空间是DM中最大的逻辑存储单元。考试中要求数据和索引分离存放,这本身就是存储设计的良好实践—分散IO压力:
CREATE TABLESPACE HRDATA DATAFILE
'/dm/data/HRDB/HRDATA01.DBF' SIZE 128 AUTOEXTEND ON NEXT 64 MAXSIZE 20480,
'/dm/data/HRDB/HRDATA02.DBF' SIZE 128 AUTOEXTEND ON NEXT 64 MAXSIZE 20480;
CREATE TABLESPACE HRIDX DATAFILE
'/dm/data/HRDB/HRIDX.DBF' SIZE 64 AUTOEXTEND ON NEXT 32 MAXSIZE 10240;
表空间的日常维护操作手册讲得很全,值得记住的有四类:
-- 增加数据文件
ALTER TABLESPACE dmdata ADD DATAFILE '/dm/data/DAMENG/DMDATA03.DBF' SIZE 500;
-- 调整文件大小(可增可缩)
ALTER TABLESPACE dmdata RESIZE DATAFILE '/dm/data/DAMENG/DMDATA01.DBF' TO 256;
-- 修改自动扩展属性
ALTER TABLESPACE dmdata DATAFILE '/dm/data/DAMENG/DMDATA02.DBF' AUTOEXTEND OFF;
-- 迁移文件路径:先脱机,改名,再联机
ALTER TABLESPACE dmdata OFFLINE;
ALTER TABLESPACE dmdata RENAME DATAFILE '/dm/data/DAMENG/DMDATA01.DBF'
TO '/dm/data/DAMENG/TBS/DMDATA01.DBF';
ALTER TABLESPACE dmdata ONLINE;
手册的常见问题里有一个很典型的报错:创建表空间时报 [-7014]:创建数据文件失败,原因不是SQL写错了,而是dmdba用户对目标目录没有写权限。数据库报错不一定出在数据库层,遇到错误先看操作系统权限。
重做日志(REDO)记录所有数据页的修改。实例运行中可以在线扩容:
ALTER DATABASE ADD LOGFILE '/dm/data/DAMENG/DAMENG03.log' SIZE 256;
ALTER DATABASE RESIZE LOGFILE '/dm/data/DAMENG/DAMENG03.log' TO 500;
dminit阶段写了三个LOG_PATH就是三个联机日志文件,后期不够可以随时加。
DM的权限体系是三层结构:PROFILE管口令策略,角色打包权限,用户挂接前两者:
CREATE PROFILE PRO_HR LIMIT PASSWORD_REUSE_MAX 3 PASSWORD_LIFE_TIME 90;
CREATE ROLE ROLE_HR;
GRANT CREATE TABLE, CREATE VIEW, CREATE INDEX,
CREATE MATERIALIZED VIEW, CREATE PROCEDURE TO ROLE_HR;
CREATE USER HR IDENTIFIED BY "Dameng123"
PROFILE PRO_HR
DEFAULT TABLESPACE HRDATA
DEFAULT INDEX TABLESPACE HRIDX;
GRANT ROLE_HR TO HR;
PROFILE的常用参数除了密码复用次数(PASSWORD_REUSE_MAX)和有效期(PASSWORD_LIFE_TIME),还有 FAILED_LOGIN_ATTEMPTS(失败锁定阈值)、PASSWORD_LOCK_TIME(锁定时长)、PASSWORD_GRACE_TIME(过期宽限期)。
这里有一个值得单独说的边界问题。考题里有个需求是"用户超过90天未登录则锁定账号",但翻遍PROFILE的参数列表,并不存在原生的"未登录天数"选项。实际工程中这个需求要靠登录触发器检查上次登录时间来实现。
另外DM自带三权分立设计,SYSDBA管数据库、SYSAUDITOR管审计,初始化时分别设置密码。
还有一个手册里的高频报错值得记录:跨用户调用函数时报 [-5505]:没有执行XX对象权限,解法是由属主授权:
GRANT EXECUTE ON dmhr.f_getempemail TO testuser;
DM的DDL语法与Oracle高度兼容,主键、外键、CHECK、默认值一应俱全:
ALTER TABLE HR.T_EMP ADD CONSTRAINT PK_T_EMP PRIMARY KEY (EMP_ID);
ALTER TABLE HR.T_EMP ADD CONSTRAINT FK_EMP_DEPT
FOREIGN KEY (DEPT_ID) REFERENCES HR.T_DEPT(DEPT_ID);
ALTER TABLE HR.T_EMP ADD CONSTRAINT CK_EMP_SALARY CHECK (SALARY >= 1800);
ALTER TABLE HR.T_ATDLOG MODIFY LOGTIME DEFAULT SYSDATE;
约束命名建议养成 PK_表名、FK_子表_父表、CK_表名_字段 的习惯,出问题时报错信息里的约束名能直接告诉你错在哪。外键的存在还决定了数据装载顺序:必须先导父表再导子表,顺序反了就是连锁约束报错。
统计类视图的核心技巧是 SUM(CASE WHEN ... THEN 1 ELSE 0 END) 条件聚合。考试里用它按部门、员工、月份统计迟到和早退次数:
CREATE OR REPLACE VIEW HR.V_EMPLATETIMES AS
SELECT D.DEPT_NAME, E.EMP_NAME,
TO_CHAR(A.LOGTIME, 'YYYYMM') AS ATTENDANCE_MONTH,
SUM(CASE WHEN A.ATDTYPE = 1 AND A.STATUS = 1 THEN 1 ELSE 0 END) AS LATE_COUNT,
SUM(CASE WHEN A.ATDTYPE = 2 AND A.STATUS = 1 THEN 1 ELSE 0 END) AS EARLY_LEAVE_COUNT
FROM HR.T_ATDLOG A
JOIN HR.T_EMP E ON A.EMP_ID = E.EMP_ID
JOIN HR.T_DEPT D ON A.DEPT_ID = D.DEPT_ID
WHERE A.STATUS = 1
GROUP BY D.DEPT_NAME, E.EMP_NAME, TO_CHAR(A.LOGTIME, 'YYYYMM');
一行数据按条件折算成1或0再求和,比嵌套子查询拼COUNT清晰一些。
物化视图和普通视图的本质区别是数据是否真实落盘:普通视图保存的是一段SQL,每次查询现算;物化视图存储结果集,查询快但需要在源表变更后刷新:
CREATE MATERIALIZED VIEW HR.MV_ATDLATE TABLESPACE HRDATA AS
SELECT LOGTIME, EMP_ID, DEPT_ID, ATDTYPE, STATUS
FROM HR.T_ATDLOG WHERE STATUS = 1;
REFRESH MATERIALIZED VIEW HR.MV_ATDLATE;
建好先手动REFRESH再验证数据,否则查到的是空集。
索引单独建到HRIDX表空间,与数据文件物理隔离:
CREATE INDEX HR.IX_ATDLOG_LOGTIME ON HR.T_ATDLOG(LOGTIME) TABLESPACE HRIDX;
dexp/dimp是DM的逻辑导出导入工具,对标Oracle的exp/imp。导出有FULL(整库)、OWNER(按用户)、SCHEMAS(按模式)、TABLES(按表)四种级别,日常迁移业务用户用SCHEMAS最顺手:
cd /dm/dmdbms/bin
./dexp USERID=HR/Dameng123@localhost:5237 FILE=hr.dmp LOG=hr.log \
DIRECTORY=/dm/backup/dexp SCHEMAS=HR
导入时 REMAP_SCHEMA 可以完成属主映射,把HR的全部对象和数据搬进新用户HREXP:
./dimp USERID=HREXP/Dameng123@localhost:5237 FILE=/dm/backup/dexp/hr.dmp \ LOG=hr_imp.log SCHEMAS=HR REMAP_SCHEMA=HR:HREXP
两个使用要点:DIRECTORY目录要提前手动创建,工具不会建;导入完成后用 DBA_OBJECTS 检查有没有STATUS为INVALID的对象,视图依赖关系错乱时会出现,必要时重新编译或重导。
SELECT OBJECT_NAME, OBJECT_TYPE, STATUS FROM DBA_OBJECTS WHERE OWNER = 'HREXP';
手册把触发器放在开发的最后,分两类。表级触发器的经典场景是审计留痕——删除员工的瞬间把旧记录抄进历史表:
CREATE OR REPLACE TRIGGER dmhr.tr_delemp
BEFORE DELETE ON dmhr.employee
FOR EACH ROW
BEGIN
INSERT INTO dmhr.emp_history(employee_id, employee_name, phone_num,
start_date, end_date, job_id, department_id, salary)
VALUES(:OLD.employee_id, :OLD.employee_name, :OLD.phone_num, :OLD.hire_date,
curdate, :OLD.job_id, :OLD.department_id, :OLD.salary);
END;
事件级触发器则可以做DDL防护,比如阻止对某个模式下对象的DROP和TRUNCATE:
CREATE OR REPLACE TRIGGER DMHR.TR_DDLPROTECT
BEFORE DROP OR TRUNCATE ON DMHR.SCHEMA
BEGIN
RAISE_APPLICATION_ERROR(-20001, '不允许' || :EVENTINFO.OPTYPE ||
'对象' || :EVENTINFO.OBJECTNAME);
END;
:OLD 伪记录和 :EVENTINFO 事件属性是两类触发器各自的核心抓手。
DM把各语言驱动随服务端一起发布,drivers目录下有Python、JDBC、ODBC、DPI等接口,不用单独去找安装包。
dmPython走标准的DB-API 2.0风格,用过pymysql或cx_Oracle可以直接上手:
cd /dm/dmdbms/drivers/python/dmPython
python3 setup.py install --user
import dmPython
conn = dmPython.connect(user='HR', password='Dameng123',
server='localhost', port=5237)
cursor = conn.cursor()
cursor.execute('SELECT * FROM HR.T_EMP WHERE ROWNUM <= 10')
for row in cursor.fetchall():
print(row)
cursor.close()
conn.close()
ODBC方式则需要先源码编译unixODBC(configure、make、make install三部曲),再配置两个文件:odbcinst.ini声明驱动指向 /dm/dmdbms/drivers/odbc/libdodbc.so,odbc.ini配置数据源的服务器、端口、用户名密码,最后用 isql dm -v 测试连通。
按知识体系重新梳理一遍之后,DCA的轮廓其实很清晰:覆盖了DBA日常工作的完整闭环,从把软件装上、把实例建起来,到管存储、管权限、管对象、做备份、写程序、接应用。
文章
阅读量
获赞
