DM8-第 24 期 DCA 培训讲义
1、DM8 安装
1.1DM8 版本介绍
DM8 一共分为 4 个版本:开发版、标准版、企业版及安全版。
开发版:不能作为商用,1 年时间(从产品发布之日起)有效。
标准版:不支持集群(数据守护集群、读写分离集群、DMDSC、DMDPC、MPP)的特性,
满足中小型企业的使用。
企业版:支持集群的特性,满足中大型企业使用,是生产环境中用到最多的版本。
安全版:在企业版基础上四权分立,安全性有进一步增强,增加强访问控制、环境标记等。
1.2 配置 DM8 安装环境
查看 cpu 的信息:
[root@localhost /]# lscpu
注意:特别是国产 cpu,例如龙芯、飞腾、鲲鹏等。安装的数据库软件要与 cpu、操作系统
匹配。
内存要求:
[root@localhost /]# free -m
可能用内存至少为 1G
查看硬盘及分区的信息
[root@localhost /]# fdisk -l
[root@localhost /]# df -h
注意:/tmp 分区如果单独已经分区,那么/tmp 分区至少要在 2g 及以上的空间。
网络要求:
100M 网卡,支持 TCP/IP 协议
查看防火墙状态:
[root@localhost /]# systemctl status firewalld
关闭防火墙:
[root@localhost /]# systemctl stop firewalld
禁止防火墙开机自启动:
[root@localhost /]# systemctl disable firewalld
系统要求:
内核要在 2.6 及以上才能安装 DM8
[root@localhost /]# uname -ar
Linux localhost.localdomain 4.19.90-24.4.v2101.ky10.x86_64 #1 SMP Mon May 24 12:14:55 CST
2021 x86_64 x86_64 x86_64 GNU/Linux
创建安装用户和组:
[root@localhost /]# groupadd dinstall
[root@localhost /]# useradd -g dinstall dmdba
[root@localhost /]# passwd dmdba
更改用户 dmdba 的密码 。
新的 密码:
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。
创建安装路径并授予权限:
创建安装路径:
[root@localhost /]# mkdir -p /dm8
将/dm8 的所属用户和所属组分别改为 dmdba,dinstall
[root@localhost /]# chown dmdba.dinstall -R /dm8
查看目录/dm8 的权限
[root@localhost /]# ls -ld /dm8/
挂载 iso 软件包
[root@localhost opt]# mount -o loop /opt/dm8_20231109_x86_kylin10_64.iso /mnt
设置临时安装目录:
切换用户
[root@localhost mnt]# su - dmdba
创建临时目录
[dmdba@localhost ~]$ mkdir -p /home/dmdba/tmp
编辑环境变量文件
[dmdba@localhost ~]$ vi /home/dmdba/.bash_profile
加入:
export DM_INSTALL_TMPDIR=/home/dmdba/tmp
使环境变量生效
[dmdba@localhost ~]$ source .bash_profile
1.3 安装 DM8 软件
1.3.1 图形化方式安装 DM8
设置 DISPLAY 值,调用图形化界面:
[root@localhost 桌面]# xhost +
access control disabled, clients can connect from any host
[root@localhost 桌面]# echo $DISPLAY
:0.0
[root@localhost 桌面]# su - dmdba
上一次登录: 三 8 月 21 10:58:43 CST 2024 pts/1 上
[dmdba@localhost ~]$ export DISPLAY=:0.0
安装:
[dmdba@localhost ~]$ cd /mnt
[dmdba@localhost mnt]$ ./DMInstall.bin
没有 key 也可以安装 DM;
替换 key:将 key 文件放在$DM_HOME/bin,重启数据库实例生效
使用 root 用户执行脚本文件:
[root@localhost 桌面]# /dm8/script/root/root_installer.sh
1.3.2 命令行方式安装 DM8
[dmdba@localhost dm8]$ cd /mnt
[dmdba@localhost mnt]$ ./DMInstall.bin -i
安装语言:
[1]: 简体中文
[2]: English
请选择安装语言 [1]:
解压安装程序.......... core file size (blocks, -c) unlimited
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 11443
max locked memory (kbytes, -l) 16384
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 11443
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
可打开文件数过少,建议至少设置为 65536 或更多。
欢迎使用达梦数据库安装程序
是否输入 Key 文件路径? (Y/y:是 N/n:否) [Y/y]:n
是否设置时区? (Y/y:是 N/n:否) [Y/y]:n
安装类型:
1 典型安装
2 服务器
3 客户端
4 自定义
请选择安装类型的数字序号 [1 典型安装]:
所需空间: 2037M
请选择安装目录 [/home/dmdba/dmdbms]:/dm8
可用空间: 12G
是否确认安装路径(/dm8)? (Y/y:是 N/n:否) [Y/y]:y
安装前小结
安装位置: /dm8
所需空间: 2037M
可用空间: 12G
版本信息:
有效日期:
安装类型: 典型安装
是否确认安装? (Y/y:是 N/n:否):y
2024-08-21 11:43:27
[INFO] 安装达梦数据库... 2024-08-21 11:43:27
[INFO] 安装 基础 模块... 2024-08-21 11:43:30
[INFO] 安装 服务器 模块... 2024-08-21 11:43:31
[INFO] 安装 客户端 模块... 2024-08-21 11:43:32
[INFO] 安装 驱动 模块... 2024-08-21 11:43:33
[INFO] 安装 手册 模块... 2024-08-21 11:43:33
[INFO] 安装 服务 模块... 2024-08-21 11:43:34
[INFO] 移动日志文件。
2024-08-21 11:43:34
[INFO] 安装达梦数据库完成。
请以 root 系统用户执行命令:
/dm8/script/root/root_installer.sh
安装结束
介绍 DM 安装目录:
bin : 数据库服务文件、 命令行工具、key 文件
tool:图形化客户端工具
log :日志
doc :DM 官方手册
samples :示例库
Uninstall/ uninstall.sh :卸载软件
drivers :驱动
script :脚本文件
1.4 卸载 DM8 软件
卸载 DM8 软件可以通过图形化或者命令行方式。
图形化方式卸载:
[dmdba@localhost dm8]$ cd /dm8/
使用 root 用户执行脚本文件:
[root@localhost 桌面]# /dm8/root_uninstaller.sh
手动清空/dm8 下的内容:
[dmdba@localhost dm8]$ rm -rf /dm8/* 2、创建 DM 数据库实例
一个数据库软件可以创建多个数据库实例,实例之间通过端口号区分。达梦数据库默认端口
号就是 5236. 图形化方式建库:
[root@localhost 桌面]# xhost +
access control disabled, clients can connect from any host
[root@localhost 桌面]# echo $DISPLAY
:0.0
[root@localhost 桌面]# su - dmdba
上一次登录: 三 8 月 21 11:21:00 CST 2024 pts/0 上
[dmdba@localhost ~]$ export DISPLAY=:0.0
[dmdba@localhost ~]$ cd /dm8/tool/
[dmdba@localhost tool]$ ./dbca.sh
考试时,一定要按要求设置数据库管理员 SYSDBA 用户密码,SYSDBA 密码错误记 0 分。
使用 root 用户执行三个脚本文件:
[root@localhost 桌 面 ]# mv /dm8/bin/DmServiceDMSERVER.service
/usr/lib/systemd/system/DmServiceDMSERVER.service
[root@localhost 桌面]# systemctl enable DmServiceDMSERVER.service
[root@localhost 桌面]# systemctl start DmServiceDMSERVER.service
命令行方式建库:
/dm8/bin/dminit
[dmdba@localhost DAMENG]$ cd /dm8/bin
查看帮助手册:
[dmdba@localhost bin]$ ./dminit help
创建数据库 DMDB,实例名 PROD,端口号是 5237,存放路径/dm8/data,数据库管理员密码
dameng123
[dmdba@localhost bin]$ ./dminit db_name=DMDB instance_name=PROD port_num=5237
path=/dm8/data sysdba_pwd=dameng123
注册数据库服务:
[root@localhost DMDB]# cd /dm8/script/root/
查看帮助手册:
[root@localhost root]# ./dm_service_installer.sh -h
[root@localhost root]# ./dm_service_installer.sh -t dmserver -p PROD -dm_ini
/dm8/data/DMDB/dm.ini
3、数据库实例管理
3.1 连接数据库
(1)disql
1)bin
[dmdba@localhost tool]$ cd /dm8/bin
[dmdba@localhost bin]$ ./disql sysdba/Dameng123
[dmdba@localhost bin]$ ./disql sysdba/Dameng123@192.168.240.100:5236
通过服务名方式连接数据库:
[root@localhost root]# vi /etc/dm_svc.conf
DMDB=(192.168.240.100:5237)
[dmdba@localhost bin]$ ./disql sysdba/dameng123@DMDB
2)tool
[dmdba@localhost tool]$ ./disql
disql V8
SQL> conn sysdba/Dameng123
SQL> conn sysdba/dameng123@192.168.240.100:5237
(2)manager
/dm8/tool
[dmdba@localhost bin]$ cd /dm8/tool/
[dmdba@localhost tool]$ ./manager
3.2 数据库实例状态
查看数据库实例的状态:
SQL> select instance_name,status$ from v$instance;
DM 数据库实例的状态:
Shutdown:关闭状态
Mount:配置状态,配置开启数据库归档模式,配置集群
Open:打开状态,数据库可以读写访问
Suspend:挂起状态,数据库只读访问
数据库实例状态的转换:
Shutdown-mount
Mount-shutdown
Mount-open
Open-mount
Open-suspend
Suspend-open
3.3 启动和关闭数据库
第一种通过前台方式启动和关闭数据库
适用于没有注册数据库服务
启动:
[dmdba@localhost bin]$ ./dmserver /dm8/data/DMDB/dm.ini
关闭:
直接输入 exit
第二种通过后台进程方式启动和关闭数据库
启动:
[dmdba@localhost bin]$ ./DmServicePROD start
关闭:
[dmdba@localhost bin]$ ./DmServicePROD stop
重启:
[dmdba@localhost bin]$ ./DmServicePROD restart
4、DM 常用工具介绍
/dm8/tool
(1)DM 管理工具
数据库日常运维:模式对象管理、表空间管理、用户管理、热备、逻辑备份、作业管理系统
等。
[dmdba@localhost tool]$ ./manager
(2)DM 控制台工具
查看和修改数据库的参数,对数据库做冷备和还原
[dmdba@localhost tool]$ ./console
(3)DM 性能监视工具
监视数据库的运行情况
[dmdba@localhost tool]$ ./monitor
(4)DM 数据迁移工具
[dmdba@localhost tool]$ ./dts
5、DMSQL
SQL 是结构化查询语句,是应用程序和数据库交互的接口。SQL 集数据操作、数据定义、数
据控制功能于一体的。
DMSQL 基于 SQL92 和 SQL99 标准。
5.1DMSQL 分类
DML:数据操纵语言,select,insert,update,delete
DDL:数据定义语言,create table,alter table,truncate table,drop table
DCL:数据控制语言,grant,revoke
TCL:事务控制语言,commit,rollback
SQL 语句书写规范:
SQL 语言大小写不敏感,字符串默认大小写敏感
SQL 可以写在一行或多行
关键字不能被拆分、缩写
使用缩进可以提高 SQL 语句可读性
5.2 简单查询
语法:
Select () from ();
第一个括号:单列查询、多列查询、全列查询、去重查询、对列起别名、表达式、连接列||
第二个括号:表
单列查询:查询员工姓名
select employee_name from dmhr.employee;
多列查询:查询员工姓名及入职时间
select employee_name,HIRE_DATE from dmhr.employee;
全列查询
select * from dmhr.employee;
去重查询:
select DISTINCT department_id from dmhr.employee;
对列起别名:
select employee_name,salary gz from dmhr.employee;
select employee_name,salary as gz from dmhr.employee;
接表达式:
给每个员工工资+500
select employee_name,salary,salary+500 as total from dmhr.employee;
连接 ||
不仅可以连接列,也可以连接字符串
....的工资是:..... select employee_name||'的工资是:'||salary from dmhr.employee;
5.3 排序查询
对一组结果集进行排序
关键字 ORDER BY
排序子句放在 SQL 语句的句尾
排序可以分为:升序和降序
升序:ASC 默认,从小到大
降序:DESC,从大到小
升序:从小到大
select employee_name,salary from dmhr.EMPLOYEE ORDER by salary asc;
select employee_name,salary from dmhr.EMPLOYEE ORDER by salary ;
select employee_name,salary from dmhr.EMPLOYEE ORDER by 2 asc;
select employee_name,salary from dmhr.EMPLOYEE ORDER by 2 ;
降序:从大到小
select employee_name,salary from dmhr.EMPLOYEE ORDER by salary desc;
select employee_name,salary from dmhr.EMPLOYEE ORDER by 2 desc;
5.4 过滤查询
使用 WHERE 子句,将不满足条件的行过滤掉。
语法:
Select () from () where ();
(1)比较运算符
= > >= < <= != <>
枚举 in() 返回列表中的值
取值范围 between .... and ..... 模糊查询 like
判断列上的值是否为空 is null/is not null
查询部门编号是 101 的员工的信息(员工姓名、部门编号)。
select employee_name,department_id from dmhr.EMPLOYEE where DEPARTMENT_ID=101;
查询工资大于等于 30000 的员工的信息(员工姓名、部门编号、入职时间、工资)
select employee_name,department_id,hire_date,salary from dmhr.EMPLOYEE where
salary>=30000;
查询部门编号是 101 或 103 的员工的信息。
select employee_name,department_id from dmhr.EMPLOYEE where DEPARTMENT_ID in
(101,103);
查询工资在 18000-19000 的员工的信息(员工姓名、工资、入职时间)
取值范围 18000-19000,并且包含 18000 和 19000
=18000 <=19000
select employee_name,hire_date,salary from dmhr.EMPLOYEE where salary BETWEEN 18000 and
19000;
模糊查询:
Like _ 匹配 1 个字符
Like % 匹配 0 个或多个字符
查询姓“王”的员工
select employee_name,department_id from dmhr.employee where employee_name like '王%';
查询姓“王”的员工,名字只包含 1 个字
select employee_name,department_id from dmhr.employee where employee_name like '王_';
查询姓名中包含“王”的员工信息
select employee_name,department_id from dmhr.employee where employee_name like '%王%';
查询姓名中以“天”结尾的员工
select employee_name,department_id from dmhr.employee where employee_name like '%天';
is null/is not null
构造数据:
create table test1 (id int,name varchar(30));
insert into test1 (id,name) values (1,'AAA');
insert into test1 (id) values (2);
insert into test1 (id) values (3);
insert into test1 (id,name) values (4,'CCC');
insert into test1 (id,name) values (5,'DDD');
commit;
select * from test1 where name is not null;
select * from test1 where name is null;
(2)逻辑运算符
AND :所有的条件同时满足,才会返回数据
OR :满足其中任意一个条件,就返回数据
NOT :当给出的条件为假时,就会返回数据
查询部门编号是 101 并且员工工资大于等于 30000。
select employee_name,salary,department_id from dmhr.EMPLOYEE where DEPARTMENT_ID=101
and salary>=30000;
查询部门编号是 101 或者员工工资大于等于 30000。
select employee_name,salary,department_id from dmhr.EMPLOYEE where DEPARTMENT_ID=101
or salary>=30000;
查询工资大于 2000 的员工
select employee_name,salary from dmhr.EMPLOYEE where not salary <2000;
5.5 分组汇总
聚合函数:
Count:统计、计数
Max:最大值
Min:最小值
Avg:平均值
Sum:求和
统计公司员工数量
select count(employee_name) from dmhr.EMPLOYEE;
select count() from dmhr.EMPLOYEE;
获取公司最高工资
select max(salary) from dmhr.EMPLOYEE;
获取公司最低工资
select min(salary) from dmhr.EMPLOYEE;
获取公司平均工资
select avg(salary) from dmhr.EMPLOYEE;
获取工资总和
select sum(salary) from dmhr.EMPLOYEE;
(1)group by
语法:
Select () from () group by () ;
Select () from () where () group by () ;
统计每个部门的人数
select department_id,count() from dmhr.EMPLOYEE group by DEPARTMENT_ID;
获取部门工资总和
select department_id,sum(salary) from dmhr.EMPLOYEE group by DEPARTMENT_ID;
(2)Having
语法:
Select () from () group by () having();
Select () from () where () group by () having() ;
查询部门平均工资大于 12000,平均工资降序显示。
select department_id,avg(salary) from dmhr.EMPLOYEE group by DEPARTMENT_ID
having avg(salary) >12000
order by avg(salary) desc;
5.6 连接查询
在 SQL99 中,查询可以分为内连接查询和外连接查询。
内连接查询:查询只会返回满足条件的数据。
外连接查询:查询除了返回满足条件的数据外,不满足的也返回,用 null 代替。
(1)内连接查询
内连接查询:自然连接查询、交叉连接查询、USING、ON。
语法:
SELECT table1.column, table2.column
FROM table1
[CROSS JOIN table2] |
[NATURAL JOIN table2] |
[JOIN table2 USING (column_name)] |
[JOIN table2
ON(table1.column_name = table2.column_name)];
自然连接查询
自然连接查询的表,不需要指定连接列。要求两个表中有同名且相同数据类型的列。
语法:
SELECT table1.column, table2.column
FROM table1
NATURAL JOIN table2;
select a.EMPLOYEE_NAME,DEPARTMENT_ID,b.DEPARTMENT_NAME from
dmhr.EMPLOYEE a NATURAL JOIN dmhr.DEPARTMENT b;
交叉连接查询
交叉连接查询也叫笛卡集,是两个表的乘积。
语法:
SELECT table1.column, table2.column
FROM table1
CROSS JOIN table2;
select count() from dmhr.EMPLOYEE ;---856
select count() from dmhr.DEPARTMENT;---46
select count(*) from dmhr.EMPLOYEE CROSS join dmhr.DEPARTMENT;
USING 子句
在 NATURAL JOIN 子句创建等值连接时,可以使用 USING 子句指定等值连接中需要用到的
列
使用 USING 可以在有多个列满足条件时进行选择
不要给选中的列中加上表名前缀或别名
语法:
SELECT table1.column, table2.column
FROM table1
JOIN table2 USING (column_name);
select a.employee_name,a.salary,B.DEPARTMENT_NAME from dmhr.EMPLOYEE a join
dmhr.DEPARTMENT b
using (department_id);
ON 子句
语法:
SELECT table1.column, table2.column
FROM table1
JOIN table2
ON(table1.column_name = table2.column_name);
select a.employee_name,a.salary,B.DEPARTMENT_NAME from dmhr.EMPLOYEE a join
dmhr.DEPARTMENT b
on (a.DEPARTMENT_ID=b.DEPARTMENT_ID);
(2)外连接查询
外连接查询:左外连接、右外连接、全外连接查询。
语法:
SELECT table1.column, table2.column
FROM table1
[LEFT|RIGHT|FULL OUTER JOIN table2
ON (table1.column_name = table2.column_name)];
左外连接
Left join /left outer join
会返回左边表的全部数据,右边表数据匹配上就返回,没有匹配上就用 NULL 代替。
select c.city_name,l.street_address from dmhr.city c left join dmhr.location l on
c.city_id=l.city_id;
右外连接
Right join /right outer join
会返回右边表的全部数据,左边表数据匹配上就返回,没有匹配上就用 NULL 代替。
select c.city_name,l.street_address from dmhr.city c RIGHT join dmhr.location l on
c.city_id=l.city_id;
全外连接
左外连接+右外连接
full join /full outer join
select c.city_name,l.street_address from dmhr.city c full join dmhr.location l on
c.city_id=l.city_id;
5.7 子查询
当一个查询的结果是另外一个查询的条件时,就叫子查询。子查询可以嵌套子查询。
子查询可以分为:单行子查询和多行子查询。
单行子查询:子查询的结果只返回一条数据
多行子查询:子查询的结果返回不止一条数据
语法:
SELECT select_list
FROM table
WHERE expr operator
(SELECT select_list FROM table);
单行子查询
= > >= < <= != 查询和陈仙在一个部门的员工。
select employee_name,department_id,salary from dmhr.EMPLOYEE where DEPARTMENT_ID=
(select department_id from dmhr.EMPLOYEE where EMPLOYEE_NAME='陈仙');
多行子查询
in any all
IN 等于列表中的任意一个
ANY 将值与子查询返回的任意一个值进行比较
ALL 将值与子查询返回的每个值进行比较
查询比 102 号部门工资都高的人
select employee_name,department_id,salary from dmhr.EMPLOYEE where salary > all
(select salary from dmhr.EMPLOYEE where DEPARTMENT_ID=102);
6、DM8 体系结构
DM 数据库是一个典型的 C/S 架构,由 client+server 组成
数据库(SERVER)=实例+数据库(狭义上的数据库)
数据库:一堆磁盘上的数据库文件,包括:配置文件、控制文件、数据文件、重做日志文件、
归档日志文件、备份文件、日志文件
实例:正在运行的一个进程和一组后台线程+共享内存区域
一个实例管理一个数据库,就叫单机环境
多个实例管理一个数据库,就是 DSC 环境
6.1 存储结构
6.1.1 物理存储结构
(1)配置文件
DM 数据库只有 1 个配置文件,dm.ini
select para_name,para_value,para_type from v$dm_ini;
参数类型:
SESSION:动态会话级参数,即改即生效,针对当前会话有效
SYS:动态系统级参数,即改即生效,修改动态参数会同时修改内存和配置文件中的值。
INFILE:静态参数,只修改配置文件中的值,修改完后,需要重启数据库实例生效,
READ ONLY:只读参数,只能通过文本编辑器修改参数
修改动态参数:
方法 1:
Sp_set_para_value(参数类型,参数名,参数值);
参数类型为 1,代表动态参数
参数类型为 2,代表静态参数
sp_set_para_value(1,'SVR_LOG',1);
方法 2:
alter system set 'SVR_LOG'=0 both;
Both:会同时修改内存和配置文件中的值
Spfile:只修改配置文件中的值
Memory:只修改内存中的值
方法 3:
通过文本编辑器、console 工具
修改静态参数:
COMPATIBLE_MODE
是否兼容其他数据库模式。
0:不兼容,1:兼容 SQL92 标准,2:部分兼容 ORACLE,3:部分兼容 MS SQL SERVER,
4:部分兼容 MYSQL,5:兼容 DM6,6:部分兼容 TERADATA,7:部分兼容 POSTGRES
修改数据库兼容模式为兼容 ORACLE 数据库
sp_set_para_value(2,'COMPATIBLE_MODE',2);
alter system set 'COMPATIBLE_MODE' = 2 spfile;
(2)控制文件
以.ctl 结尾的文件
DM 只有一个控制文件,无法做到多路复用
查看控制文件
[dmdba@localhost ctl_bak]$ cd /dm8/bin
[dmdba@localhost bin]$ ./dmctlcvt help
将控制文件转换为文本文件:
[dmdba@localhost bin]$ ./dmctlcvt type=1 src=/dm8/data/DAMENG/dm.ctl
dest=/home/dmdba/ctl.txt
控制文件记录的内容:
- 数据库名称;
- 数据库服务器模式;
- OGUID 唯一标识;
- 数据库服务器版本;
- 数据文件版本;
- 数据库的启动次数;
- 数据库最近一次启动时间;
- 表空间信息,包括表空间名,表空间物理文件路径等,记录了所有数据库中使用的
表空间,数组的方式保存起来; - 控制文件校验码
(3)重做日志文件
重做日志文件记录的是数据库发生变更的信息。达梦数据库默认有两个重做日志文件,没有
日志组。
重做日志文件的特点:循环写、可覆盖。
查看重做日志文件:
select path,RLOG_SIZE/1024/1024 from v$rlogfile;
添加重做日志文件:
alter DATABASE ADD LOGFILE '/dm8/data/DAMENG/DAMENG03.log' SIZE 300;
Resize 重做日志文件大小
alter database RESIZE LOGFILE '/dm8/data/DAMENG/DAMENG01.log' to 300;
alter database RESIZE LOGFILE '/dm8/data/DAMENG/DAMENG02.log' to 300;
注意:重做日志文件,只能添加不能删除;只能扩大,不能缩小。
(4)数据文件
以.DBF 结尾的文件
select * from v$datafile;
select * from DBA_DATA_FILES;
6.1.2 逻辑存储结构
页:页是数据库的最小的使用单元,页支持 4k、8k、16k、32k,标准页大小为 8k。
查看数据库页大小:
select page;
簇:连续的 16、32、64 个页组成。簇是数据库最小的分配单元。
段:段是簇上级逻辑单元。段可以跨多个数据文件,段会占用存储空间。类型:表、索引、
临时段、回滚段。
表空间:数据库可以拥有多个表空间,一个表空间可以拥有一个或多个数据文件,一个数据
文件只能属于一个表空间。
6.2 内存结构
(1)共享内存池
服务器启动会向操作系统申请一大片内存,供其他内存池或者缓冲区不够用时,提供调用。
参数:MEMORY_POOL
MEMORY_TARGET:共享内存池在扩充到此大小以上后,空闲时收缩回此指定大小
MEMORY_EXTENT_SIZE:共享内存池每次增量扩充大小
(2)数据缓冲区
缓存的是数据页。
参数:BUFFER
select para_name,para_value from v$dm_ini where para_name='BUFFER';
数据缓冲区类型:
Normal,keep 缓存的是数据页,可以手动管理,达梦数据库 keep 的是表空间
Fast,recycle 缓存的是临时页和回滚页,数据库自动管理。
数据缓冲区和共享内存池没有关系,数据缓冲区满了,会淘汰 LRU 链表上很少被使用到的
数据页。
数据缓冲区大小设置建议:
Oltp,建议设置物理内存的 40%-60%
Olap,建议设置物理内存的 60%-80%
如果数据库中查询有大量的全表扫描,可以考虑调整参数 MULTI_PAGE_GET_NUM
将数据缓冲区大小设置为 800m
sp_set_para_value(2,'BUFFER',800);
(3)重做日志缓冲区
重做日志缓冲区缓存的是重做日志的信息。
参数:RLOG_BUF_SIZE
单位是:页
select para_name,para_value,para_type from v$dm_ini where para_name='RLOG_BUF_SIZE';
当重做日志缓冲区不够用时,会向操作系统申请内存。
(4)SQL 缓冲区
SQL 缓冲区缓存的是 SQL、执行计划、结果集的信息。
参数:CACHE_POOL_SIZE
select para_name,para_value,para_type from v$dm_ini where para_name='CACHE_POOL_SIZE';
当 SQL 缓冲区不够用时,会向共享内存池申请内存。
(5)字典缓冲区
缓存的是数据字典的信息。
参数:DICT_BUF_SIZE
select para_name,para_value,para_type from v$dm_ini where para_name='DICT_BUF_SIZE';
当字典缓冲区不够用时,会向共享内存池申请内存。
(6)其他运行时内存池
其他运行时内存池具有需要时被创建、使用完立即销毁的特点。包括:会话内存池、虚拟
机内存池、排序区、hash 区等。
6.3 线程结构
(1)监听线程
在数据库服务器端监听来自客户端的连接请求,加入工作线程对列。
(2)IO 线程
将磁盘上数据文件中的数据页加载到数据缓冲区中;将数据缓冲区中的脏页在一定机制(数
据缓冲区满、执行检查点、数据库正常关闭)下更新到磁盘上的数据文件中。
(3)日志刷新线程
将重做日志缓冲区中重做日志(事务提交、执行检查点)更新到磁盘上的重做日志文件中。
(4)日志归档线程
数据库开启归档模式后,在重做日志文件被覆盖前将重做日志文件内容拷贝到归档路径下做
副本。
(5)日志重做线程
利用重做日志文件信息和 undo 信息将数据库恢复到一致的状态。
(6)调度线程
检查系统级的时间触发器;
清理 SQL 缓存、计划缓存中失效的项,或者超出缓存限制后淘汰不常用的缓存项;
动态缓冲区检查。根据需要动态扩展或动态收缩系统缓冲池;
自动执行检查点;
会话超时检测;
必要时执行数据更新页刷盘;
唤醒等待的工作线程;
(7)工作线程
内核的工作线程机制包括普通内核线程和用户态线程两种,普通内核线程的切换完全由操作
系统决定,但操作系统无法了解进程内部的运行机制,只能采取通用的调度策略来管理各个
内核线程;用户态线程在内核线程内部自主调度,有效减少上下文切换
7、表空间管理
7.1 查询表空间
select * from v$tablespace;
select * from dba_tablespaces;
介绍 DM 表空间:
SYSTEM:系统表空间,主要存放数据库的数据字典和动态性能视图的信息。
TEMP:临时表空间,临时表、排序等。
MAIN:默认表空间,新建用户时没有指定默认表空间,就是 MAIN 表空间。
ROLL:回滚表空间,存放回滚记录。
7.2 创建表空间
例:创建表空间 TEST,数据文件/dm8/data/DAMENG/TEST01.DBF,数据文件初始大小为 30M.
数据文件最小大小为 4096*页大小
8k 数据文件最小为 32M
例:创建表空间 TEST,数据文件/dm8/data/DAMENG/TEST01.DBF,数据文件初始大小为 50M,
数据文件开启自动扩展,每次扩展 2M,最大可扩展至 1G.
create tablespace test datafile '/dm8/data/DAMENG/TEST01.DBF' size 50 autoextend on next 2
maxsize 1024 CACHE = NORMAL;
例:创建表空间 TBS,数据文件分别为
/dm8/data/DAMENG/TBS01.DBF,/dm8/data/DAMENG/TBS02.DBF,数据文件初始大小为 50M,每
个数据文件开启自动扩展,每次扩展 1M,最大可扩展至 10G.
create tablespace "TBS" datafile '/dm8/data/DAMENG/TBS01.DBF' size 50 autoextend on next 1
maxsize 10240, '/dm8/data/DAMENG/TBS02.DBF' size 50 autoextend on next 1 maxsize 10240
CACHE = NORMAL;
7.3 管理表空间
(1)表空间状态
select tablespace_name,STATUS from dba_tablespaces;
Status:0 代表联机,在线;1 代表脱机,离线
表所在表空间脱机后,将无法访问该表的数据
将 MAIN 表空间脱机和联机
alter TABLESPACE MAIN OFFLINE;
alter TABLESPACE MAIN ONLINE;
(2)表空间维护
当表空间不够用时:
Resize 数据文件大小
alter tablespace "TEST" resize datafile 'TEST01.DBF' to 100;
添加数据文件
alter tablespace "TEST" add datafile '/dm8/data/DAMENG/TEST02.DBF' size 32;
迁移数据文件:
Alter tablespace "TEST" offline;
alter tablespace "TEST" rename datafile 'TEST01.DBF' to '/home/dmdba/TEST01.DBF';
alter tablespace "TEST" online;
(3)修改 TEMP 表空间大小
将 TEMP 表空间大小改为 100M
sp_set_para_value(2,'TEMP_SIZE',100);
(4)删除表哦空间
drop tablespace "TBS";
注意:SYSTEM、TEMP、ROLL 表空间不能脱机、删除。 8、用户管理
8.1 用户
查看和介绍 DM 用户
select username,ACCOUNT_STATUS,LOCK_DATE,EXPIRY_DATE,DEFAULT_TABLESPACE from
dba_users;
企业版用户,三权分立:
SYSDBA:数据库管理员
SYSAUDITOR:数据库审计员,创建审计规则,查看审计记录
SYSSSO:数据库安全员,创建数据库安全规则
SYS:不能登录,存放数据字典和动态性能视图的信息
安全版用户,四权分立:
在企业版用户基础上,新增数据库对象操作员 SYSDBO
8.2 权限
权限可以分为:系统权限和对象权限。
8.3 角色
角色就是一组权限的集合,使用角色就是为了方便权限管理。
角色可以被授予给角色,也可以被授予给用户。
8.4 创建用户
创建用户时应该考虑到:
用户的命名:以字母开头,长度不超过 128 个字符
密码
权限:系统权限、对象权限、角色
资源配置:失败登录次数、密码有效期等
默认表空间
例 1:创建用户 TEST,密码 dameng123,拥有创建表、创建视图、创建索引的权限。该用户
的默认表空间是 TEST,失败登录 5 次后,账号锁定 3 分钟。
create user "TEST" identified by "dameng123"
limit FAILED_LOGIN_ATTEMPS 5 PASSWORD_LOCK_TIME 3
default tablespace "TEST";
grant "PUBLIC","SOI" to "TEST";
grant CREATE TABLE,CREATE VIEW,CREATE INDEX to "TEST";
8.5 创建 profile
CREATE PROFILE "PROFILE1" LIMIT FAILED_LOGIN_ATTEMPS 3, PASSWORD_LOCK_TIME 1, PASSWORD_GRACE_TIME 10 ,SESSION_PER_USER 500 ,PASSWORD_LIFE_TIME 90;
修改用户资源设置为 profile1
alter user test PROFILE profile1;
8.6 创建角色
create role "ROLE1";
grant "RESOURCE" to "ROLE1";
grant CREATE TABLE,CREATE VIEW to "ROLE1";
grant SELECT on "DMHR"."EMPLOYEE" to "ROLE1";
8.7 修改用户
revoke CREATE INDEX from "TEST";
grant UPDATE("PHONE_NUM") on "DMHR"."EMPLOYEE" to "TEST";
grant SELECT on "DMHR"."DEPARTMENT" to "TEST";
grant SELECT("HIRE_DATE") on "DMHR"."EMPLOYEE" to "TEST";
grant UPDATE("EMAIL") on "DMHR"."EMPLOYEE" to "TEST";
grant SELECT("EMPLOYEE_NAME") on "DMHR"."EMPLOYEE" to "TEST";
将 ROLE1 角色授予给 TEST 用户:
grant "ROLE1" to "TEST";
修改用户密码:
alter user "TEST" identified by "DAMENG123";
修改用户默认表空间:
alter user "TEST" default tablespace "DMHR";
锁定和解锁用户:
alter user TEST ACCOUNT LOCK;
alter user TEST ACCOUNT UNLOCK;
查看用户 TEST,角色 ROLE1 被授予的系统权限:
select * from dba_sys_privs where GRANTEE in ('TEST','ROLE1');
查看用户 TEST,角色 ROLE1 被授予的对象权限:
select * from SYS.DBA_TAB_PRIVS where GRANTEE in ('TEST','ROLE1');
select * from SYS.DBA_COL_PRIVS where GRANTEE in ('TEST','ROLE1');
查看 TEST 用户被授予的角色:
select * from SYS.DBA_ROLE_PRIVS where GRANTEE='TEST';
删除用户:
drop user "TEST";
9、模式对象管理
9.1 模式
模式就是一组数据库对象的集合,使用模式方便数据库对象管理。
模式与用户的关系:
一个用户可以拥有多个模式,一个模式只能属于一个用户。新建用户时,会自动创建一个同
名的模式。
访问某个模式下的表,不加模式名
方法一:切换模式
set schema dmhr;
select * from employee;
方法二:创建同义词
9.2 表
DM 数据库支持表的类型:索引组织表、堆表、外部表、分区表、临时表等。
DM 数据库默认表的类型是索引组织表。
规划表考虑到的因素:
表名:以字母开头
列及数据类型:int,number,char,varchar,varchar2,text,clob,date,time,datetime,clob,blob
约束:非空、唯一、主键、外键、检查约束
表空间
权限
范式
9.2.1 创建表
(1)非空约束
(2)唯一约束
创建唯一约束会自动创建唯一索引,唯一约束会忽视 NULL,NULL 不等于任何值。
CREATE TABLE "TEST"."TEST2"
("ID" INT, "NAME" VARCHAR(50), UNIQUE("NAME")) STORAGE(ON "MAIN") ;
执行数据批量导入:
管理工具(manager):
/home/dmdba/script.sql disql 工具: 方法一:
/home/dmdba/script.sql
方法二:
start /home/dmdba/script.sql
(3)主键约束
主键约束:非空+唯一,一个表只能有一个主键约束
CREATE TABLE "TEST"."TEST3"
("ID" INT NOT NULL,
"NAME" VARCHAR(60), NOT CLUSTER PRIMARY KEY("ID")) STORAGE(ON "TEST", CLUSTERBTR) ;
(4)外键约束
外键约束也叫引用约束
CREATE TABLE "TEST"."TEST4"
("ID" INT, "NAME" VARCHAR(50), FOREIGN KEY("ID") REFERENCES "TEST"."TEST3"("ID")) STORAGE(ON "TEST", CLUSTERBTR) ;
insert into test.test3 values(1,'AAA');
insert into test.test4 values(1,'AAA');
insert into test.test3 values(2,'BBB');
insert into test.test4 values(2,'BBB');
Commit;
delete from test.test4 where id=1;
delete from test.test3 where id=1;
Commit;
注意:有主外键约束关系的表,在插入数据时,先插入主键约束表的记录,再插入外键约束
表的记录;在删除数据时,要先删除外键约束表的记录,再删除主键约束表的记录。
update test.test2 set name='FFF' where id=4;
(5)检查约束
number(精度,标度)
精度:数字有多少位
标度:小数点位数
number(5,2)
999.99
CREATE TABLE "TEST"."TEST5"
("ID" NUMBER(5,2), CHECK(ID > 5)) STORAGE(ON "TEST", CLUSTERBTR) ;
取值范围:5.01-999.99
9.2.2 修改表
添加列:
alter table "TEST"."TEST1" add column("ADD1" VARCHAR(50));
删除列:
alter table "TEST"."TEST1" drop column "ADD1";
重命名表:
alter TABLE test.test6 rename to test1;
重命名列:
alter table test.test1 RENAME COLUMN id1 to id;
禁用/启用约束:
alter table test.test5 DISABLE CONSTRAINT CONS134218875;
alter table test.test5 ENABLE CONSTRAINT CONS134218875;
查看约束:
select * from SYS.DBA_CONSTRAINTS where OWNER='TEST';
删除表:
drop table "TEST"."TEST5";
9.3 视图
DM 视图分为:简单视图、复杂视图、物化视图
视图就是一个查询语句,一张虚拟表。
创建视图:
Create view .... as select ...;
Create or replace view .... as select ...;
grant select on dmhr.employee to test;
create view test.view_emp as select employee_name,department_id,salary
from dmhr.employee where department_id=101;
删除视图:
drop view test.VIEW_EMP;
9.4 索引
索引是一种数据库对象。
索引的特点:
索引会占用存储空间
对表做维护时,数据库会自动维护索引
适合建立索引:
连接列
Where 条件中出现的列
不适合建立索引:
列上有大量的重复数据或者空值
结果集返回大量数据
创建索引:
create index "DMHR"."IND_NAME" on "DMHR"."EMPLOYEE"("EMPLOYEE_NAME");
维护索引:
索引的不可见/可见
alter INDEX dmhr.ind_name INVISIBLE;
alter INDEX dmhr.ind_name VISIBLE;
索引的无效和有效
alter INDEX dmhr.ind_name UNUSABLE;
alter INDEX dmhr.ind_name REBUILD;
注意:索引不可见,执行计划不会选择索引,表维护时会自动维护索引;
索引无效后,执行计划不会选择索引,表维护时不会维护索引,只能重建。
删除索引:
drop index dmhr.ind_name;
10、备份还原
10.1 冷备
创建备份路径:
mkdir -p /dm8/backup
需要关闭数据库,需要开启 DmAP 服务
[dmdba@localhost bin]$ ./DmServiceDMSERVER stop
方法一:
[dmdba@localhost tool]$ ./console
方法二:dmrman
[dmdba@localhost tool]$ cd /dm8/bin
[dmdba@localhost bin]$ ./dmrman
dmrman V8
RMAN> backup database '/dm8/data/DAMENG/dm.ini' backupset '/dm8/backup';
10.2 热备
需要数据库在打开状态
[dmdba@localhost bin]$ ./DmServiceDMSERVER start
数据库 DmAP 服务在运行状态
[dmdba@localhost bin]$ ./DmAPService start
需要数据库开启归档模式
查看数据库是否开启归档模式:
select name,arch_mode from v$database;
图形化开归档:
命令行开归档:
Alter database mount;
alter database archivelog;
alter database add archivelog 'DEST=/dm8/arch, TYPE=LOCAL, FILE_SIZE=64, SPACE_LIMIT=0, ARCH_FLUSH_BUF_SIZE=0';
Alter database open;
查看归档信息:
select * from v$arch_status;
(1)数据库
管理工具:
提示的原因:没有备份到数据库的默认备份路径
Disql 工具:
SQL> backup database full backupset '/dm8/backup/full1';
(2)表空间
表空间备份只能热备;表空间还原恢复,只能脱机还原
方法一:管理工具
方法二:disql 工具
backup tablespace main full backupset '/dm8/backup/ts2';
(3)表
方法一:管理工具
方法二:disql 工具
backup table test.test1 backupset '/dm8/backup/tab2';
10.3 还原恢复
整库和表空间还原恢复都需要关闭数据库。
[dmdba@localhost bin]$ ./DmServiceDMSERVER stop
需要 DmAP 服务在运行中
(1)整库还原恢复
还原——恢复——更新数据库魔数
方法一:console 工具
方法二:dmrman 工具
restore database '/dm8/data/DAMENG/dm.ini' from backupset '/dm8/backup';
RECOVER DATABASE '/dm8/data/DAMENG/dm.ini' WITH ARCHIVEDIR '/dm8/arch';
RECOVER DATABASE '/dm8/data/DAMENG/dm.ini' UPDATE DB_MAGIC;
(2)表空间还原恢复
还原表空间——恢复表空间
方法一:console 工具
方法二:dmrman 工具
RMAN> restore database '/dm8/data/DAMENG/dm.ini' tablespace dmhr from backupset
'/dm8/backup';
RMAN> recover database '/dm8/data/DAMENG/dm.ini' tablespace dmhr with archivedir
'/dm8/arch';
10.4 逻辑备份还原
逻辑导出一共有 4 个级别:
FULL:整库导出
OWNER:用户级别导出
SCHEMAS:模式级别导出
TABLES:表级别导出
导出/导入
dexp/dimp
查看帮助手册:
/dm8/bin/dexp help
/dm8/bin/dimp help
(1)整库级别导出
/dm8/bin/dexp SYSDBA/Dameng123 DIRECTORY=/dm8/backup FILE=full.dmp FULL=Y
LOG=full.log
(2)用户级别导出
/dm8/bin/dexp SYSDBA/Dameng123 DIRECTORY=/dm8/backup FILE=test.dmp OWNER=TEST
LOG=test.log
(3)模式级别导出
/dm8/bin/dexp SYSDBA/Dameng123 DIRECTORY=/dm8/backup FILE=dmhr.dmp
SCHEMAS=DMHR,PERSON LOG=dmhr.log
(4)表级别导出
/dm8/bin/dexp SYSDBA/Dameng123 DIRECTORY=/dm8/backup FILE=tables.dmp
TABLES=DMHR.DEPARTMENT,DMHR.EMPLOYEE,DMHR.LOCATION LOG=tables.log
(5)将 DMHR 模式下的数据库对象导入到 TEST 模式
/dm8/bin/dimp sysdba/Dameng123 file=dmhr.dmp directory=/dm8/backup log=imp_dmhr.log
remap_schema=dmhr:test
11、作业管理系统
作业管理系统类似于服务器的计划任务。
可以完成数据库自动备份、执行 sql、更新统计信息。
创建代理环境:
新建作业 JOB1,每周日 22:00 对数据库做完全备份
call SP_CREATE_JOB('JOB1',1,0,'',0,0,'',0,'');
call SP_JOB_CONFIG_START('JOB1');
call SP_ADD_JOB_STEP('JOB1', 'B1', 6, '00000000', 0, 0, 0, 0, NULL, 0);
call SP_ADD_JOB_SCHEDULE('JOB1', 'D1', 1, 2, 1, 1, 0, '22:00:00', NULL, '2024-08-23 16:44:28', NULL, '');
call SP_JOB_CONFIG_COMMIT('JOB1');
新建作业 JOB2,每周一、二、三、四、五、六对 22:00 对数据库做增量备份。
call SP_CREATE_JOB('JOB2',1,0,'',0,0,'',0,'');
call SP_JOB_CONFIG_START('JOB2');
call SP_ADD_JOB_STEP('JOB2', 'B2', 6, '10000000/dm8/backup', 0, 0, 0, 0, NULL, 0);
call SP_ADD_JOB_SCHEDULE('JOB2', 'D2', 1, 2, 1, 126, 0, '22:00:00', NULL, '2024-08-23 16:48:17', NULL, '');
call SP_JOB_CONFIG_COMMIT('JOB2');
12、DM8 开发
Linux 环境下 ODBC 安装与配置
[root@localhost opt]# tar -xvf unixODBC-2.3.0.tar.gz
[root@localhost opt]# cd unixODBC-2.3.0/
[root@localhost unixODBC-2.3.0]# ./configure
[root@localhost unixODBC-2.3.0]# make && make install
[root@localhost unixODBC-2.3.0]# cd /usr/local/etc/
配置文件:
Odbc.ini
[root@localhost etc]# vi odbc.ini
[DM8]
Description = DM ODBC DSN
Driver = DM8 ODBC DRIVER
SERVER = localhost
UID = SYSDBA
PWD = Dameng123
TCP_PORT = 5236
Odbcinst.ini
[root@localhost etc]# vi odbcinst.ini
[DM8 ODBC DRIVER]
Description = ODBC DRIVER FOR DM8
Driver = /dm8/bin/libdodbc.so
使用 dmdba 用户测试连接:
13、考试
考试形式:上机实操
考试时间:120 分钟
考试分数:100 分总分,70 分合格,内部员工 90 分拿证。
考试内容:DM8 软件安装、创建数据库、创建表空间、用户管理、修改数据库参数、创建
表、导入数据、创建视图、创建索引、数据库备份还原、数据库逻辑备份、作业管理、DM8
开发接口配置。