按照考试要求,可选择使用命令或者图行化
# 使用命令
dminit PATH=/dm8/data PAGE_SIZE=8 CASE_SENSITIVE=1 CHARSET=0 BLANK_PAD_MODE=1 DB_NAME=DAMENG INSTANCE_NAME=DMSERVER SYSDBA_PWD=aaa123...A SYSAUDITOR_PWD=aaa123...A PORT_NUM=5236
# 使用图形化
# 自动调整数据库性能参数不要勾选
./dbca.sh
# 配置环境变量
vim .bash_profile
export PATH="$PATH:$DM_HOME/bin:$DM_HOME/tool"
-- 使用命令
CREATE TABLESPACE "TEST" DATAFILE 'TEST-01.DBF' SIZE 500 AUTOEXTEND ON NEXT 10 MAXSIZE UNLIMITED;
-- 使用图形化 使用manager工具 sysdba用户创建即可
-- 使用命令
CREATE USER TEST IDENTIFIED BY "aaa123...A" DEFAULT TABLESPACE TEST;
-- 使用图形化 使用manager工具 sysdba用户创建即可
GRANT RESOURCE, PUBLIC, VTI TO TEST;
GRANT SELECT ANY TABLE TO TEST;
GRANT SELECT ANY VIEW TO TEST;
-- 查看表定义
sp_tabledef('TEST','T1');
select dbms_metadata.get_ddl('TABLE','T1','TEST');
-- LIST_TABLE 参数,创建默认表是否为堆表:0 1
select * from v$dm_ini where para_name ='LIST_TABLE';
-- 查看数据库有哪些分区表
select TABLE_NAME,TABLESPACE_NAME,PARTITIONED from SYS.USER_TABLES where PARTITIONED='YES';
-- 查看分区表的分区信息
select TABLE_NAME,PARTITION_NAME,TABLESPACE_NAME,HIGH_VALUE from SYS.USER_TAB_PARTITIONS where TABLE_NAME='T_F1';
-- 创建三个表空间(TEST用户可以创建)
CREATE TABLESPACE TBS1 DATAFILE 'TBS1.DBF' SIZE 32;
CREATE TABLESPACE TBS2 DATAFILE 'TBS2.DBF' SIZE 32;
CREATE TABLESPACE TBS3 DATAFILE 'TBS3.DBF' SIZE 32;
-- 创建范围分区表使用上述三个表空间
CREATE TABLE T_F1 (
ID INT,
NAME VARCHAR(50)
)
STORAGE (ON TEST)
PARTITION BY RANGE(ID)
(
PARTITION P1 VALUES LESS THAN (1001) TABLESPACE TBS1,
PARTITION P2 VALUES LESS THAN (2001) TABLESPACE TBS2,
PARTITION P3 VALUES LESS THAN (3001) TABLESPACE TBS3
);
-- 都使用默认表空间创建
CREATE TABLE T_F1 (
ID INT,
NAME VARCHAR(50)
)
PARTITION BY RANGE(ID)
(
PARTITION P1 VALUES LESS THAN (1001),
PARTITION P2 VALUES LESS THAN (2001),
PARTITION P3 VALUES LESS THAN (3001)
);
-- 插入数据
BEGIN
for i in 1..2800 LOOP
insert into T_F1 values(i,'AAA'||i);
end LOOP;
commit;
end;
-- 查看p3分区的记录
select * from T_F1 PARTITION (P3);
select * from T_F1_P3;
-- 添加默认分区
ALTER TABLE T_F1 ADD PARTITION PM VALUES LESS THAN (MAXVALUE);
-- 创建列表分区
CREATE TABLE T_SALES (
SALE_ID INT,
SALEMAN VARCHAR(30),
SALEDATE DATETIME,
SALECITY VARCHAR(30)
)
PARTITION BY LIST(SALECITY)
(
PARTITION P1 VALUES ('北京','天津','石家庄'),
PARTITION P2 VALUES ('上海','南京'),
PARTITION P3 VALUES ('武汉','长沙'),
PARTITION P4 VALUES ('广州','深圳')
);
-- 插入值
insert into t_sales values(1,'AAA','2008-01-08','石家庄');
insert into t_sales values(2,'BBB','2001-07-05','上海');
insert into t_sales values(3,'CCC','2009-02-10','武汉');
insert into t_sales values(4,'DDD','2018-01-08','深圳');
insert into t_sales values(5,'DER','2018-03-06','广州');
commit;
-- 增加默认分区
ALTER TABLE T_SALES ADD PARTITION PM VALUES(DEFAULT);
-- 创建分区:第一种:指定分区名
CREATE TABLE T_HASH1(
ID INT,
NAME VARCHAR(50)
)
PARTITION BY HASH(ID)
(
PARTITION P1,
PARTITION P2,
PARTITION P3,
PARTITION P4
)
-- 插入数据
BEGIN
for i in 1..400 LOOP
insert into T_HASH1 values(i,'AAA'||i);
end LOOP;
commit;
END;
-- 查询数据
select count(*) from t_hash1;
select count(*) from t_hash1_p1;
select count(*) from t_hash1_p2;
select count(*) from t_hash1_p3;
-- 创建分区:第二种:不指定分区名
CREATE TABLE T_HASH2(ID INT, NAME VARCHAR(150)) PARTITION BY HASH(ID) PARTITIONS 4;
-- 删除分区
ALTER TABLE T_SALES DROP PARTITION PM;
-- 增加分区:
ALTER TABLE T_SALES ADD PARTITION PM VALUES(DEFAULT);
-- 合并分区:
ALTER TABLE T_F1 MERGE PARTITIONS P1,P2 INTO PARTITION P_1_2;
-- 拆分分区:
ALTER TABLE T_F1 SPLIT PARTITION P_1_2 AT (1000) INTO (PARTITION P1,PARTITION P2);
create table t5 (id int,name varchar(50));
insert into t5 values(1,'1000AA');
insert into t5 values(4000,'4000AA');
insert into t5 values(5000,'5000AA');
insert into t5 values(7000,'7000AA');
commit;
-- 交换分区:
ALTER TABLE T_F1 EXCHANGE PARTITION P2 WITH TABLE T5;
外部表的使用限制:
创建相关目录
-- 在服务上创建目录
mkdir -p /home/dmdba/data
-- 在数据库中创建目录
CREATE DIRECTORY DMDIR AS '/home/dmdba/data';
-- 给 test 用户在该目录上读写的权限:
GRANT READ,WRITE ON DIRECTORY DMDIR TO TEST;
-- 编辑数据文件
cat > /home/dmdba/data/T_F1.txt << 'EOF'
id|name
1|aaa
2|bbb
3|ccc
4|ddd
EOF
-- 创建外部表
CREATE EXTERNAL TABLE T_EXT1(
ID INT,
NAME VARCHAR(50)
) FROM DATAFILE DEFAULT
DIRECTORY DMDIR LOCATION('T_F1.txt') PARMS(FIELDS '|', SKIP 1);
-- 查询
SELECT * FROM T_EXT1;
-- 编辑数据文件
cat > /home/dmdba/data/T_F2.txt << 'EOF'
1,aaa
2,bbb
3,ccc
4,ddd
EOF
-- 编写控制文件
cat > /home/dmdba/data/T_F2.ctl << 'EOF'
LOAD DATA
INFILE 'T_F2.txt'
INTO TABLE T_EXT2
FIELDS ','
EOF
-- 创建外部表
CREATE EXTERNAL TABLE T_EXT2(
ID INT,
NAME VARCHAR(50)
) FROM DEFAULT DIRECTORY DMDIR LOCATION('T_F2.ctl');
-- 验证数据
SELECT * FROM T_EXT2;
-- 删除外部表
DROP TABLE T_EXT2;
序列: 在内存中预先申请的一段地址空间
DM 序列的取值范围:-9223372036854775808 —— 9223372036854775807
-- 创建序列
CREATE SEQUENCE SEQ1
START WITH 10 -- 起始值
INCREMENT by 10 -- 增量值
MINVALUE 1 -- 最小值
MAXVALUE 100 -- 最大值
CACHE 5 -- 是否开启缓存,如果开启缓存,数据库重启后,缓存的序列值会被丢弃,从 LAST_NUMBER 值开始
NOCYCLE; -- 不循环
-- 查看序列的当前值
SELECT SEQ1.CURRVAL;
-- 查看序列的下个值
SELECT SEQ1.NEXVAL;
-- 修改序列的 maxvalue
ALTER SEQUENCE SEQ1 MAXVALUE 120;
-- 删除序列
DROP SEQUENCE SEQ1;
-- 查询序列:
SELECT * FROM USER_SEQUENCES;
同义词特点
普通同义词: 自己模式下的同义词
公共同义词: 所有用户都可以使用,不用加模式名
-- 创建普通同义词
CREATE SYNONYM FS FOR T_SALES;
-- 创建公共同义词
CREATE PUBLIC SYNONYM F1 FOR T_F1;
-- 查看普通同义词
SELECT * FROM USER_SYNONYMS;
-- 查看公共同义词
SELECT * FROM DBA_SYNONYMS WHERE OWNER='PUBLIC' AND TABLE_OWNER='TEST';
-- 删除同义词
DROP SYNONYM FS;
-- 删除公共同义词需要授权
DROP PUBLIC SYNONYM F1;
注意: 普通同义词和公共同义词可以同名, 不能在一个模式下创建相同的普通同义词。
特点:
数据填充类型:
物化视图刷新时机:
物化视图刷新模式:
案例一:手动刷新物化视图
-- 创建测试表 T6
CREATE TABLE T6(ID INT, NAME VARCHAR(50));
-- 插入数据
BEGIN
for i in 1..3000 LOOP
insert into T6 values(i,'AAA'||i);
end LOOP;
commit;
END;
-- 创建物化视图
CREATE MATERIALIZED VIEW MV_T6 AS SELECT * FROM T6;
-- 查询视图
SELECT * FROM MV_T6;
-- 更新数据
UPDATE T6 SET NAME='AAA111' WHERE ID=1;
COMMIT;
-- 手动刷新物化视图:
REFRESH MATERIALIZED VIEW mv_t6;
-- 查看创建的物化视图:
SELECT * FROM USER_MVIEWS;
案例二:创建物化视图, 自动-完全刷新
-- 建表
CREATE TABLE EMP AS SELECT * FROM DMHR.EMPLOYEE;
-- 创建物化视图
CREATE MATERIALIZED VIEW MV_EMP REFRESH ON COMMIT FORCE AS SELECT * FROM EMP;
-- 查询物化视图
SELECT * FROM MV_EMP;
案例三:创建物化视图, 自动-快速刷新--基于主键
-- 建表添加主键
CREATE TABLE DEPT AS SELECT * FROM DMHR.DEPARTMENT;
ALTER TABLE DEPT ADD PRIMARY KEY(DEPARTMENT_ID);
-- 创建物化视图日志
CREATE MATERIALIZED VIEW LOG ON DEPT;
-- 创建物化视图
CREATE MATERIALIZED VIEW MV_DEPT REFRESH FAST ON COMMIT AS SELECT * FROM DEPT;
-- 或者
CREATE MATERIALIZED VIEW MV_DEPT REFRESH FORCE ON COMMIT AS SELECT * FROM DEPT;
案例四: 创建物化视图, 自动刷新-快速刷新-基于 rowid
-- 创建表
CREATE TABLE EMPINFO AS SELECT EMPLOYEE_ID,EMPLOYEE_NAME,SALARY FROM DMHR.EMPLOYEE;
-- 创建物化视图日志
CREATE MATERIALIZED VIEW LOG ON EMPINFO WITH ROWID(EMPLOYEE_ID,EMPLOYEE_NAME,SALARY);
-- 创建物化视图
CREATE MATERIALIZED VIEW MV_EMPINFO REFRESH FAST ON COMMIT WITH ROWID AS SELECT A.ROWID EMPROWID, A.EMPLOYEE_ID,A.EMPLOYEE_NAME,A.SALARY FROM EMPINFO A;
-- 查询数据
SELECT * FROM MV_EMPINFO;
-- 修改物化视图永不刷新:
ALTER MATERIALIZED VIEW MV_EMPINFO NEVER REFRESH;
-- 删除物化视图日志:
DROP MATERIALIZED VIEW LOG ON EMPINFO;
-- 删除物化视图
DROP MATERIALIZED VIEW MV_EMPINFO;
系统权限转授: with admin option
对象权限转授: with grant option
操作系统认证
Select para_name,para_value,para_type from v$dm_ini where PARA_NAME like '%ENABLE_LOCAL%';
sp_set_para_value(2,'ENABLE_LOCAL_OSAUTH',1);
[dmdba@localhost ~]$ ./DmServiceDMSERVER restart
基 于 操 作 系 统 的 身 份 验 证 需 要 首 先 将 操 作 系 统用 户 加 入 到 操 作 系 统 的 dmdba|dmsso|dmauditor 用 户 组 ,分 别 对 应 数 据 库 的SYSDBA|SYSSSO|SYSAUDITOR用户
资源限制
CREATE PROFILE "PROFILE1" LIMIT FAILED_LOGIN_ATTEMPS 5 PASSWORD_LIFE_TIME 180 PASSWORD_REUSE_TIME 3 PASSWORD_GRACE_TIME 10;
alter user "TEST" PROFILE "PROFILE1";
达梦的审计分为三种:系统审计, 语句级审计, 对象审计
-- 查看数据库是否开启审计 0 关闭 1 普通 2 普通和实时审计
SELECT * FROM SYS.V$DM_INI WHERE PARA_NAME LIKE '%ENABLE_AUDIT%';
-- 开启审计 需要使用:SYSAUDITOR
SP_SET_ENABLE_AUDIT(1);
SELECT * FROM SYS.V$DM_INI WHERE PARA_NAME='ENABLE_AUDIT';
-- 达梦数据库审计记录文件存放在/dm8/data/DAMENG
-- 语句及审计
SP_AUDIT_STMT(
TYPE VARCHAR(30),
USERNAME VARCHAR (128),
WHENEVER VARCHAR (20)
)
TYPE:审计选项
USERNAME:用户名, null 表示不限制
WHENEVER:审计的时机
ALL: 所有的 ;
- SUCCESSFUL:操作成功时 ;
- FAIL:操作失败时
-- 审计 TEST 用户对表的建表、 修改表、 清空表、 删除表操作:
SP_AUDIT_STMT('TABLE','TEST','ALL')
-- 审计任何用户对表的 DDL 操作:
SP_AUDIT_STMT('TABLE','NULL','ALL');
-- 取消审计
SP_NOAUDIT_STMT('TABLE','NULL','ALL');
-- 对象级审计
SP_AUDIT_OBJECT (
TYPE VARCHAR(30),
USERNAME VARCHAR (128),
SCHNAME VARCHAR (128),
TVNAME VARCHAR (128),WHENEVER VARCHAR (20)
)
SP_AUDIT_OBJECT (
TYPE VARCHAR(30),
USERNAME VARCHAR (128),
SCHNAME VARCHAR (128),
TVNAME VARCHAR (128),
COLNAME VARCHAR (128),
WHENEVER VARCHAR (20)
)
-- 审计 TEST 用户删除 TEST.T6 表记录的操作
SP_AUDIT_OBJECT('DELETE','TEST','TEST','T6','ALL');
-- 审计任何用户插入 TEST.T6 表记录的操作
SP_AUDIT_OBJECT('INSERT','NULL','TEST','T6','ALL');
-- 查看审计记录
SELECT USERNAME,OPERATION,SUCC_FLAG,SQL_TEXT,DESCRIPTION,OPTIME from V$AUDITRECORDS;
-- 关闭审计
SP_SET_ENABLE_AUDIT(0);
-- 查看审计策略:
select
sf_get_audit_levelname(level) level,
sf_get_audit_typename(type) type,
sf_get_audit_whenevername("WHENEVER") whenerver1,
sf_get_tablename_by_id(decode(tvpid,-1,null,tvpid)) tablename,
sf_get_username_by_id (uid) uname
from sysaudit;
考试给的数据文件可能有四五十行,会配合分区一起考,如果有表头,则需要
OPTIONS(
SKIP=1
)
LOAD DATA
INFILE '/home/dmdba/test.txt'
INTO TABLE FLDRTEST
FIELDS ','
根据数据文件, 创建表和编写控制文件
-- 数据文件
cat > test.txt << 'EOF'
1,'joe',2001-01-09
1,'maria'
1,'tom',2009-07-09
1,'jack',
EOF
-- 创建表
CREATE TABLE FLDRTEST(ID INT, NAME VARCHAR(50), BIR DATE);
-- 控制文件
vim fldrtest.ctl
LOAD DATA
INFILE '/home/dmdba/test.txt'
INTO TABLE fldrtest
FIELDS ','
-- 数据装载
[dmdba@localhost ~]$ dmfldr TEST/Dameng123 control=\'/home/dmdba/fldrtest.ctl\'
-- 创建表
CREATE TABLE CLOB1(ID INT, ADDR CLOB);
-- 插入数据
insert into clob1 values(1,'ADKJAKDFSEEIEEEEEEEEEEEIIIIOOODADKFJASLKDFJALKSDHFSALKJFDKSADJF');
insert into clob1 values(2,'dakfsaejdsakjfdugeasdkfksadfdadsdkadas289299292992');
insert into clob1 values(3,'dakdak89912929392929929299929');
commit;
-- 编写控制文件
vim clob1.ctl
LOAD
INFILE '/home/dmdba/clob1.txt'
INTO TABLE CLOB1
FIELDS ','
(
ID,
ADDR
)
-- 导出大字段
[dmdba@DMDW-P ~]$ dmfldr TEST/aaa123...A control=\'/home/dmdba/clob1.ctl\' mode=\'OUT\'
-- 建表
CREATE TABLE CLOB2 AS SELECT * FROM CLOB1 WHERE 1=2;
-- 创建控制文件
vim clob2.ctl
LOAD
INFILE '/dm8/backup/clob1.txt'
INTO table clob2
fields ','
(
ID,
ADDR
)
-- 导入
[dmdba@DMDW-P ~]$ dmfldr TEST/aaa123...A control=\'/home/dmdba/clob2.ctl\' lob_directory=\'/home/dmdba\' mode=\'IN\'
-- 唯一索引
CREATE UNIQUE INDEX IND_ID ON T_F1(ID);
-- 复合索引(注意列的前后顺序)
CREATE INDEX IND_EMP ON EMPINFO(EMPLOYEE_ID, EMPLOYEE_NAME);
-- 位图索引 OLAP 系统
CREATE BITMAP INDEX IND_SEX ON T5(SEX);
-- 创建函数索引
CREATE INDEX IND_NAME ON T_F1(UPPER(NAME));
-- 创建局部索引
CREATE INDEX IND_F1_ID ON T_F1(ID);
-- 创建全局索引
CREATE INDEX IND_F1_ID ON T_F1(ID) GLOBAL;
-- 查看索引的类型 YES 局部
SELECT a.TABLE_NAME,a.INDEX_NAME,a.PARTITIONED from SYS.USER_INDEXES a WHERE a.TABLE_NAME='T_F1';
-- 查看索引信息
SELECT a.TABLE_NAME,a.INDEX_NAME,a.STATUS,a.VISIBILITY from SYS.USER_INDEXES a;
-- 设置有效性
alter INDEX IND_EMP_ID UNUSABLE;
alter INDEX ind_emp_id REBUILD;
-- 设置可见性
ALTER INDEX IND_ID INVISIBLE;
ALTER INDEX IND_ID VISIBLE;
-- 开启索引监控
ALTER INDEX IND_ID MONITORING USAGE;
-- 关闭索引监控
ALTER INDEX IND_ID NOMONITORING USAGE;
-- 查看索引监控信息
SELECT * FROM SYS.V$OBJECT_USAGE;
-- 删除索引
DROP INDEX IND_ID;
自动收集统计信息
手动收集统计信息
-- 搜集表的统计信息,包括列和索引的
dbms_stats.gather_table_stats('TEST','T_F1');
-- 搜集表的统计信息,不会搜集列的统计信息, 列的统计信息需要单独搜集
sp_tab_stat_init ('TEST','T_F1');
-- 搜集列的统计信息
sp_col_stat_init ('TEST','T_F1','ID');
-- 查看统计信息
dbms_stats.table_stats_show('TEST','T_F1');
-- 查看列的统计信息和列的直方图信息
dbms_stats.column_stats_show('TEST','T_F1','ID');
-- 删除统计信息
dbms_stats.delete_table_stats('TEST','T_F1');
收集统计信息,并输出到文件中去:
SQL> spool /home/dmdba/gather.txt
SQL> dbms_stats.table_stats_show('TEST','T_F1');
SQL> spool off
脱机全量备份,脱机全量恢复。非常简单,届面操作即可。
图形管理工具操作即可
删除15天之前的备份(可能需要以作业管理的形式去做):SP_DB_BAKSET_REMOVE_BATCH('DISK',NOW()-15)
实时主备具体细节我另写了一篇文章
性能优化设置参数
-- 查看共享内存池
select para_name,para_value from v$dm_ini where para_name like '%MEMORY%';
-- 查看数据缓冲区
select para_name,para_value from v$dm_ini where para_name ='BUFFER';
-- 查看重做日志缓区
select para_name,para_value from v$dm_ini where para_name ='RLOG_BUF_SIZE';
-- 查看字典缓冲区
select para_name,para_value from v$dm_ini where para_name ='DICT_BUF_SIZE';
-- 查看sql缓冲区
select para_name,para_value from v$dm_ini where para_name ='CACHE_POOL_SIZE';
-- 查看内存池信息
select name,ORG_SIZE,TOTAL_SIZE,RESERVED_SIZE,N_EXTEND_EXCLUSIVE from SYS.V$MEM_POOL;
-- 查看数据缓冲区的信息
select name,FREE,N_LOGIC_READS,RAT_HIT from SYS.V$BUFFERPOOL;
-- 检查内存是否存在泄露
select * from v$dm_ini where para_name like '%MEMORY_LEAK%';select * from V$MEM_REGINFO;
-- 查看 dm 数据库的动态性能视图
select * from SYS.V$DYNAMIC_TABLES where name like '%WAIT%';
文章
阅读量
获赞