达梦数据库作为已商业化的国产数据库代表,在*及事业单位应用还是比较广泛。
最近有幸参加了达梦数据库的课程培训,颇有收获。
期间学习内容有:
1.数据库行业的发展历史和选型;
2.DM8数据库软件安装;
3.DM8数据库实例管理;
4.数据库管理工具的学习和使用;
5.DMSQL语言学习使用;
6.DM8体系结构学习;
7.表空间管理;
8.用户管理;
9.模式对象管理;
10.数据库的备份和还原;
11.作业创建和管理;
12.DM8的ODBC配置。
已经通过学习掌握了达梦数据库的体系结构和初步的数据库管理。
这里记录了相关的学习内容,希望能帮助到更多的小伙伴快速了解该数据库。
数据库行业
1、数据库行业(架构选型)
1.1 关系型数据库
商业数据库:Oracle 、MSSQL、Sybase、DB2
开源数据库:MYSQL、PG
国产数据库:达梦8 、人大金仓8 、神通混元关系型数据库(pg、mysql、infomix)、南大通用pg、华为高斯A/T、TDSQL
1.2 非关系型数据库
Mongodb 文档型数据库
Redis 内存数据库
TimesTen oracle 内存数据库
Memcache 内存
Hadoop 集合数据库
2.DM8 安装
2.1 查看软硬件信息
查看cpu 信息:
[[email protected] ~]# lscpu
[[email protected] ~]# cat /proc/cpuinfo
注意:特别是国产cpu,龙芯、飞腾查看内存信息:
[[email protected] ~]# free -m
注意:数据库内存要至少1G,linux swap 分区一般是物理内存的1.5
倍
查看硬盘、分区信息
[[email protected] ~]# fdisk -l
[[email protected] ~]# df -h
如果数据库开启SQL 日志分析,那么/tmp 分区至少要600M
网络要求:
100M 网卡支持TCP/IP 协议
远程访问数据库需要关闭防火墙
[[email protected] ~]# systemctl status firewalld
[[email protected] ~]# systemctl stop firewalld
[[email protected] ~]# systemctl disable firewalld
支持平台:linux hpunix windows 等系统要求:
内核要在2.6 以上,glibc 2.3 UnixODBC gcc
[[email protected] ~]# uname -ra
[[email protected] yum.repos.d]# yum install gcc
配置yum环境
[[email protected] yum.repos.d]# more ns7-adv.repo
[ns7-adv-x64-os]
name=NeoKylin Linux Advanced Server 7 - os
baseurl=file:///mnt/
gpgcheck=0
gpgkey=file:///mnt/RPM-GPG-KEY-neokylin-release
enabled=1
2.2 规划路径
[[email protected] /]# mkdir -p /dm8
2.3 安装用户(建议不要使用root)
[[email protected] /]# groupadd dinstall
[[email protected] /]# useradd -g dinstall dmdba
[[email protected] /]# passwd dmdba
更改用户dmdba 的密码。
新的密码:
无效的密码: 密码少于8 个字符
重新输入新的密码:
passwd:所有的身份验证令牌已经成功更新。
[[email protected] /]# chown dmdba:dinstall /dm8 -R
[[email protected] /]# ls -ld /dm8
drwxr-xr-x. 2 dmdba dinstall 6 9 月7 11:24 /dm8
2.4 配置dmdba 用户环境变量(可选项)
环境变量生效:
[[email protected] ~]$ source .bash_profile
export DM_HOME=/dm8
PATH=$PATH:$HOME/.local/bin:$HOME/bin:$DM_HOME/bin:$DM_HOME/tool
export PATH
2.5 设置最大文件打开数
修改之后重启生效
[[email protected] /]# vi /etc/security/limits.conf
dmdba soft nofile 4906
dmdba hard nofile 65536
临时生效:ulimit -n 65536
2.6 数据库版本
开发版:有时间和并发数限制,不能作为商用
标准版:小型应用,没有集群等高级功能和特性
企业版:三权分立,大中型企业使用,具有集群等高级特性安全版:基于企业版的四权分立,安全特性进一步增强(强访问控制、
客体重用等)
2.7 数据库软件安装
GUI:
[[email protected] home]# mount -o loop /home/dm8_setup_rh7.iso /mnt
mount: /dev/loop0 写保护,将以只读方式挂载
[[email protected] ~]$ xhost +
[[email protected] mnt]$ ./DMInstall.bin
执行脚本(用root 账号)
/dm8/script/root/root_installer.sh
CLI:命令行的交互式安装
[[email protected] mnt]$ ./DMInstall.bin -i
安装目录的结构和内容:
bin:库文件和达梦常用的命令
bin2 :UTF8
Desktop:桌面
Drivers:驱动
jar :jar 包,存放的是逻辑备份、数据快速加载、日志挖掘
license_en.txt license_zh.txt :许可信息
log :日志
release_zh.txt release_en.txt :版本信息
script :脚本
uninstall uninstall.sh :卸载
web :dem 类似oracle oem
doc :文档
include :头文件(.h)
jdk :java
Samples :示例
tool :客户端工具
2.8 卸载数据库软件
注意:在卸载数据库之前,需要将数据库备份,然后关闭实例、删除
数据库及卸载数据库软件
[[email protected] dm8]$ ./uninstall.sh -i
3、创建数据库实例
一个数据库软件是可以安装多个实例,通过端口号来区分
GUI:
cd /dm8/tool
[[email protected] tool]$ ./dbca.sh
初始化数据库
判断数据库实例是否启动:
[[email protected] ~]$ dmservice.sh
查看DM进程
[[email protected] ~]$ ps -ef|grep dmserver
[[email protected] ~]$ netstat -ntl|grep 5236
[[email protected] ~]$ DmServiceDMSERVER status
[[email protected] ~]$ systemctl status DmServiceDMSERVER.service
手动创建实例TEST:
./dminit path=/dm8/data db_name=DB_TEST instance_name=TEST PORT_NUM=5239
创建服务:
[[email protected] ~]$ cd /dm8/script/root/
[[email protected] ~]$ dm_service_installer.sh -h
[[email protected] ~]# ./dm_service_installer.sh -t dmserver -p TEST -dm_ini /dm8/data/DB_TEST/dm.ini
4、DM8 数据库实例管理
4.1 数据库的状态
Shutdown:关闭状态
Mount:配置状态
Open:数据库打开状态,数据库对外提供服务
Suspend:挂起状态
4.2 数据库状态的切换
Shutdown -mount
Shutdown -open
Open-shutdown
Mount-open
Open-mount(oracle 不支持)
Open-suspend
Suspend-open
Dm 数据库不支持mount-suspend 状态,suspend-mount 状态
4.3 数据库启动过程
Shutdown-mount
根据配置文件dm.ini 分配共享内存,启动后台进程/线程,找到控制
文件的位置,验证控制文件是否损坏,最后打开控制文件。
Mount-open
根据控制文件找到数据库的数据文件和重做日志文件,分析数据库是
否需要做恢复。
4.4 数据库启动和关闭
通过进程的形式启停数据库
[[email protected] bin]$ ./DmServiceDMSERVER stop
[[email protected] bin]$ ./DmServiceDMSERVER start
在前端启停数据库
[[email protected] bin]$ ./dmserver /dm8/data/DAMENG/dm.ini
关闭数据库:exit
用服务查看器启停数据库(root 账号执行)
5、数据库工具
5.1 disql
/dm8/bin
类似于oracle 的Sqlplus / as sysdba
[[email protected] bin]$ ./disql SYSDBA/SYSDBA:5239
[[email protected] bin]$ cd /dm8/tool/
类似于oracle 的Sqlplus /nolog
[[email protected] tool]$ ./disql
disql V8
SQL> conn SYSDBA/SYSDBA:5239
5.2 管理工具manager
./manager
5.3 性能监控工具monitor
./monitor
5.4 迁移工具dts
./dits
5.5 console 工具
./console
查看和调整参数
6、DMSQL
SQL?结构化查询语言,提供了应用程序到数据库的一个接口。
6.1 DMSQL 分类
DML(数据操作语言):insert update delete select
DDL(数据定义语言):create table,drop table,alter table ,truncate
DCL(数据控制语言):权限的授予或撤回,grant,revoke
TCL(事务控制语言):commit, rollback ,save moint
6.2 SQL 语句规范
SQL 不区分大小写,除了’’ “”除外
关键字是不能被拆分,不能缩写
可以换行,可以缩进,提高阅读性
6.3 简单查询
语法:
Select () from ();
单列查询
select employee_id from dmhr.employee;
查询多列
select * from dmhr.employee;
表达式:
select employee_id,employee_name,salary,salary+500 from
dmhr.employee;
起别名:(方便识别,计算)
select employee_id,employee_name,salary,salary+500 tol from
dmhr.employee;
去重复:(隐含排序升序)
select distinct department_id from dmhr.department;
连接||
“xxx 的工资是:xxx”
select employee_name || '的工资是:' || salary from dmhr.employee;
6.4 过滤查询
语法:
Select () from () where ()
比较运算符、逻辑运算符、in、between*** and、is null/is not null、like
比较运算符:> >= < <= <> != =
select employee_name,salary from dmhr.employee where
salary>=30000;
逻辑运算符:and or not
And 同时满足:
select employee_name,department_id,salary from dmhr.employee
where department_id=101 and salary>15000;
or 满足一个条件即可:
select employee_name,department_id,salary from dmhr.employee
where department_id=101 or salary>15000;
Is null/is not null null 为空但是不等于0
select employee_name,job_id from dmhr.employee where job_id is null;
select employee_name,job_id from dmhr.employee where job_id is not
null;
IN
select employee_name,department_id from dmhr.employee
where department_id in (101,104);
Between*** and
select employee_name,department_id,salary from dmhr.employee
where salary between 20000 and 30000;
模糊查询:like % _
%匹配0 个或多个字符
_匹配1 个字符
select employee_name,salary from dmhr.employee
where employee_name like '李%';
select employee_name,salary from dmhr.employee
where employee_name like '李_';
6.5 排序
升序asc
select employee_name,salary from dmhr.employee
order by salary asc;
降序desc
select employee_name,salary from dmhr.employee
order by 2 desc;
6.6 分组函数
Count max min avg sum
语法:
Select () from () group by () having ();
除了聚合函数不用跟在group by 后面,其他select 列必须在group by
后面,having 是对group by 进一步过滤,having 不能单独使用。
求部门工资和小于8 万的部门
select department_id,sum(salary) from dmhr.employee
group by department_id
having sum(salary) <80000;
6.7 多表连接
内连接
结果集只显示满足条件的记录
交叉连接(迪卡集)
两个表记录数的乘积
select count(*) from dmhr.employee cross join
dmhr.department;--39376
select count(*) from dmhr.employee;
select count(*) from dmhr.department;
自然连接
根据列名自己过滤,两个表连接的列名和数据类型要一致
select employee_name,department_name from dmhr.employee natural
join dmhr.department;
USING
在满足多个连接列时,可以指定某一个列做连接,一般是和NATURAL
JOIN 使用,连接的列前面不能加表名或者是前缀。
select employee_name,department_name from dmhr.employee join
dmhr.department
using (department_id);
ON 子句
select c.city_name,l.street_address from dmhr.city c join dmhr.location
l on c.city_id=l.city_id;
HASH JOIN
优化器CBO 根据小表连接列做运算生成hash 值,根据hash 值去连接
大表,扫描大表
select e.employee_name,d.department_name from dmhr.employee e
inner hash join dmhr.department d
on e.department_id=d.department_id;
外连接
结果集除了显示满足条件的记录,不满足的用null 代替
左外连接
把left join 左边的全部显示出来,右边只显示满足条件的,不满足条
件的用null 补齐
select a.employee_name,b.department_name from dmhr.employee a
left join dmhr.department b
on a.department_id=b.department_id;
右外连接
把right join 右边的全部显示出来,左边只显示满足条件的,不满足
条件的用null 补齐
select a.employee_name,b.department_name from dmhr.employee a
right join dmhr.department b
on a.department_id=b.department_id;
全外连接
左外连接+右外连接
select a.employee_name,b.department_name from dmhr.employee a
full join dmhr.department b on a.department_id=b.department_id;
6.8 子查询
当一个查询是另一个查询条件时,就叫子查询。子查询先运行,子查
询的结果是外部查询(主查询)的条件
单行子查询
= > >= < <= <>
找出和金纬在一个部门的员工
select employee_name,department_id from dmhr.employee where
department_id=
(select department_id from dmhr.employee where employee_name='金
纬')
多行子查询
In any all
查询比104 部门工资都高的人
select department_id,employee_name,salary from dmhr.employee
where salary > all
(select salary from dmhr.employee where department_id=104);
Exists
一旦有记录满足条件,就立马返回值
SELECT E.EMPLOYEE_ID , E.EMPLOYEE_NAME FROM DMHR.EMPLOYEE
E
WHERE EXISTS
( SELECT * FROM DMHR.JOB_HISTORY J
WHERE E.EMPLOYEE_ID = J.EMPLOYEE_ID );
7、DM8 体系结构
DMSERVER:C/S 架构,客户端+服务器构成
DMSERVER=数据库文件+实例
实例=共享内存+后台进程/线程
非DSC 架构是一个实例对应一个数据库,DSC 架构是一个数据库可以
对应多个实例
7.1 DM8存储结构
物理结构
配置文件
以.ini 结尾的文件
[[email protected] DAMENG]$ ls -l *.ini -rw-r--r-- 1 dmdba dinstall 907 9月 11 19:35 dmarch_example.ini -rw-r--r-- 1 dmdba dinstall 2147 9月 11 19:35 dmdcr_cfg_example.ini -rw-r--r-- 1 dmdba dinstall 631 9月 11 19:35 dmdcr_example.ini -rw-r--r-- 1 dmdba dinstall 49009 9月 11 19:35 dm.ini -rw-r--r-- 1 dmdba dinstall 1537 9月 11 19:35 dminit_example.ini -rw-r--r-- 1 dmdba dinstall 2070 9月 11 19:35 dmmal_example.ini -rw-r--r-- 1 dmdba dinstall 1277 9月 11 19:35 dmmonitor_example.ini -rw-r--r-- 1 dmdba dinstall 288 9月 11 19:35 dmmpp_example.ini -rw-r--r-- 1 dmdba dinstall 1679 9月 11 19:35 dmtimer_example.ini -rw-r--r-- 1 dmdba dinstall 2146 9月 11 19:35 dmwatcher_example.ini -rw-r--r-- 1 dmdba dinstall 635 9月 11 19:35 sqllog_example.ini -rw-r--r-- 1 dmdba dinstall 479 9月 11 19:35 sqllog.ini |
查询视图:
select para_name,para_value from v$dm_ini where para_name like
'COMPAT%';
SYS 系统级:影响全局
Session 会话级:针对当前会话有效
Infile:静态参数,实例重启才能生效
sp_set_para_value(2,'COMPATIBLE_MODE',2);
1 等于both,会改变内存和参数文件中的值。
2 等于infile,会改变参数文件中的值,重启才能生效。
数据文件
以.DBF 结尾的文件
[[email protected] DAMENG]$ ls -l *DBF -rw-r--r-- 1 dmdba dinstall 157286400 9月 11 19:37 BOOKSHOP.DBF -rw-r--r-- 1 dmdba dinstall 134217728 9月 11 19:37 DMHR.DBF -rw-r--r-- 1 dmdba dinstall 134217728 9月 11 19:35 MAIN.DBF -rw-r--r-- 1 dmdba dinstall 134217728 9月 11 19:41 ROLL.DBF -rw-r--r-- 1 dmdba dinstall 24117248 9月 11 19:41 SYSTEM.DBF -rw-r--r-- 1 dmdba dinstall 10485760 9月 11 19:36 TEMP.DBF |
控制文件
以.ctl 结尾的文件
select para_name,para_value from v$dm_ini where para_name like
'%PATH%';
查看控制文件内容:
[[email protected] bin]$ ./dmctlcvt TYPE=1 SRC=/dm8/data/DAMENG/dm.ctl DEST=/tmp/dmctl.txt |
注意:不要随便修改控制文件
重做日志文件
查询重做日志文件:
select file_id,path,rlog_size from v$rlogfile;
重做日志文件记录的是数据库发生变更信息。重做日志文件的特点是
可覆盖,循环写。重做日志文件频繁切换会对数据库产生较大的性能
影响。
resize 重做日志文件
alter database resize logfile '/dm8/data/DAMENG/DAMENG01.log' TO
300;
alter database resize logfile '/dm8/data/DAMENG/DAMENG02.log' TO
300;
新增重做日志文件:
alter database add logfile '/dm8/data/DAMENG/DAMENG03.log' size
300;
注意:重做日志文件不能被删除,所有日志文件大小需要一致。
归档日志文件
就是重做日志文件的副本,用来做数据库恢复。
开启归档:
命令行开归档
[[email protected] DAMENG]$ disql sysdba/dameng123
服务器[LOCALHOST:5236]:处于普通打开状态 登录使用时间: 14.156(毫秒) disql V8 SQL> alter database mount; 操作已执行 已用时间: 00:00:01.783. 执行号:0. SQL>alter database add archivelog 'type=local,dest=/dm8/arch,file_size=100,space_limit=0'; 操作已执行 已用时间: 12.152(毫秒). 执行号:0. SQL> alter database archivelog; 操作已执行 已用时间: 5.841(毫秒). 执行号:0. SQL> alter database open; 操作已执行 已用时间: 00:00:01.866. 执行号:0. SQL> select name,arch_mode from v$database;
行号 NAME ARCH_MODE ---------- ------ --------- 1 DAMENG Y
已用时间: 8.372(毫秒). 执行号:1803. |
图形化开归档
备份文件
以.bak 为扩展名的文件,备份文件就是数据库在某一个时间点的副
本。.meta 元数据文件(备份集的信息),.bak 数据备份文件(真实的数据)
跟踪日志文件
跟踪日志文件记录的是系统各会话执行的sql 语句的信息,主要是错
误的信息、性能问题。跟踪日志文件默认是关闭的。SVR_LOG
select para_name,para_value from v$dm_ini where para_name='SVR_LOG'; |
事件日志文件
记录的是数据库运行期间产生的关键性事件:数据库的启动、关闭、
IO 错误、内存申请失败。
逻辑结构
页(块):默认为8k(8192 字节),支持4k、8k、16k、32k。数据
页是数据库最小的分配单元。包含了页头信息,数据,空闲空间,行
偏移数组。Filefactor
簇:簇是一组连续的数据页组成,默认为16 个页,支持16、32 个页,
总是在一个数据文件中。
段:是簇的上级逻辑单元,段是可以跨多个数据文件的。段分为数据
段(表段、索引段),临时段,回滚段。
select * from user_segments;
表空间:可以拥有一个或多个数据文件,一个数据文件只能属于一个
表空间。
7.2 内存结构
--共享内存池是DM SERVER 启动时从操作系统申请的一大片内存,实
例在运行中可以在共享内存池中进行申请或释放。
select para_name,para_value from v$dm_ini where para_name like '%MEMORY%';
MEMORY_TARGET 为0 表示不限制内存使用
MEMORY_POOL:公共池,减少系统调用
MAX_OS_MEMORY:可以使用物理内存的百分比
--运行时内存池给某个模块单独使用,例如会话内存吃和虚拟机内存
池。
--数据缓冲区
缓存数据页,使用数据缓冲区可以提供数据库的性能。
参数:buffer
select para_name,para_value from v$dm_ini where para_name like '%BUFFER%';
参考值:oltp 物理内存的40%-60%
Olap 物理内存的60%-80%
数据缓冲区有4 种类型:
Normal keep:可以手动调整,normal 是默,keep 缓存的是表空间。
(Oracle keep 缓存的是表)
fast recycle:系统自动管理。Recycle 缓存临时数据。
读多页:全表扫描比较多,可以考虑调整该参数。
重做日志缓冲区
存放日志的缓冲区,单位页,避免直接对磁盘IO 进行读写,提高了
数据库的性能。
select para_name,para_value,para_type from v$dm_ini
where para_name like '%RLOG_%';
重做日志刷盘的机制:每3 秒,事务提交。
SQL 缓冲区
用来存放包、执行计划、sql 结果集。对于sql 类别比较多,包、存储
过程比较多,应该适当调整sql 缓冲区。
select para_name,para_value from v$dm_ini where para_name like '%CACHE_POOL%';
是否开启sql 重用计划:
select para_name,para_value from v$dm_ini where para_name like '%USE_PLN%';
字典缓冲区
字典缓冲区主要存的是数据字典的信息,包含表的信息,列的信息。
当我们数据库中存在大量分区表、大量表时应该适当调整字典缓冲
区。
select para_name,para_value from v$dm_ini where para_name like '%DIC%';
HASH 缓冲区
主要是表在HASH 连接时会用到,虚拟的内存池,只有在做HASH 连
接使,才会生成、分配空间。
select para_name,para_value from v$dm_ini where para_name like '%HJ_BUF%';
SSD 缓冲区
默认SSD 缓冲区是关闭的,即SSD_BUF_SIZE 为0。若要配置SSD
缓冲区,将其设置为大于0 的数并指定SSD_FILE_PATH 即可
7.3 线程结构
监听线程
检测来自客户端的连接请求,并把任务交给工作线程。
IO 线程
将数据页从磁盘读入数据缓冲区中,将数据缓冲区中的脏页在一定机
制(执行检查点,数据库关闭,buffer 满)下更新到磁盘中。
日志刷新线程
将重做日志缓冲区中的记录在一定机制下刷到重做日志文件中。
日志归档线程
将重做日志文件在切换时拷贝到归档路径下做副本。分为本地归档、
同步归档、异步归档。
日志重做线程
主要用于数据库的故障恢复。
调度线程
检查系统级的时间触发器;
清理SQL 缓存、计划缓存中失效的项,或者超出缓存限制后淘汰不
常用的缓存项;
动态缓冲区检查。根据需要动态扩展或动态收缩系统缓冲池;
自动执行检查点;
会话超时检测;
必要时执行数据更新页刷盘;
唤醒等待的工作线程;
SQL 执行过程
A 客户端发起连接请求(监听线程、工作线程)
B 语法分析(字典缓冲区、SQL 缓冲区)
C 语义分析(字典缓冲区)
D 权限分析(字典缓冲区)
E 查看数据页是否在内存中,不在内存就会产生物理读,在内存中就
会产生逻辑读(数据缓冲区、sql 缓冲区、IO 线程)
F 数据发生变更(日志刷新线程、日志缓冲区、数据缓冲区、IO 线程)
G 是否有可用的执行计划,如果有就按执行计划执行sql,如果没有
生成执行计划,运行sql,结果集返回客户端。(字典缓冲区、排序
区、hash 区,工作线程,SQL 缓冲区)。
8、表空间
8.1 查看表空间
SQL> select tablespace_name,file_name from dba_data_files;
行号 TABLESPACE_NAME FILE_NAME ---------- --------------- ----------------------------- 1 SYSTEM /dm8/data/DAMENG/SYSTEM.DBF 2 DMHR /dm8/data/DAMENG/DMHR.DBF 3 BOOKSHOP /dm8/data/DAMENG/BOOKSHOP.DBF 4 MAIN /dm8/data/DAMENG/MAIN.DBF 5 TEMP /dm8/data/DAMENG/TEMP.DBF 6 ROLL /dm8/data/DAMENG/ROLL.DBF |
介绍达梦数据库表空间:
System:数据字典相关信息、动态性能视图
ROLL:数据库运行中的回滚记录
TEMP:临时表空间,排序
MAIN:数据库的默认表空间,存放的是用户的真实数据。创建用户
或者创建数据库对象时,没有指定表空间,就会存放在默认表空间
(main)中。
HMAIN:HUGE 表空间
查询表空间和数据文件:
SQL> select tablespace_name,file_name from dba_data_files;
8.2 创建表空间
案例1:创建一个初始值为30M 表空间。
SQL> create tablespace test datafile '/dm8/data/DAMENG/TEST01.DBF' SIZE 30; create tablespace test datafile '/dm8/data/DAMENG/TEST01.DBF' SIZE 30; 第1 行附近出现错误[-2410]:数据文件[/dm8/data/DAMENG/TEST01.DBF]大小无效. 已用时间: 0.962(毫秒). 执行号:0. |
表空间数据文件初始大小是4906*页(8192)=32M
案列2:创建表空间TBS,初始大小为50M,每次扩展2M,最大扩展
到1024M;
create tablespace "TBS" datafile '/dm8/data/DAMENG/TBS01.DBF' size 50 autoextend on next 2 maxsize 1024 CACHE = NORMAL; |
案例3:创建表空间TBSA,包含两个数据文件,初始大小为35M,
每次扩展1M,最大可扩展到1024M;
create tablespace "TBSA" datafile '/dm8/data/DAMENG/TBSA01.DBF' size 35 autoextend on next 1 maxsize 1024, '/dm8/data/DAMENG/TBSA02.DBF' size 35 autoextend on next 1 maxsize 1024 CACHE = NORMAL; |
8.3 表空间状态
脱机状态
Alter tablespace tbs offline;
联机状态
Alter tablespace tbs online;
8.4 维护表空间
8.4.1 表空间不足
增加数据文件
alter tablespace "TBS" add datafile '/dm8/data/DAMENG/TBS02.DBF'
size 32;
数据文件开启自动扩展
alter tablespace "TBS" datafile 'TBS02.DBF' autoextend on next 1 maxsize 1024;
resize 数据文件
alter tablespace "TBS" resize datafile 'TBS02.DBF' to 100;
8.4.2 更换数据文件路径
表空间脱机
Alter tablespace tbs offline;
修改数据文件路径
SQL> alter tablespace tbs rename datafile
'/dm8/data/DAMENG/TBS01.DBF' to '/dm8/TBS01.DBF';
表空间联机
SQL> alter tablespace tbs online;
8.5 回滚表空间
alter tablespace "ROLL" add datafile '/dm8/data/DAMENG/ROLL02.DBF'
size 32;
alter tablespace "ROLL" resize datafile 'ROLL02.DBF' to 128;
8.6 临时表空间
SQL> select para_name,para_value from v$dm_ini where para_name like '%TEMP%';
行号 PARA_NAME PARA_VALUE ---------- ---------------- ---------------- 1 TEMP_PATH /dm8/data/DAMENG 2 TEMP_SIZE 10 3 TEMP_SPACE_LIMIT 0 |
system、temp、roll 表空间不允许脱机
8.7 删除表空间
Drop tablespace tbs;
9、用户管理
用户管理分为三块:用户、权限、角色
9.1 用户
9.1.1 查看用户
SQL> select username,account_status from dba_users;
行号 USERNAME ACCOUNT_STATUS ---------- ---------- -------------- 1 SYSSSO OPEN 2 DMHR OPEN 3 SYSDBA OPEN 4 SYS OPEN 5 SYSAUDITOR OPEN |
企业版的用户
数据库预定义的用户:
Sysdba :管理员
Sys:不能登录,数据字典、视图
Sysauditor:审计员
Syssso:安全员
安全版用户:
在企业版基础上,增加sysdbo,数据库对象操作员。
9.1.2 规划用户
命名:字母开头,a-z,0-9,$#_
长度为128 个字符
权限分配:系统权限、对象权限、角色
存储位置:表空间
密码策略:PWD_POLICY
设置系统默认口令策略。
0: 无策略;
1: 禁止与用户名相同;
2: 口令长度不小于9;
4: 至少包含一个大写字母(A-Z);
8 :至少包含一个数字(0-9);
16:至少包含一个标点符号(英文输入法状态下,除“和空格外的所有符
号;若为其他数字,则表示配置值的和,如3=1+2,表示同时启用第1 项
和第2 项策略。当COMPATIBLE_MODE=1 时,PWD_POLICY 的实际值均
为0
3=1+2 7=4+2+1
通过console 工具来更改参数
通过函数sp_set_para_value()
sp_set_para_value(1,'PWD_POLICY',3)
COMPATIBLE_MODE 是否兼容其他数据库模式。0:不兼容,1:兼容SQL92
标准,2:兼容ORACLE,3:兼容MS SQL SERVER,4:兼容MYSQL
兼容ORACLE 模式sp_set_para_value(2,'COMPATIBLE_MODE',2)
9.1.3 创建用户
案例:创建test 用户,test 用户属于test 表空间,test 用户拥有创建
表、视图的权限。
1)创建test 表空间
create tablespace "TEST" datafile '/dm8/data/DAMENG/TEST01.DBF' size 32 autoextend on next 1 maxsize 500 CACHE = NORMAL;
2)创建用户
3)授权
grant CREATE TABLE to "TEST";
grant CREATE VIEW to "TEST";
查看被授予的角色和权限
select grantee,granted_role from sys.dba_role_privs
where grantee='TEST';
select * from sys.dba_sys_privs
where grantee='TEST';
9.1.4 对用户的操作
更改用户的默认表空间
alter user "TEST" default tablespace "MAIN";
更改密码:
Alter user test identified by dameng456;
sysdba 用户的密码忘记之后,无法用sysdba 用户登录数据库。
查看用户的状态
select username,account_status from dba_users;
锁定test 用户
alter user test account lock;
解锁test 用户
alter user test account unlock;
撤回权限
revoke create table from test;
删除用户:
Drop user test;
9.2 角色
一组权限的集合,方便权限管理
角色是可以被授予给角色和用户
create role "R1";
grant UPDATE("MANAGER_ID") on "DMHR"."DEPARTMENT" to "R1";
grant UPDATE("IDENTITY_CARD") on "DMHR"."EMPLOYEE" to "R1" with
grant option;
grant INSERT("EMPLOYEE_ID") on "DMHR"."EMPLOYEE" to "R1";
grant
INSERT("DEPARTMENT_ID"),UPDATE("DEPARTMENT_ID"),REFERENCES("
DEPARTMENT_ID") on "DMHR"."DEPARTMENT" to "R1";
10、模式对象管理
什么是模式?
模式就是一组数据对象的集合
模式对象:表、视图、索引、触发器、包、序列、存储过程、同义词
等
模式与用户的关系:
创建用户会自动创建一个与用户名同名的模式,一个用户可以对应多
个模式。
10.1 表
用户表:自己创建的表,存放的是真实的用户数据
系统表:数据库自己创建的表,里面存放数据库关键性的信息
DM 支持表的类型:
索引组织表、堆表、外部表、分区表
DM 默认表的类型是索引组织表,ORACLE 默认表的类型是堆表
规划表:
1)命名:以字母开头,a-z,0-9,$#_
2)数据类型:int,number,date,char,varchar,clob,blob
3)存储位置:表空间,没有指定表空间,就存放在用户默认表空间
中。
4)约束类型:主键约束、外键约束、非空约束、唯一约束、检查约
束。
非空约束:
create table test1(id char(10) not null); insert into test1 values (null); |
DM 数据库执行sql 脚本:
vi /home/dmdba/test1.sql insert into test1 values (1); insert into test1 values (2); insert into test1 values (3); commit; |
SQL> start /home/dmdba/test1.sql
唯一约束:创建唯一约束,会创建一个唯一索引,会忽视空值,NULL 不等于0
SQL> create table test2(id int unique,name varchar(25));
SQL> insert into test2 values(1,'1111');
SQL> insert into test2 values(null,'1111');
SQL> insert into test2 values(null,'1111');
SQL> insert into test2 values(1,'1111');
insert into test2 values(1,'1111');
[-6602]:违反表[TEST2]唯一性约束.
已用时间: 00:00:02.341. 执行号:0.
SQL> commit;
主键约束:非空+唯一,一个表只能有一个主键,设计主键尽量的避
开业务逻辑的列
SQL> create table test3(id int primary key);
外键约束:
SQL> create table test4 (id int foreign key references test3(id));
SQL> drop table test3;
drop table test3;
第1 行附近出现错误[-2639]:试图删除被依赖对象[TEST3].
SQL> drop table test4;
已用时间: 127.084(毫秒). 执行号:781.
SQL> drop table test3;
检查约束
SQL> create table test5(id int check(id>=5));
操作已执行
已用时间: 58.001(毫秒). 执行号:783.
SQL> insert into test5 values(1);
insert into test5 values(1);
[-6604]:违反CHECK 约束[CONS134218846].
SQL> insert into test5 values(5);
SQL> commit;
管理表:
重命名表:
Alter table test1 rename to test6;
增加列:
alter table "TEST1"."TEST6" add column("NAME" VARCHAR(30));
删除列:
Alter table test6 drop column name;
查看约束:
select constraint_name,table_name,status from user_constraints;
启用约束
alter table test2 enable constraint CONS134218843 ;
禁用约束
alter table test2 disable constraint CONS134218843 ;
删除表:
Drop table test5;
作业:
创建表test,
所属表空间为test,表的信息如下:
Id int 主键,Name varchar(30) not null,
Address varchar(60),
Phone_number number (20)
|
更新:update (表名) set 列名=() where ();
删除:delete from () where ();
10.2 视图
视图:就是一张虚拟表,一个查询语句。
DM 视图:简单视图、复制视图、物化视图
创建视图语法: create or replace view () as ***接查询语句
Create view () as
创建简单的视图:
create view test1.emp_v as
select employee_id,employee_name,salary,department_id from
dmhr.employee where department_id=1005;
查询视图:
通过manager 工具
也可以查看视图all_views
删除视图:
Drop view emp_v;
10.2 索引
索引作用:加快查询,少量的数据更新,延迟插入,数据库会自动维护索引,索引会占用存储空间。
达梦支持的索引:btree 索引,位图索引,函数索引
创建索引的基本要求:
经常查询的列
Where 条件中出现的列
连接列
返回少量或部分的数据
不适合建立索引:
1、返回大量的数据
2、列上有大量的重复数据
3、列上有大量的null
创建索引
CREATE INDEX "ind_employee_name" ON
"TEST1"."TEST_EMP"("EMPLOYEE_NAME" ASC) STORAGE(ON "TEST",
CLUSTERBTR) ;
查看索引信息:
select * from user_indexes;
查看sql 执行计划
SQL> explain select * from test_emp where employee_name='aaa';
更新统计信息
begin dbms_stats.gather_table_stats(‘TEST1’,’TEST_EMP’); end; / |
维护索引:
重建索引:提升数据库的性能
Alter index ind_employee_name rebuild;
删除索引
drop index "TEST1"."ind_employee_name";
注意:不要在业务期间,执行创建、删除、重建索引,搜集统计信息。
达梦不会自动搜集统计信息,可以配置定时作业搜集。
11、备份还原
备份就是数据库在某个一个时间点的副本
数据库备份的目的:
为了防止天灾人祸(地震、火灾、人为误操作,硬件故障等)
备份主要有:物理备份和逻辑备份
物理备份主要备份的是使用有效的数据页,逻辑备份主要是备份的数
据库对象。
物理备份:分为联机备份和脱机备份;完全备份和增量备份。
完全备份:备份指定的数据库或者表空间的全部数据。
增量备份:是指在一次全备或增备后,以后每次的备份只需要备份与
前一次相比增加或者被修改的数据页。
备份的介质:磁盘、磁带
11.1 物理备份
冷备:不需要开启归档,针对整库做备份
需要开启dmap 服务,需要关闭数据库
[[email protected] bin]$ ./DmAPService status
DmAPService (pid 14437) is running.
- console 工具备份
DmServiceDMSERVER stop |
/dm8/data/DAMENG/dm.ini
/dm8/data/DAMENG/backup
2、用dmrman 工具备份只支持冷备
cd /dm8/bin
./dmrman
RMAN> backup database '/dm8/data/DAMENG/dm.ini' backupset
'/dm8/backup';
检查备份集
RMAN> check backupset '/dm8/backup';
热备:
需要开启归档,数据库需要联机
可以备份数据库、表空间、表、归档日志文件
查看数据库归档模式:
SQL> select arch_mode from v$database;
利用manager 工具做热备
整库备份
增量备份:
Disql 工具:
整库备份:
backup database full to "full02" backupset '/dm8/backup/rb';
增量备份:
backup database increment base on backupset '/dm8/backup/rb' to
"DB_DAMENG_INCRE_2020_09_09_15_43_36" backupset
'DB_DAMENG_INCRE_2020_09_09_15_43_36';
管理工具中没有发现备份:
手动指定工作目录
表空间备份:
backup tablespace "DMHR" full to
"TS_DMHR_FULL_2020_09_09_15_47_26" backupset
'TS_DMHR_FULL_2020_09_09_15_47_26';
表备份:
backup table "DMHR"."EMPLOYEE" to
"TAB_DMHR_EMPLOYEE_2020_09_09_15_50_23" backupset
'TAB_DMHR_EMPLOYEE_2020_09_09_15_50_23';
归档日志备份:
backup archivelog all to "ARCH_2020_09_09_15_51_32" backupset
'ARCH_2020_09_09_15_51_32';
11.2 物理还原:
检查备份集
整库还原:
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;
表空间还原
表空间只能在联机模式下进行备份,脱机模式进行还原
restore database '/dm8/data/DAMENG/dm.ini' tablespace DMHR from
backupset '/dm8/backup';
recover database '/dm8/data/DAMENG/dm.ini' tablespace DMHR;
11.3 逻辑备份
Dexp/dimp
库级别
用户
模式
表
/dm8/bin
./dexp help
逻辑导出:
全库导出:
[[email protected] bin]$ ./dexp sysdba/dameng123 file=full.dmp log=full.log directory=/dm8/backup full=y
[[email protected] bin]$ ./dimp sysdba/dameng123 file=full.dmp log=full_imp.log directory=/dm8/backup full=y
用户导出:
[[email protected] bin]$ ./dexp sysdba/dameng123 file=test1.dmp log=test1.log directory=/dm8/backup owner=test1
导出表:
[[email protected] bin]$ ./dexp test1/dameng123 file=test_emp.dmp directory=/dm8/backup tables=test_emp
12、作业
新建作业1,每周三,每周日22:00 做全备
1.manager中创建代理环境
2.新建作业
ddl语句:
call SP_CREATE_JOB('job1',1,0,'',0,0,'',0,'');
call SP_JOB_CONFIG_START('job1');
call SP_ADD_JOB_STEP('job1', 'b1', 5, '01000/dm8/bak', 1, 2, 0, 0, NULL, 0);
call SP_ADD_JOB_SCHEDULE('job1', 'h1', 1, 2, 1, 8, 0, '22:00:00', NULL, '2020-09-14 06:21:42', NULL, '');
call SP_JOB_CONFIG_COMMIT('job1');
新建作业2,每周一、二、四、五、六22:00 做增备
ddl语句:
call SP_CREATE_JOB('job2',1,0,'',0,0,'',0,'');
call SP_JOB_CONFIG_START('job2');
call SP_ADD_JOB_STEP('job2', 'b2', 5, '11000/dm8/backup|/dm8/backup', 1, 2, 0, 0, NULL, 0);
call SP_ADD_JOB_SCHEDULE('job2', 'h2', 1, 2, 1, 118, 0, '22:00:00', NULL, '2020-09-14 06:26:17', NULL, '');
call SP_JOB_CONFIG_COMMIT('job2');
13、DM8 开发
Linux 环境配置odbc
用root 配置
[[email protected] home]# tar -xvf unixODBC-2.3.0.tar.gz
[[email protected] home]# cd unixODBC-2.3.0/
[[email protected] unixODBC-2.3.0]# ./configure
[[email protected] unixODBC-2.3.0]# make
[[email protected] unixODBC-2.3.0]# make install
[[email protected] unixODBC-2.3.0]# odbcinst -j
配置/usr/local/etc/odbc.ini /usr/local/etc/odbcinst.ini
vi /usr/local/etc/odbc.ini [dm8] Description = DM ODBC DSND Driver = DM8 ODBC DRIVER SERVER = localhost UID = SYSDBA PWD = dameng123 TCP_PORT = 5236 |
vi /usr/local/etc/odbcinst.ini [DM8 ODBC DRIVER] Description = ODBC DRIVER FOR DM8 DRIVER = /dm8/bin/libdodbc.so |
修改文件权限:
chmod 775 /usr/local/etc/odbc.ini chmod 775 /usr/local/etc/odbcinst.ini |
测试连接
用dmdba 账户
isql dm8