使用达梦数据库的工具,进行数据库管理,从操作实践的体验来讲还是很棒的,为国产数据库达梦点赞,我们大中华需要更多这样的自研产品。
一、基本设置
1、设置图形化界面:
进入dmdba用户,然后执行下面的命令。
[dmdba@dmtest01 tool]$ export DISPLAY=192.168.43.212:0.0
[dmdba@dmtest01 tool]$ xhost +
access control disabled, clients can connect from any host
[dmdba@dmtest01 tool]$ ./manager
2、常用命令
1.查看数据库:
select name from V$database;
2.查看实例名:
select instance_name from v$instance;
3.查看数据库的状态
select status$ from v$instance;
二、表管理
2.2.1 范围分区
1、要求:分区列是数字或是日期类型
create tablespace "TEST" datafile '/dm8/data/DAMENG/TEST01.DBF' size 128 autoextend on next 1 maxsize 1024,'/dm8/data/DAMENG/TEST02DBF' size 128 autoextend on next 1 maxsize 1024 CACHE = NORMAL;
alter tablespace TEST offline;
alter TABLESPACE TEST RENAME DATAFILE '/dm8/data/DAMENG/TEST02DBF' TO '/dm8/data/DAMENG/TEST02.DBF';
alter tablespace TEST online;
create user TEST identified by dameng123 default tablespace test;
创建范围分区
create table "TEST"."T1"
(
"ID" INT,
"NAME" VARCHAR(20))
PARTITION BY RANGE ("ID")
(PARTITION "P1" VALUES LESS THAN (100),
PARTITION "P2" VALUES LESS THAN (200),
PARTITION "P3" VALUES LESS THAN (300))
storage(initial 1, next 1, minextents 1, fillfactor 0);
select count(*) from test.t1;
begin
for i in 1..299 loop
insert into test.t1 values(i,'EEEE'||i);
commit;
end loop;
end;
访问分区表;
select count(*) from test.t1_p2;
select count(*) from test.t1_p1;
select count(*) from test.t1_p3;
案例2
create tablespace TBS1 datafile '/dm8/data/DAMENG/TBS1_01.DBF' SIZE 32;
create tablespace TBS2 datafile '/dm8/data/DAMENG/TBS2_01.DBF' SIZE 32;
create tablespace TBS3 datafile '/dm8/data/DAMENG/TBS3_01.DBF' SIZE 32;
create tablespace TBS4 datafile '/dm8/data/DAMENG/TBS4_01.DBF' SIZE 32;
创建范围分区表
create table "TEST"."T2"
(
"ID" INT,
"NAME" VARCHAR(20)
)
PARTITION BY RANGE ("ID")
(
PARTITION "P1" VALUES LESS THAN (100) STORAGE( initial 1, next 1, minextents 1,
fillfactor 0, on "TBS1"),
PARTITION "P2" VALUES LESS THAN (200) STORAGE( initial 1, next 1, minextents 1,
fillfactor 0, on "TBS2"),
PARTITION "P3" VALUES LESS THAN (300) STORAGE( initial 1, next 1, minextents 1,
fillfactor 0, on "TBS3"),
PARTITION "PN" VALUES LESS THAN (MAXVALUE) STORAGE( initial 1, next 1,
minextents 1, fillfactor 0, on "TBS4")
)
storage(initial 1, next 1, minextents 1, fillfactor 0);
插入数据:
begin
for i in 1..300 loop
insert into test.t2 values(i,'EEEE'||i);
commit;
end loop;
end;
查询数据;
select count(*) from test.t2_p1;
select count(*) from test.t2_p2;
select count(*) from test.t2_pn;
案例3:堆表的分区表
create table "TEST"."T3"
("ID" INT,
"NAME" VARCHAR(20))
PARTITION BY RANGE ("ID")
(
PARTITION "P1" VALUES LESS THAN (100) STORAGE( initial 1, next 1, minextents 1,
fillfactor 0, on "TEST"),
PARTITION "P2" VALUES LESS THAN (200) STORAGE( initial 1, next 1, minextents 1,
fillfactor 0, on "TEST"),
PARTITION "P3" VALUES LESS THAN (300) STORAGE( initial 1, next 1, minextents 1,
fillfactor 0, on "TEST"),
PARTITION "PN" VALUES LESS THAN (MAXVALUE) STORAGE( initial 1, next 1,
minextents 1, fillfactor 0, on "TEST")
)
storage(initial 1, next 1, minextents 1, fillfactor 0, nobranch);
2.2.2 列表分区
分区列适合字符串类型
北京天津哈尔滨,青岛
上海,南京,杭州
武汉,长沙,合肥
广州,深圳,福建
create table test.t_sales(sales_id int, saleman varchar(20), saledate date,city
char(10))
Partition by list(city)
(partition P1 values('北京', ' 天津',' 哈尔滨','青岛'),
partition P2 values('上海','南京','杭州'),
partition P3 values('武汉','长沙','合肥'),
partition P4 values('广州','深圳','福建'));
alter table test.t_sales add partition PN values(default);
insert into test.t_sales values(4,'CCCC','2022-04-18','西安');
commit;
select * from test.T_SALES;
2.2.3 哈希分区
将分区列的值进行hash 运算,然后将数据平均分配各个子分区,
存储数据非常快,取数据慢,如果hash 分区不指定分区表名,那就
通过指定的哈希分区数来创建。
分区表名统一使用DMHASHPART+分区号(从0 开始)作为分区名。
CREATE TABLE TEST.T4
(ID INT,
NAME VARCHAR(20))
PARTITION BY HASH(ID)
( PARTITION "01",
PARTITION "02",
PARTITION "03",
PARTITION "04"
) ;
create table test.t_hash(id int, name varchar(20))
partition by hash (id) partitions 10;
2.2.4 组合分区
RANGE-LIST RANGE-HASH RANAGE-RANGE LIST-LIST HASH-HASH
LIST-RANGE
DM 支持最多8 层分区
List-range
create table test.sales_sum(sale_id int, sale_name varchar(20),
sale_date date, city char(10))
partition by list(city) ----主分区
subpartition by range(sale_date) ---子分区
subpartition template( ---子分区模板
subpartition p11 values less than('2012-04-01'),
subpartition p12 values less than('2013-04-01'),
subpartition p13 values less than(maxvalue))
( partition p1 values('北京', '天津',' 哈尔滨','青岛') ---创建组合分区
(subpartition p1_1 values less than('2012-08-01'),
subpartition p1_2 values less than('2013-08-01'),
subpartition p1_3 values less than(maxvalue)),
partition p2 values('上海','南京','杭州'),
partition p3 values('武汉','长沙','合肥'),
partition p4 values('广州','深圳','福建'),
partition p5 values(default));
插入数据:
insert into test.sales_sum values(1,'AAAAA','2012-05-01','北京');
insert into test.sales_sum values(2,'CCCC','2012-05-01','武汉');
COMMIT;
查询
select * from test.sales_sum;
2.2.5 间隔分区
NUMTOYMINTERVAL(N,INTERVAL_UNIT);
N:间隔时间
Interval_unit:year, month
实际上是范围分区的一个扩展
select sysdate+numtoyminterval(2,'YEAR');
select sysdate+numtoyminterval(2,'MONTH');
如果用了间隔函数做分区,在数据插入的时候,如果没有适合的分区,数据库分自动给你创建一个新的分区。
2.2.6 分区表维护
相关的数据字典: dba_tab_partitions;
Select * from dba_tab_partitions where table_owner=’TEST’;
1、增加分区
ALTER TABLE TEST.T1 add partition pn values less than(maxvalue);
2、删除分区
Alter table test.t1 drop partition pn;
注意;删除分区前请确认好,并做好备份。
3、合并分区
alter table test.t1 merge partitions p2,p3 into partition p2_3;
4、拆分分区
alter table test.t1 split partition P2_3 at(200) into (partition p2,partition p3);
5、交换分区
ALTER TABLE TEST.T1 EXCHANGE PARTITION P2 WITH TABLE TEST.T10;
注意:交换时,会普通表的所有数据全部交换过来,包括不属于这个
分区的数据也一起交换过来,所以我们在交换分区的时候,要把普通
表的数据先整理好。
6、如何把非分区表转换成分区表
1)把非分区表的数据导出来。dexp dts
2)建立一个和非分区表结构一样的分区表
3)将数据导入到分区表中(dimp remap_schema)
create table test.t20(id int)
begin
for i in 1..10000 loop
insert into test.t20 values(i);
end loop;
commit;
end;
select * from test.t20
导出t20 表的数据。
cd /dm8/dmdbms/bin
[dmdba@localhost bin]$ ./dexp sysdba/Dameng123 file=/dm8/t20.dmp tables=test.t20;
删除t20 表
DROP TABLE TEST.T20;
创建分区表t20
create table test.t20(id int)
partition by range (id)
(partition p1 values less than (1000),
partition p2 values less than(2000),
partition p3 values less than(3000),
partition p4 values less than(4000),
partition p5 values less than(5000),
partition p6 values less than(6000),
partition p7 values less than(7000),
partition pn values less than(maxvalue));
导入数据:
[dmdba@localhost bin]$ ./dimp sysdba/Dameng123 file=/dm8/t20.dmp tables=test.t20 ignore=y
查询结果:
select count(*) from test.t20;
2.3 外部表
案例1:
1、数据文件
[dmdba@localhost ext]$ cat a.txt
1,AAAAA
2,BBBBB
3,DD
4,CCCC
5,FF
6,WERWRWRW
7,iiiii
8,nnnnn
9,SER
10,EWDEWRWRWRWRW
2、控制文件
[dmdba@localhost ext]$ cat a.ctl
LOAD DATA INFILE '/dm8/ext/a.txt' INTO TABLE TEST.EXT FIELDS ','
create external table test.ext(id int, name varchar(20)) from '/dm8/ext/a.ctl';
select * from test.ext;
案例2:
1、数据文件
[dmdba@localhost ext]$ cat b.txt
10|9|7
4|3|2|5
1|3|4|5
6|7
2、创建外部表
SQL> create external table test.ext2(c1 int, c2 int, c3 int) from datafile '/dm8/ext/b.txt' parms(fields delimited by '|');
SQL> select * from test.ext2;
行号 C1 C2 C3
---------- ----------- ----------- -----------
1 10 9 7
2 4 3 2
3 1 3 4
4 6 7 NULL
2.3 临时表
创建临时表
1、事务级别: on commit detele rows
SQL> create global temporary table test.tmp_t1(id int) on commit delete rows;
insert into test.tmp_t1 values(1);
insert into test.tmp_t1 values(2);
insert into test.tmp_t1 values(3);
select * from test.tmp_t1;
commit;
SQL> select * from test.tmp_t1;
2、会话级别的临时表on commit preserve rows
SQL> create global temporary table test.tmp_t2(id int) on commit preserve rows;
insert into test.tmp_t2 values(1);
重开一个会话
select * from test.tmp_t2;
查询临时表空间的信息:
SQL> select para_name,para_value from v$dm_ini where para_name like '%TEMP%';
行号 PARA_NAME PARA_VALUE
---------- ---------------- ------------------
1 TEMP_PATH /dm8/data/coremail
2 TEMP_SIZE 1024
3 TEMP_SPACE_LIMIT 102400
SQL> SP_SET_PARA_VALUE(2,'TEMP_SIZE',2048);
SQL> select table_name,tablespace_name from dba_tables where tablespace_name like '%TEMP';
行号 TABLE_NAME TABLESPACE_NAME
---------- --------------------------- ---------------
1 ##PLAN_TABLE TEMP
2 ##HISTOGRAMS_TABLE TEMP
3 ##TMP_TBL_FOR_DBMS_LOB_BLOB TEMP
4 ##TMP_TBL_FOR_DBMS_LOB_CLOB TEMP
5 TMP_T1 TEMP
6 TMP_T2 TEMP
注意:
临时表清空,临时表空间文件在磁盘所占大小并不会因此缩减,用户
可以通过系统函数sp_trunc_ts_file 来进行磁盘空间的清理。
Sp_trunc_ts_file(
Ts_id int ---指定截断文件的临时表空间id
File_id int ---指定截断文件id
To_size int --指定将文件截断至多少,以M 为单位
)
begin
for i in 1..10000000
loop
insert into test.tmp_t1 values(i);
end loop;
end;
/
SQL> select tablespace_name,file_name,BYTES/1024/1024 from dba_data_files where tablespace_name like '%TEMP';
行号 TABLESPACE_NAME FILE_NAME BYTES/1024/1024
---------- --------------- --------------------------- --------------------
1 TEMP /dm8/data/coremail/TEMP.DBF 1024
select group_id,id,path from v$datafile;
SQL> sp_trunc_ts_file(3,0,10);
SQL> select TABLESPACE_NAME, FILE_NAME, BYTES/1024/1024 from dba_data_files where tablespace_name='TEMP';
注意:若无法缩小临时表空间,可重启数据库服务,重启后,临时表空间会重新为初始大小,即temp_size 参数指定的大小。
SQL> select tablespace_name,file_name,BYTES/1024/1024 from dba_data_files where tablespace_name like '%TEMP';
行号 TABLESPACE_NAME FILE_NAME BYTES/1024/1024
---------- --------------- --------------------------- --------------------
1 TEMP /dm8/data/coremail/TEMP.DBF 1024
已用时间: 9.380(毫秒). 执行号:2421.
SQL> sp_trunc_ts_file(3,0,10);
DMSQL 过程已成功完成
已用时间: 2.773(毫秒). 执行号:2422.
SQL> select tablespace_name,file_name,BYTES/1024/1024 from dba_data_files where tablespace_name like '%TEMP';
行号 TABLESPACE_NAME FILE_NAME BYTES/1024/1024
---------- --------------- --------------------------- --------------------
1 TEMP /dm8/data/coremail/TEMP.DBF 274
已用时间: 2.329(毫秒). 执行号:2423.
2.4 清空表
DM8 支持以上的方式来删除表中的所有行
1、DELETE
2、Drop
3、Truncate
区别:
1、空间释放:drop>truncate>delete
2、应用范围:truncate 只能对table, delete 可以是table ,view.
truncate 和delete 只删除数据,drop 则删除整个表包括表结构和数据。
3、delete 是DML 语句,truncate 和drop 是ddl 语句
4、Delete 是可以带where 进行过滤的。
5、Delete 记undo 慢。truncate 不会记undo 快。
6、Delete 删除写redo 日志。
三、DM8 序列、同义词、物化视图
3.1 序列
序列:在内存预先申请的一段地址空间,类似于取号排队。
创建序列:
CREATE SEQUENCE "TEST"."S1"
INCREMENT BY 2 ---递增多少
START WITH 1 ----起始值
MAXVALUE 10 -----最大值
MINVALUE 1; -----最小值
Cache2 缓存nocache
Order 排序noorder
Cycle 循环nocycle
select test.s1.nextval;
alter sequence test.s1 maxvalue 30;
DROP sequence test.s1
3.2 同义词
同义词:表或视图、序列、函数、存储过程的别名,为安全考虑,同
义词分为公共同义词,普通同义词。
公共同义词:所有用户都可以使用的,使用的时候不需要加任何模式
名。达梦用的数据字典、动态性能视图都sys 的公共同义词。SYS 是
达梦的内置管理账号,不能用于登录数据库。
普通同义词:某个特定用户才可以使用的,使用的时候要加模式名。
创建同义词;
1、普通同义词
CREATE SYNONYM "TEST"."SY1" FOR "TEST"."T1";
SELECT * FROM TEST.SY1;
DROP SYNONYM TEST.SY1;
2、创建公共同义词
CREATE PUBLIC SYNONYM "SY3" FOR "TEST"."T_SALES";
SELECT * FROM SY3;
删除公共同义词
Drop public synonym SY3;
删除普通同义词
DROP SYNOYNYM TEST.SY1;
3.3 物化视图
视图分类:简单视图,复杂视图,物化视图。
物化视图:
数据要单独存储,占用磁用空间,规划表空间。
物化视图的数据来自于基表,基表发生变化,物化视图可以根据更新
方式来进行数据更新。
更新方式:
手动(默认的方式):demand
自动更新:commit
如何更新:
FAST ----快速更新
Complete ---完全更新
Force ---选择性更新
Never ---不更新。
案例1:创建一个手动更新的物化视图
create materialized view MV1 AS SELECT * FROM TEST.T1;
create materialized view mv2 as select * from test.t1 where id>200;
修改test.t1,手动更新MV1,MV2;
refresh materialized view test.mv1;
案例2:创建一个自动更新的物化视图(要有物化视图日志)
创建物化视图需要授权,没有主键的表也无法创建。
添加主键约束
alter table test.t1 ADD CONSTRAINT pk_testid_id PRIMARY KEY(id);
create materialized view log on test.t1;
create materialized view mv3 refresh complete on commit as select * from test.t1;
select * from mv4;
select * from test.t1 WHERE ID =1;
uPdate test.t1 set name = 'EEEE00001' WHERE ID =1;
commit;
create materialized view mv3 refresh complete on commit as select * from test.t1;
创建物化视图日志
create materialized view log on test.t1;
创建完全更新物化视图
drop materialized view mv3;
create materialized view mv3 refresh complete on commit as select * from test.t1;
创建快速更新物化视图
create materialized view mv4 refresh fast on commit as select * from test.t1;
1、物化视图:mv1,mv2,mv3,mv4
2、物化视图表:MTAB$_MV2
3、自动更新物化视图,则会有物化视图日志:MLOG$_T1
4、定时刷新物化视图的触发器:MTRG$_T1
四、DM8 索引管理
4.1 统计信息
统计信息主要是描述数据库中表,索引的大小,规模,数据分布状况等的一类信息。
4.3 创建索引:
CREATE TABLESPACE IND DATAFILE '/dm8/data/DAMENG/ind_01.dbf' size 64;
4.3.1 唯一索引
创建索引表空间:
create tablespace IND DATAFILE 'IND01.DBF' size 32;
创建表和唯一索引:
create table test.t13(id int ,name varchar(20));
create unique index test.t13_ind on test.t13(id) tablespace IND;
4.3.2 函数索引
可以使用通用函数,也可以使用自定义函数
create table test.emp as select * from dmhr.employee;
create index test.ind_emp on test.emp(upper(email)) tablespace IND;
explain select employee_name, email from test.emp where upper(email)=upper('maxueming@dameng.com');
单行函数:
字符: inicap lower upper lpad trim replace instr substr
数值运算:round trunc mod
日期: add_months month_between, next_day, last_day
聚合函数sum avg count max min
4.3.3 复合索引
索引由表中的多列构成,注意先后顺序
create index test.emp_ind2 on test.emp(employee_id,employee_name) tablespace IND;
4.3.4 位图索引
适合列上数值类型少的情况,比如说性别
create table test.t14(id int ,sex char(1), name varchar(20));
insert into test.t14 values(1,0,'AAAAA');
CREATE BITMAP INDEX TEST.T14_IND ON TEST.T14(SEX);
SQL>
begin
dbms_stats.gather_table_stats('TEST','T14',NULL,100,FALSE,'FOR ALL COLUMNS SIZE AUTO');
END;
BEGIN
DBMS_STATS.COLUMN_STATS_SHOW(OWNNAME='TEST',TABNAME='T14',COLNAME='SEX');
END;
explain select * from test.t14 where sex =1;
explain select * from test.t14 where sex =0;
4.3.5 索引的维护
重建索引
Alter index test.ind_emp rebuild;
Alter index test.ind_emp rebuild online;
注意:
新建索引,重建索引,删除索引,收集统计信息,更新统计信息,一
定不在要业务高峰去做,要在业务低谷进行。
查看索引的相关信息
DBA_INDEXEX, USER_INDEXES;
删除索引:
DROP INDEX TEST.IND_EMP;
如果表是分区表,该表上创建的索引就是分区索引,非堆表每个
分区一个索引(局部索引),堆表可以创建全局索引,也可以创建局
部索引,在创建全局索引的时候指定global 关键字。
create index "IND_SALE_SUM" on "TEST"."SALES_SUM"("SALE_ID") storage(initial 1,next 1,minextents 1,on "IND");
drop index TEST.IND_SALE_SUM ;
create index "IND_SALE_SUM2" on "TEST"."SALES_SUM"("SALE_ID") global storage(initial 1,next 1,minextents 1,on "IND");
4.3.7 全文索引
全文检索技术是智能信息管理的关键技术之一,其主要目的就是
实现对大容量的非结构化数据的快速查找,DM 实现了全文检索功能,
并将其作为DM 服务器的一个较独立的组件,提供更加准确的全文检
索功能,较好地解决了模糊查询方式带来的问题。
4.4 执行计划
什么是执行计划? 一条sql 语句在DM 数据库中执行的过程或访问路径的描述,通过explain 命令来查看。
五、达梦DEM 管理
DM 企业管理器的英文简称DM Enterprise Manager (DEM).
提供一个通过WEB 界面来监控,管理,维护DM 数据库的集中式管
理平台,可以从任何可以访问web 应用的位置通过DEM 来对DM 数
据库进行各种管理和监控。
DEM 配置主要步骤:
1、配置JAVA 环境
tar -zxvf jdk-8u341-linux-x64.tar.gz
mv jdk1.8.0_341 /usr/local/java
vi /etc/profile
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/dm8/dmdbms/bin"
export DM_HOME="/dm8/dmdbms"
export JAVA_HOME=/usr/local/java/jre
export PATH=$JAVA_HOME/bin:$PATH
DEM部署说明
1. 创建一个数据库作为DEM后台数据库(5240), 数据库dm.ini参数配置进行优化, 推荐配置:
使用dbca.sh创建DEM数据库,使用端口5240。
MEMORY_POOL = 200
BUFFER = 1000
KEEP = 64
SORT_BUF_SIZE = 50
2. 在该数据库中执行以下SQL脚本dem_init.sql,重启数据库实例;
cd /dm8/dmdbms/bin
./disql sysdba/Dameng123:5240
SQL>set define off
SQL>set char_code utf8
SQL>start /dm8/dmdbms/web/dem_init.sql
[dmdba@localhost bin]$./DmServiceDMSERVER restart
3. 配置tomcat
(1)解压tomcat
[dmdba@localhost ~]$unzip apache-tomcat-8.0.20.zip
cd /dm8/apache-tomcat-8.0.20/conf
(2)在conf/server.xml中 <Connector port="8080" protocol="HTTP/1.1"... 追加属性字段 maxPostSize="-1"
<Connector port="8080" protocol="HTTP/1.1"
maxThreads="150" connectionTimeout="20000"
redirectPort="8443"
maxPostSize="-1" />
cd /dm8/apache-tomcat-8.0.20/bin
(3)修改jvm启动参数,在catalina.sh加入如下内容:
JAVA_OPTS="-server -Xms512m -Xmx1024m -XX:MaxPermSize=512m -Djava.library.path=/dm8/dmdbms/bin"
4. 配置后台数据库的连接信息:ip、port、用户名、密码信息等,在文件WEB-INF/db.xml(dem.war中)配置如下:
(1)配置JAVA环境变量到dmdba用户的.bash_profile中,拷贝dem.war到apache的webapps中。
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.161-2.b14.el7.x86_64/jre
export PATH=$JAVA_HOME/bin:$PATH
[dmdba@localhost bin]$ cp /dm8/dmdbms/web/dem.war /dm8/apache-tomcat-8.0.20/webapps/
(2)启动tomcat。
cd /dm8/apache-tomcat-8.0.20/bin
使用root用户修改权限 chmod 777 *
(3)修改db.xml,IP,端口,用户名密码等信息,根据时间进行调整。
/dm8/apache-tomcat-8.0.20/webapps/dem/WEB-INF
vi db.xml
<Dbtype>dm8</Dbtype>
<Server>192.168.10.65</Server>
<Port>5236</Port>
<User>SYSDBA</User>
<Password>SYSDBA</Password>
<InitPoolSize>50</InitPoolSize>
<CorePoolSize>100</CorePoolSize>
<MaxPoolSize>500</MaxPoolSize>
<KeepAliveTime>60</KeepAliveTime>
<DbDriver></DbDriver>
<DbTestStatement>select 1</DbTestStatement>
<SSLDir>../sslDir/client_ssl/SYSDBA</SSLDir>
<SSLPassword></SSLPassword>
</ConnectPool>
(4)关闭tomcat
[dmdba@localhost bin]$ ./shutdown.sh
5.启动tomcat并且访问
(1)启动tomcat。
cd /dm8/apache-tomcat-8.0.20/bin
[dmdba@localhost bin]$./startup.sh
(2)假设本机ip为192.168.43.90,开启浏览器访问url(http://192.168.43.90:8080/dem),登录(admin/888888)