01.达梦DCA认证课程-DM数据库安装和实例管理
1.软件安装环境准备
1.1 检查linux系统信息
用户在安装 DM 前,需要检查当前操作系统的相关信息,确认 DM 安装程序与当前操作系统匹配,
以保证 DM 能够正确安装和运行。用户可以使用以下命令检查操作系统基本信息。
#获取系统位数
getconf LONG_BIT
#查询操作系统 release
lsb_release -a
#查询系统信息
cat /etc/redhat-release
#查询系统内核
uname -a
uname -r
#查看cpu
lscpu
cat /proc/cpuinfo
#查看包glibc
rpm -qa | grep glibc
1.2 查看系统内存与存储空间
内存:
为了保证 DM 的正确安装和运行,要尽量保证操作系统至少 1GB 的可用内存(RAM)。
如果可用内存过少,可能导致 DM 安装或启动失败。用户可以使用以下命令检查操作内存。
free -m
存储空间:
df -Th
lsblk
1.3 创建用户和组
[root@dmserver ~]# groupadd dinstall
[root@dmserver ~]# useradd -g dinstall -m -d /home/dmdba -s /bin/bash dmdba
[root@dmserver ~]# echo "dameng123" | passwd --stdin dmdba
Changing password for user dmdba.
passwd: all authentication tokens updated successfully.
[root@dmserver ~]# id dmdba
1.4 创建安装目录
[root@dmserver ~]# mkdir /dm
[root@dmserver ~]# chown dmdba:dinstall /dm
[root@dmserver ~]# chmod -R 775 /dm
[root@dmserver ~]# ls -ld /dm
1.5 设置文件最大打开数目
1.5.1 检查系统限制
#ulimit帮助信息
help ulimit
#查看所有当前设置
ulimit -a
1.5.2 修改文件最大打开数目
方法1:
[root@dmserver ~]# cat >> /etc/security/limits.conf << EOF
dmdba soft nofile 65536
dmdba hard nofile 65536
EOF
方法2:
[root@dmserver ~]#
cat >> /etc/profile << EOF
ulimit -n 65536
EOF
1.5.3 dmdba用户查看验证
su - dmdba
ulimit -a
1.6 准备安装介质
1.6.1 创建目录上传安装介质
mkdir /opt/software
1.6.2 md5sum 或 sha256sum 验证
使用 md5sum 或 sha256sum 验证,取决于下载的.txt 的验证码,如果文件名中是 md5 则用 md5 算法验
证,如果是 sha256 则用 sha256 算法验证
[root@dmserver software]# sha256sum dm8_setup_rh7_64_ent_8.1.1.88_20200629.iso
9c3b14a82a809aea86334b49d8439b36ab558d4ee7e7a27dbda609a27352a64b dm8_setup_
rh7_64_ent_8.1.1.88_20200629.iso
[root@dmserver software]# cat dm8_setup_rh7_64_ent_8.1.1.88_20200629_ISO_SHA256.
txt
1.6.3 挂载光盘
[root@dmserver software]# mount -o loop dm8_setup_rh7_64_ent_8.1.1.88_20200629.i
so /mnt
1.6.4 查看程序内容
[root@dmserver software]# cd /mnt
[root@dmserver mnt]# ll
total 659843
-r-xr-xr-x. 1 root root 3280977 Jun 29 14:20 DM8 Install.pdf
-r-xr-xr-x. 1 root root 672397717 Jun 29 15:48 DMInstall.bin
2.安装达梦数据库软件
2.1 安装达梦数据库软件
安装路径为/dm/dmdbms,不初始化数据库,稍后通过dbca.sh进行初始化数据库
方法1:图形化安装
[root@dmserver mnt]# cp DMInstall.bin /opt/software/dm8
[root@dmserver dm8]# su - dmdba
[dmdba@dmserver dm8]$ cd /opt/sofware/dm8
[dmdba@dmserver dm8]$ ./DMInstall.bin
方法2:命令行安装
[root@dmserver dm8]# su - dmdba
[dmdba@dmserver dm8]$ ./DMInstall.bin -i
2.2 root脚本执行
[root@dmserver ~]# /dm/dmdbms/script/root/root_installer.sh
Move /opt/dm8/bin/dm_svc.conf to /etc
Modify the files' mode of DM Server
Create the DmAPService service
Created symlink from /etc/systemd/system/multi-user.target.wants/DmAPService.
service to /usr/lib/systemd/system/DmAPService.service.
Finished to create the service (DmAPService)
Start the DmAPService service
[root@dmserver ~]# systemctl status DmAPService.service
● DmAPService.service - Dameng Assistant Plug-In Service(DmAPService).
Loaded: loaded (/usr/lib/systemd/system/DmAPService.service; enabled; vendor preset: disabled)
Active: active (running) since Wed 2022-10-19 09:07:24 CST; 3 weeks 2 days ago
Main PID: 1602 (dmap)
Tasks: 2
Memory: 8.9M
CGroup: /system.slice/DmAPService.service
└─1602 /dm/dmdbms/bin/dmap
10月 19 09:07:08 kylin-dmserver systemd[1]: Starting Dameng Assistant Plug-In Service(DmAPService)....
10月 19 09:07:24 kylin-dmserver DmAPService[1488]: [33B blob data]
10月 19 09:07:24 kylin-dmserver systemd[1]: Started Dameng Assistant Plug-In Service(DmAPService)..
2.3 查看安装目录
[dmdba@dmserver dmdbms]$ ll
总用量 36
drwxr-xr-x 10 dmdba dinstall 8192 7月 13 10:21 bin
drwxr-xr-x 2 dmdba dinstall 30 7月 13 10:11 bin2
drwxr-xr-x 3 dmdba dinstall 19 7月 13 10:20 data
drwxr-xr-x 3 dmdba dinstall 19 7月 13 10:11 desktop
drwxr-xr-x 2 dmdba dinstall 4096 7月 13 10:11 doc
drwxr-xr-x 12 dmdba dinstall 131 7月 13 10:11 drivers
drwxr-xr-x 2 dmdba dinstall 4096 7月 13 10:11 include
drwxr-xr-x 2 dmdba dinstall 94 7月 13 10:11 jar
drwxr-xr-x 7 dmdba dinstall 161 7月 13 10:11 jdk
-rwxr-xr-x 1 dmdba dinstall 1071 7月 13 10:11 license_en.txt
-rwxr-xr-x 1 dmdba dinstall 1146 7月 13 10:11 license_zh.txt
drwxr-xr-x 2 dmdba dinstall 215 7月 13 10:22 log
drwxr-xr-x 6 dmdba dinstall 92 7月 13 10:11 samples
drwxr-xr-x 3 dmdba dinstall 37 7月 13 10:11 script
drwxr-xr-x 9 dmdba dinstall 4096 7月 13 10:11 tool
drwxr-xr-x 3 dmdba dinstall 97 7月 13 10:11 uninstall
-rwxr-xr-x 1 dmdba dinstall 2208 7月 13 10:11 uninstall.sh
drwxr-xr-x 3 dmdba dinstall 88 7月 13 10:11 web
目录说明:
Bin: 达梦数据库命令和 lib 库
Bin2: uft8
Desktop: 桌面的快捷键
DOC: 用户手册和操作手册
Driver: 驱动
Include: C 语言头文件
Jar: jar 包(导入导出,快速加载,日志挖掘)
Log: 日志文件
Jdk: java 包
Tool: 客户端
Web: dem 类似 oracle oem
Scritpt: 脚本文件
2.4 环境变量配置
vi .bash_profile
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/dm/dmdbms/bin"
export DM_HOME="/dm/dmdbms"
export PATH=$DM_HOME/bin:$DM_HOME/tool:$PATH
#vnc通过root用户切换到dmdba时,建议配置,配置值为root用户下echo $DISPLAY查询的值
export DISPLAY=:0.0
vi .bashrc
alias disql="rlwrap disql"
alias dmrman="rlwrap dmrman"
2.5 防火墙开放端口
#默认数据库实例端口为5236
systemctl enable firewalld
systemctl start firewalld
systemctl status firewalld
firewall-cmd --zone=public --add-port=5236/tcp --permanent
firewall-cmd --reload
firewall-cmd --list-ports
3.初始化数据库
3.1 启动dbca.sh
#通过图形化工具dbca来创建数据库
[dmdba@dmserver tool]$ pwd
/dm/dmdbms/tool
[dmdba@dmserver tool]$ ./dbca.sh
3.2 查看实列进程
[dmdba@dmserver dmdbms]$ ps -ef |grep dm.ini|grep -v grep
dmdba 6098 1 0 7月13 ? 00:13:50 /home/dmdba/dmdbms/bin/dmserver path=/home/dmdba/dmdbms/data/ECARD/dm.ini -noconsole
3.3 登录访问测试
达梦数据库的实列是通过ip地址+端口来区分的
#默认使用localhost:5236连接
[dmdba@dmdba ~]$ disql sysdba/dameng123
Server[LOCALHOST:5236]:mode is normal, state is open
login used time: 7.287(ms)
disql V8
SQL>
SQL> select instance_name,status$ from v$instance;
LINEID INSTANCE_NAME STATUS$
---------- ------------- -------
1 ECARD OPEN
used time: 5.338(ms). Execute id is 2259.
SQL> select name,status$ from v$database;
行号 NAME STATUS$
---------- ----- -----------
1 ECARD 4
已用时间: 1.420(毫秒). 执行号:505.
[dmdba@dmdba ~]$ disql sysdba/dameng123@localhost:5236
Server[localhost:5236]:mode is normal, state is open
login used time: 11.053(ms)
disql V8
SQL>
[dmdba@dmdba ~]$ disql sysdba/dameng123@192.168.6.110:5236
Server[192.168.6.110:5236]:mode is normal, state is open
login used time: 5.512(ms)
disql V8
SQL>
4.数据库删除与卸载
4.1 dbca.sh删除数据库的方法
删除数据库,包括删除数据库的数据文件、日志文件、控制文件和初始化参数文件。
为了保证删除数据库成功,必须保证 dmserver 已关闭。可以使用数据库配置工具来删除数据库。
# 1.停止数据库服务
systemctl stop DmServiceECARD
systemctl status DmServiceECARD
# 2.运行dbca.sh数据库配置助手
./dbca.sh
# 3.删除数据库实例
# 4.root用户执行脚本
systemctl disable DmServiceECARD.service
rm -f /usr/lib/systemd/system/DmServiceECARD.service
4.2 uninstall.sh 卸载软件的方法
已经存在数据库,停止数据库,执行 uninstall.sh
只安装了软件,可以直接执行 uninstall.sh
脚本 uninstall.sh 在安装目录下。
# 1.执行uninstall.sh
cd /dm/dmdbms
./uninstall.sh
# 2.root用户执行脚本
/dm/dmdbms/root_uninstaller.sh
# 3.清理目录
cd /dm/dmdbms
rm -rf *
注意:命令行卸载使用 uninstall.sh -i
5.命令行方式安装软件与建库
5.1 命令行方式安装数据库软件
./DMInstall.bin -i
5.2 命令行方式创建数据库
5.2.1 使用 dminit 创建数据库
[dmdba@dmserver ~]$ which dminit
/dm/dmdbms/bin/dminit
[dmdba@dmserver ~]$ dminit help
initdb V8
db version: 0x7000c
License will expire on 2023-06-25
version: 03134283904-20220630-163817-20005
格式: ./dminit KEYWORD=value
例程: ./dminit PATH=/public/dmdb/dmData PAGE_SIZE=16
关键字 说明(默认值)
--------------------------------------------------------------------------------
INI_FILE 初始化文件dm.ini存放的路径
PATH 初始数据库存放的路径
CTL_PATH 控制文件路径
LOG_PATH 日志文件路径
EXTENT_SIZE 数据文件使用的簇大小(16),可选值:16, 32, 64,单位:页
PAGE_SIZE 数据页大小(8),可选值:4, 8, 16, 32,单位:K
LOG_SIZE 日志文件大小(256),单位为:M,范围为:256M ~ 2G
CASE_SENSITIVE 大小敏感(Y),可选值:Y/N,1/0
CHARSET/UNICODE_FLAG 字符集(0),可选值:0[GB18030],1[UTF-8],2[EUC-KR]
SEC_PRIV_MODE 权限管理模式(0),可选值:0[TRADITION],1[BMJ],2[EVAL],3[ZB]
LENGTH_IN_CHAR VARCHAR类型长度是否以字符为单位(N),可选值:Y/N,1/0
SYSDBA_PWD 设置SYSDBA密码(SYSDBA)
SYSAUDITOR_PWD 设置SYSAUDITOR密码(SYSAUDITOR)
DB_NAME 数据库名(DAMENG)
INSTANCE_NAME 实例名(DMSERVER)
PORT_NUM 监听端口号(5236)
BUFFER 系统缓存大小(100),单位M
TIME_ZONE 设置时区(+08:00)
PAGE_CHECK 页检查模式(0),可选值:0/1/2
PAGE_HASH_NAME 设置页检查HASH算法
EXTERNAL_CIPHER_NAME 设置默认加密算法
EXTERNAL_HASH_NAME 设置默认HASH算法
EXTERNAL_CRYPTO_NAME 设置根密钥加密引擎
RLOG_ENCRYPT_NAME 设置日志文件加密算法,若未设置,则不加密
USBKEY_PIN 设置USBKEY PIN
PAGE_ENC_SLICE_SIZE 设置页加密分片大小,可选值:0、512、4096,单位:Byte
ENCRYPT_NAME 设置全库加密算法
BLANK_PAD_MODE 设置空格填充模式(0),可选值:0/1
SYSTEM_MIRROR_PATH SYSTEM数据文件镜像路径
MAIN_MIRROR_PATH MAIN数据文件镜像
ROLL_MIRROR_PATH 回滚文件镜像路径
MAL_FLAG 初始化时设置dm.ini中的MAL_INI(0)
ARCH_FLAG 初始化时设置dm.ini中的ARCH_INI(0)
MPP_FLAG Mpp系统内的库初始化时设置dm.ini中的mpp_ini(0)
CONTROL 初始化配置文件(配置文件格式见系统管理员手册)
AUTO_OVERWRITE 是否覆盖所有同名文件(0) 0:不覆盖 1:部分覆盖 2:完全覆盖
USE_NEW_HASH 是否使用改进的字符类型HASH算法(1)
ELOG_PATH 指定初始化过程中生成的日志文件所在路径
AP_PORT_NUM 分布式环境下协同工作的监听端口
DFS_FLAG 初始化时设置dm.ini中的DFS_INI(0)
DFS_PATH 启用dfs时指定数据文件的缺省路径
DFS_HOST 指定连接分布式系统DFS的服务地址(localhost)
DFS_PORT 指定连接分布式系统DFS的服务端口号(3332)
DFS_COPY_NUM 指定分布式系统的副本数(3)
DFS_DB_NAME 指定分布式系统的中数据库名(默认与DB_NAME一致)
SHARE_FLAG 指定分布式系统中该数据库的共享属性(0)
REGION_MODE 指定分布式系统中该数据库的系统表空间数据文件的区块策略(0) 0:微区策略 1:宏区策略
HUGE_WITH_DELTA 是否仅支持创建事务型HUGE表(1) 1:是 0:否
RLOG_GEN_FOR_HUGE 是否生成HUGE表REDO日志(0) 1:是 0:否
PSEG_MGR_FLAG 是否仅使用管理段记录事务信息(0) 1:是 0:否
CHAR_FIX_STORAGE CHAR是否按定长存储(N),可选值:Y/N,1/0
SQL_LOG_FORBID 是否禁止打开SQL日志(N),可选值:Y/N,1/0
DPC_MODE 指定DPC集群中的实例角色(0) 0:无 1:MP 2:BP 3:SP,取值1/2/3时也可以用MP/BP/SP代替
HELP 打印帮助信息
[dmdba@dmserver ~]$
dminit path=/dm/dmdbms/data DB_NAME=ECARD instance_name=ECARD PORT_NUM=5236 CHARSET=0 SYSDBA_PWD=dameng123 SYSAUDITOR_PWD=dameng123
注意:
DBCA工具创建实例会自动注册服务
DMINIT工具不会自动创建服务,需要单独注册实列的服务
5.2.2 注册实例服务到操作系统中
5.2.2.1 使用dbca工具注册
#选择data目录下实列对应的ini文件进行注册
[dmdba@dmserver tool]$ pwd
/dm/dmdbms/tool
[dmdba@dmserver tool]$ ./dbca.sh
5.2.2.2 使用脚本注册
# 1.查看脚本
[root@dmserver ~]$ cd /dm/dmdbms/script/root/
[root@dmserver root]$ ll
总用量 48
-rwxr-xr-x 1 dmdba dinstall 29118 7月 13 10:11 dm_service_installer.sh
-rwxr-xr-x 1 dmdba dinstall 10169 7月 13 10:11 dm_service_uninstaller.sh
-rwxr-xr-x 1 dmdba dinstall 691 7月 13 10:11 root_installer.sh
# 2.执行脚本创建服务
[root@dmserver root]# ./dm_service_installer.sh -h
Usage: dm_service_installer.sh -t service_type [-p service_name_postfix] [-dm_ini dm_ini_file]
[-watcher_ini watcher_ini_file ] [-monitor_ini monitor_ini_file] [-cssm_ini cssm_ini_file]
[-dfs_ini dfs_ini_file] [-dcr_ini dcr_ini_file]
[-dss_ini dss_ini_file] [-drs_ini drs_ini_file] [-dras_ini dras_ini_file] [-dcs_ini dcs_ini_file] [-server server_info]
[-dmap_ini dmap_ini_file] [-dpc_mode SP|MP|BP] [-m open|mount] [-y dependent_service] [-auto true|false]
or dm_service_installer.sh [-s service_file_path]
or dm_service_installer.sh -h
-t 服务类型,包括dmimon,dmap,dmserver,dmwatcher,dmmonitor,dmcss,dmcssm,dmasmsvr,dmasmsvr3,dmdcs,dmdrs,dmdras,dmdss
-p 服务名后缀,对于dmimon,dmap服务类型无效
-dm_ini dm.ini文件路径
-watcher_ini dmwatcher.ini文件路径.
-monitor_ini dmmonitor.ini文件路径.
-dcr_ini dmdcr.ini文件路径.
-cssm_ini dmcssm.ini文件路径.
-dss_ini dss.ini文件路径.
-drs_ini drs.ini文件路径.
-dras_ini dras.ini文件路径.
-dcs_ini dcs.ini文件路径.
-dfs_ini dfs.ini文件路径.
-dmap_ini dmap.ini文件路径.
-dpc_mode DPC节点类型.
-server 服务器信息(IP:PORT)
-auto 设置服务是否自动启动,值为true或false,默认true.
-m 设置服务器启动模式open或mount,只针对dmserver服务类型生效,可选
-y 设置依赖服务,此选项只针对systemd服务环境下的dmserver,dmasmsvr,dmasmsvr3服务生效
-s 服务脚本路径,设置则忽略除-y外的其他参数选项
-h 帮助
[root@dmserver root]# ./dm_service_installer.sh -t dmserver -p FACE -dm_ini
/opt/dm8/data/DAMENG/dm.ini
Created symlink from /etc/systemd/system/multi-user.target.wants/DmServiceFACE.service to /usr/lib/systemd/system/DmServiceFACE.service.
创建服务(DmServiceDMSERVER)完成
# 3.启动服务
[root@mserver root]# systemctl enable DmServiceFACE
[root@mserver root]# systemctl start DmServiceFACE
[root@mserver root]# systemctl status DmServiceFACE
6.启动停止达梦实例
6.1 通过服务查看器
需要使用root用户进行操作
[root@dmserver tool]# pwd
/dm/dmdbms/tool
[root@dmserver tool]# ./dmserver.sh
6.2 通过系统服务
需要使用root用户进行操作
systemctl start DmServiceFACE
systemctl stop DmServiceFACE
systemctl status DmServiceFACE
ps -ef|grep dm.ini|grep -v grep
6.3 通过命令行前台方式
该方式为前台启动,使用dmdba用户操作,默认启动到open状态。启动后,界面输入 exit 或者按 CTRL+C ,数据库就会关闭。如果没有注册数据库服务,只能使用此方式启动。其他的启动方式都需要注册数据库服务。
[dmdba@dmserver ~]$ which dmserver
/dm/dmdbms/bin/dmserver
[dmdba@dmserver ~]$ dmserver help
格式: ./dmserver [ini_file_path] [-noconsole] [mount] [path=ini_file_path] [dcr_ini=dcr_path] [dpc_mode=mode]
例程:
./dmserver path=/opt/dmdbms/bin/dm.ini
./dmserver /opt/dmdbms/bin/dm.ini
关键字 说明
--------------------------------------------------------------------------------
path dm.ini绝对路径或者dmserver当前目录的dm.ini
dcr_ini 如果使用css集群环境,指定dmdcr.ini文件路径
-noconsole 以服务方式启动
mount 配置方式启动
dpc_mode 指定DPC中的实例角色(0),0:无、1:MP、2:BP、3:SP,取值1/2/3时也可以用MP/BP/SP代替
upd_lic 升级服务器安全版本信息
help 打印帮助信息
#启动到open状态
[dmdba@dmserver ~]$ dmserver /dm/dmdbms/data/ECARD/dm.ini
#可以加上&放在后台运行
[dmdba@dmserver ~]$ dmserver /dm/dmdbms/data/ECARD/dm.ini &
#启动到mount状态
[dmdba@dmserver ~]$ dmserver /dm/dmdbms/data/ECARD/dm.ini mount
6.3 通过命令行后台方式
使用dmdba用户操作
[dmdba@dmserver ~]$ cd /dm8/dmdbms/bin
[dmdba@dmserver bin]$ ll Dm*
-rwxr-xr-x. 1 dmdba dinstall 14123 11月 12 10:16 DmAPService
-rwxr-xr-x. 1 dmdba dinstall 14787 11月 12 10:16 DmAuditMonitorService
-rwxr-xr-x. 1 dmdba dinstall 13951 11月 12 10:16 DmInstanceMonitorService
-rwxr-xr-x. 1 dmdba dinstall 14424 11月 12 10:16 DmJobMonitorService
-rwxr-xr-x. 1 dmdba dinstall 16756 11月 12 11:39 DmServiceECARD
-rwxr-xr-x. 1 dmdba dinstall 16754 11月 12 11:45 DmServiceFACE
[dmdba@dmserver bin]$ ./DmServiceECARD start
#可以控制启动到mount状态
[dmdba@dmserver bin]$ ./DmServiceECARD start mount
[dmdba@dmserver bin]$ ./DmServiceECARD stop
[dmdba@dmserver bin]$ ./DmServiceECARD status
7.连接数据库
7.1 DM管理工具图形化连接
[dmdba@dmserver ~]$ cd $DM_HOME/tool
[dmdba@dmserver tool]$ ./manager
7.2 disql命令行连接数据库
#默认端口5236,可以省略
[dmdba@dmserver ~]$ cd $DM_HOME/bin
[dmdba@dmserver ~]$ ./disql sysdba/Newcapec.2022
[dmdba@dmserver ~]$ ./disql sysdba/Newcapec.2022@localhost:5236
#ipv6连接方式
[dmdba@dmserver ~]$ disql sysdba/Newcapec.2022@[fe80::4785:9c44:ba9a:5949%eth0]:5236
服务器[fe80::4785:9c44:ba9a:5949%eth0:5236]:处于普通打开状态
登录使用时间 : 3.668(ms)
disql V8
SQL>
8.实例状态切换
8.1 open切换到mount状态
[dmdba@dmserver ~]$ disql sysdba/Newcapec.2022
服务器[LOCALHOST:5236]:处于普通打开状态
登录使用时间 : 4.679(ms)
disql V8
SQL> select instance_name,status$ from v$instance;
行号 INSTANCE_NAME STATUS$
---------- ------------- -------
1 ECARD OPEN
已用时间: 4.274(毫秒). 执行号:500.
SQL> alter database mount;
操作已执行
已用时间: 2.089(毫秒). 执行号:0.
SQL> select instance_name,status$ from v$instance;
行号 INSTANCE_NAME STATUS$
---------- ------------- -------
1 ECARD MOUNT
已用时间: 0.797(毫秒). 执行号:501.
8.2 mount切换到open状态
SQL> select instance_name,status$ from v$instance;
行号 INSTANCE_NAME STATUS$
---------- ------------- -------
1 ECARD MOUNT
已用时间: 0.797(毫秒). 执行号:501.
SQL> alter database open;
操作已执行
已用时间: 44.584(毫秒). 执行号:0.
SQL> select instance_name,status$ from v$instance;
行号 INSTANCE_NAME STATUS$
---------- ------------- -------
1 ECARD OPEN
已用时间: 0.430(毫秒). 执行号:502.
SQL> select owner,table_name,tablespace_name from dba_tables limit 10;
行号 OWNER TABLE_NAME TABLESPACE_NAME
---------- ----- ---------- ---------------
1 SYS SYSOBJECTS SYSTEM
2 SYS SYSINDEXES SYSTEM
3 SYS SYSCOLUMNS SYSTEM
4 SYS SYSUSER$ SYSTEM
5 SYS SYSCONS SYSTEM
6 SYS SYSTEXTS SYSTEM
7 SYS SYSGRANTS SYSTEM
8 SYS SYSDUAL SYSTEM
9 SYS SYSCLASSES SYSTEM
10 SYS SYSSTATS SYSTEM
10 rows got
已用时间: 206.503(毫秒). 执行号:57800.
02.达梦DCA认证课程-达梦客户端工具使用
1.DM disql工具
1.1 连接默认的达梦实例
DISQL默认连接的是5236端口,如果实例是非5236端口,则必须指定对应的端口号。
# 使用指定用户密码连接
disql sysdba/SYSDBA
# 使用默认用户、默认密码连接
disql
1.2 使用ip地址和端口连接
disql sysdba/SYSDBA@localhost:5326
disql sysdba/SYSDBA@localhost:5327
1.3 使用service name连接
方法1:修改/etc/dm_svc.conf配置service name
# 注意:服务名不区分大小写
[root@dmserver ~]# cat /etc/dm_svc.conf
TIME_ZONE=(480)
LANGUAGE=(cn)
ECARD=(192.168.112.226:5236)
[dmdba@dmserver ~]$ disql sysdba/Newcapec#123@ECARD
服务器[192.168.112.226:5236]:处于普通打开状态
登录使用时间 : 3.001(ms)
disql V8
SQL>
方法2:通过nca.sh图形化配置service name
[dmdba@dmserver ~]$ cd /dm8/dmdbms/tool/
[dmdba@dmserver ~]$ ./nca.sh
1.4 执行脚本
执行sql:
[dmdba@dmserver ~]$ disql sysdba/Newcapec#123@ECARD
服务器[192.168.112.226:5236]:处于普通打开状态
登录使用时间 : 3.001(ms)
disql V8
SQL> create table test as select * from sysobjects;
操作已执行
已用时间: 18.480(毫秒). 执行号:800.
SQL> select count(1) from test;
行号 COUNT(1)
---------- --------------------
1 918
已用时间: 0.924(毫秒). 执行号:801.
SQL> delete from test;
影响行数 918
已用时间: 4.152(毫秒). 执行号:802.
SQL> commit;
操作已执行
已用时间: 1.413(毫秒). 执行号:803.
SQL> select count(1) from test;
行号 COUNT(1)
---------- --------------------
1 0
已用时间: 0.285(毫秒). 执行号:804.
执行脚本:
在linux系统中需要使用\`进行转义,windows平台不需要转义,如下:
[dmdba@dmserver ~]$ disql SYSDBA/SYSDBA \` /dm/dmdbms/samples/instance_script/dmhr/JOB_HISTORY.sql
在disql中有两种方法:
# 1.方法1:使用`,在工具里面执行时,不需要进行转义
SQL> `/dm/dmdbms/samples/instance_script/dmhr/JOB_HISTORY.sql
# 2.方法2:使用start
SQL> start /dm/dmdbms/samples/instance_script/dmhr/JOB_HISTORY.sql
数据库内置示例脚本:
[dmdba@dmserver dmhr]$ pwd
/home/dmdba/dmdbms/samples/instance_script/dmhr
[dmdba@dmserver dmhr]$ ll
总用量 0
drwxr-xr-x 2 dmdba dinstall 180 7月 13 10:11 GBK
drwxr-xr-x 2 dmdba dinstall 180 7月 13 10:11 UTF-8
[dmdba@dmserver dmhr]$ cd GBK/
[dmdba@dmserver GBK]$ ls
1-CREATESCHEMA.sql 2-REGION.sql 3-CITY.sql 4-LOCATION.sql 5-DEPARTMENT.sql 6-JOB.sql 7-EMPLOYEE.sql 8-JOB_HISTORY.sql
[dmdba@dmserver GBK]$ ll
总用量 280
-rwxr-xr-x 1 dmdba dinstall 109 7月 13 10:11 1-CREATESCHEMA.sql
-rwxr-xr-x 1 dmdba dinstall 687 7月 13 10:11 2-REGION.sql
-rwxr-xr-x 1 dmdba dinstall 1245 7月 13 10:11 3-CITY.sql
-rwxr-xr-x 1 dmdba dinstall 1833 7月 13 10:11 4-LOCATION.sql
-rwxr-xr-x 1 dmdba dinstall 6120 7月 13 10:11 5-DEPARTMENT.sql
-rwxr-xr-x 1 dmdba dinstall 1984 7月 13 10:11 6-JOB.sql
-rwxr-xr-x 1 dmdba dinstall 251164 7月 13 10:11 7-EMPLOYEE.sql
-rwxr-xr-x 1 dmdba dinstall 3698 7月 13 10:11 8-JOB_HISTORY.sql
1.5 执行系统命令
SQL> host
[dmdba@dmserver ~]$ ll
总用量 0
drwxr-xr-x 17 dmdba dinstall 263 7月 13 10:20 dmdbms
drwxr-xr-x. 2 dmdba dinstall 6 7月 13 09:56 公共
drwxr-xr-x. 2 dmdba dinstall 6 7月 13 09:56 模板
drwxr-xr-x. 2 dmdba dinstall 6 7月 13 09:56 视频
drwxr-xr-x. 2 dmdba dinstall 6 7月 13 09:56 图片
drwxr-xr-x. 2 dmdba dinstall 6 7月 13 09:56 文档
drwxr-xr-x. 2 dmdba dinstall 6 7月 13 09:56 下载
drwxr-xr-x. 2 dmdba dinstall 6 7月 13 09:56 音乐
drwxr-xr-x. 2 dmdba dinstall 6 7月 13 09:56 桌面
[dmdba@dmserver ~]$ exit
exit
SQL> host df -Th
文件系统 类型 容量 已用 可用 已用% 挂载点
devtmpfs devtmpfs 3.9G 0 3.9G 0% /dev
tmpfs tmpfs 3.9G 0 3.9G 0% /dev/shm
tmpfs tmpfs 3.9G 9.6M 3.9G 1% /run
tmpfs tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup
/dev/mapper/centos-root xfs 71G 12G 60G 17% /
/dev/vda1 xfs 1014M 172M 843M 17% /boot
tmpfs tmpfs 799M 44K 799M 1% /run/user/12345
/dev/sr0 iso9660 4.5G 4.5G 0 100% /run/media/dmdba/CentOS 7 x86_64
tmpfs tmpfs 799M 0 799M 0% /run/user/0
1.6 关闭数据库
SQL> shutdown immediate;
操作已执行
已用时间: 0.364(毫秒). 执行号:0.
SQL>
2.DM manager工具
2.1 打开Manager工具
DM Manager是达梦数据库自带的图形化管理工具,在安装达梦数据库之后会自动安装。
该命令在DM_HOME/tool目录下:
[dmdba@dmserver tool]$ pwd
/dm/dmdbms/tool
[dmdba@dmserver tool]$ ./manager
2.2 修改Manager工具语言显示
如果安装系统时选择的语言是英文,那么DM的工具也会默认用英文显示。
windows平台下:
DM Manger的配置文件是:DM_HOME\tool\manager.ini将参数从-Dosgi.nl=en_US 改成 -Dosgi.nl=zh_CN
linux平台下:
直接修改脚本即可,如下:
[dmdba@dmserver tool]$ pwd
/home/dmdba/dmdbms/tool
[dmdba@dmserver tool]$ cat manager
#!/bin/sh
....
INSTALL_LANGUAGE=zh_CN
2.3 启用sql助手功能
窗口->选项->查询分析器->编辑器->启用sql输入助手
窗口->选项->查询分析器->编辑器->启用sql语法检查
窗口->选项->查询分析器->编辑器->启用自定义对象提示
3.DM console工具
DM 控制台工具是一个脱机工具,提供脱机备份还原、修改数据库参数(修改后重启数据库才能生效)等功能。
[dmdba@dmserver ~]$ cd /dm8/dmdbms/tool/
[dmdba@dmserver tool]$ ./console
4.DM dts工具
DM 数据迁移工具支持其他数据库迁移到达梦,或者达梦迁移到文件等功能。
[dmdba@dmserver ~]$ cd /dm8/dmdbms/tool/
[dmdba@dmserver tool]$ ./dts
5.DM monitor工具
可以用来监视数据库的线程、事务会话、表空间占用等信息。
[dmdba@dmserver ~]$ cd /dm8/dmdbms/tool/
[dmdba@dmserver tool]$ ./monitor
03.达梦DCA认证课程-DM数据库体系结构
1.存储结构
表空间是 DM 数据库的最大存储单元,所有数据都存储在表空间中。
表空间采用段(segment)、簇(extent)和页(page,对应 block)的方式管理。
一个表空间可以包含一个或多个数据文件。一个数据文件仅能归属于一个表空间。
DM 物理文件包含:配置文件、控制文件、数据文件、联机日志(此四个文件必不可少,缺少一个将无法正常启动)。
1.1 三大文件查看
查看数据文件:
SQL> select GROUP_ID,PATH,ID,STATUS$ from v$datafile;
行号 GROUP_ID PATH ID STATUS$
---------- ----------- ---------------------------------------------------- ----------- -----------
1 0 /home/dmdba/dmdbms/data/ECARD/SYSTEM.DBF 0 1
2 1 /home/dmdba/dmdbms/data/ECARD/ROLL.DBF 0 1
3 3 /home/dmdba/dmdbms/data/ECARD/TEMP.DBF 0 1
4 4 /home/dmdba/dmdbms/data/ECARD/MAIN.DBF 0 1
5 5 /home/dmdba/dmdbms/data/ECARD/DMHR.DBF 0 1
6 6 /home/dmdba/dmdbms/data/ECARD/V8_TABLESPACE.dbf 0 1
7 7 /home/dmdba/dmdbms/data/ECARD/OPENPLARTFORM_DATA.dbf 0 1
8 8 /home/dmdba/dmdbms/data/ECARD/CHANNEL_DATA_01.dbf 0 1
9 8 /home/dmdba/dmdbms/data/ECARD/CHANNEL_DATA_02.dbf 1 1
10 8 /home/dmdba/dmdbms/data/ECARD/CHANNEL_DATA_03.dbf 2 1
11 8 /home/dmdba/dmdbms/data/ECARD/CHANNEL_DATA_04.dbf 3 1
行号 GROUP_ID PATH ID STATUS$
---------- ----------- ------------------------------------------------- ----------- -----------
12 8 /home/dmdba/dmdbms/data/ECARD/CHANNEL_DATA_05.dbf 4 1
12 rows got
查看重做日志文件:
SQL> select path from v$rlogfile;
行号 PATH
---------- -----------------------------------------
1 /home/dmdba/dmdbms/data/ECARD/ECARD01.log
2 /home/dmdba/dmdbms/data/ECARD/ECARD02.log
3 /home/dmdba/dmdbms/data/ECARD/ECARD03.log
已用时间: 0.730(毫秒). 执行号:1308.
SQL> select path,rlog_size/1024/1024 from v$rlogfile;
行号 PATH RLOG_SIZE/1024/1024
---------- ----------------------------------------- --------------------
1 /home/dmdba/dmdbms/data/ECARD/ECARD01.log 256
2 /home/dmdba/dmdbms/data/ECARD/ECARD02.log 256
3 /home/dmdba/dmdbms/data/ECARD/ECARD03.log 256
已用时间: 0.989(毫秒). 执行号:1309.
查看控制文件:
SQL> select para_name,para_value from v$dm_ini where para_name= 'CTL_PATH';
行号 PARA_NAME PARA_VALUE
---------- --------- ------------------------------------
1 CTL_PATH /home/dmdba/dmdbms/data/ECARD/dm.ctl
已用时间: 10.951(毫秒). 执行号:1313.
SQL> select para_name,para_value from v$dm_ini where para_name='CTL_BAK_PATH';
行号 PARA_NAME PARA_VALUE
---------- ------------ -------------------------------------
1 CTL_BAK_PATH /home/dmdba/dmdbms/data/ECARD/ctl_bak
已用时间: 4.678(毫秒). 执行号:1314.
SQL> select para_name,para_value from v$dm_ini where para_name='CTL_BAK_NUM';
行号 PARA_NAME PARA_VALUE
---------- ----------- ----------
1 CTL_BAK_NUM 10
已用时间: 6.657(毫秒). 执行号:1315.
SQL> select para_name,para_value from v$dm_ini where para_name in ('CTL_PATH','CTL_BAK_PATH','CTL_BAK_NUM');
1.2 表空间管理
1.2.1 表空间介绍
DM 默认预定义 SYSTEM、ROLL、MAIN、TEMP、HMAIN 五个表空间。
SYSTEM
系统表空间,存放数据字典等信息(表、字段、视图等对象的定义、用户角色权限信息等,部分隐含参数写入 SYSTEM 表空间),SYSTEM 表空间自动扩展不允许关闭。
ROLL
回滚表空间,存放回滚页,数据库中的 DML 操作对应都会生成 redo 和 undo,undo 信息放入 ROLL 表空间对应的数据文件中,redo 信息写入联机日志文件,用于保证数据的一致性。
ROLL 回滚段数据包含 Active、unexpired、expired 三种状态。遇到查询记录过旧的错误(等同于 oracle 的快照过旧的错误)。
解决方法:
1.增大 undo_retention(回滚段的保留时长), 及时、分段提交。扩大 ROLL 表空间。
2.查询时间过长导致,可以考虑优化查询
SQL> select NAME,TYPE,VALUE,SYS_VALUE,FILE_VALUE,DESCRIPTION from v$parameter where name='UNDO_RETENTION';
行号 NAME TYPE VALUE SYS_VALUE FILE_VALUE
---------- -------------- ---- ---------- ---------- ----------
DESCRIPTION
----------------------------------------------------------------------------------------
1 UNDO_RETENTION SYS 180.000000 180.000000 90.000000
Maximum retention time in seconds for undo pages since relative transaction is committed
MAIN
用户默认表空间,当创建用户时,如果为指定用户的默认表空间,则 MAIN 为用户的默认表空间。相当于 Oracle 的 USERS 表空间。
临时表空间
临时表空间,存放临时表数据、临时结果集等,当大量的数据排序或创建索引等占用临时表空间。DM 中临时表空间大小由参数 TEMP_SIZE 指定,不支持单独创建临时表空间。
达梦 TEMP 表空间,数据库启动时会按照如下参数重建 TEMP 表空间。
SQL> select name, value, type from v$parameter t where name like 'TEMP%';
行号 NAME VALUE TYPE
---------- ---------------- ---------------------- ---------
1 TEMP_PATH /dm8/dmdbms/data/ECARD READ ONLY
2 TEMP_SIZE 10 IN FILE
3 TEMP_SPACE_LIMIT 0 SYS
相关参数说明:
TEMP_SIZE:临时表空间初始大小
TEMP_PATH:临时表空间路径
TEMP_SPACE_LIMIT:临时表空间的空间限制,0 表示不限制。
收缩 TEMP 表空间的方法:
1.重启数据库,TEMP 表空间数据文件会重建。
2.在线收缩临时表空间使用 SP_TRUNC_TS_FILE 函数
SQL> select id,name from v$ifun where name='SP_TRUNC_TS_FILE';
行号 ID NAME
---------- ----------- ----------------
1 1298 SP_TRUNC_TS_FILE
SQL> select * from v$ifun_arg where id=1298;
行号 ID NAME SEQ DATA_TYPE LEN PREC IO_TYPE COMMENT$
---------- ----------- ------- ----------- ---------------- ----------- ----------- ------- --------
1 1298 RVAL -1 UNKNOWN DATATYPE 0 0 RETURN NULL
2 1298 TS_ID 0 INTEGER 4 0 IN NULL
3 1298 FILE_ID 1 INTEGER 4 0 IN NULL
4 1298 TO_SIZE 2 INTEGER 4 0 IN NULL
调大temp表空间的方法:
--可以直接修改temp文件的大小,但重启后会重建为temp_size指定的大小
alter tablespace temp resize datafile 'TEMP.DBF' to 50;
--永久修改大小方法
alter system set 'TEMP_SIZE' =50 spfile;
HMAIN
HUGE 表的默认表空间(HTS 表空间)
1.2.1 创建表空间
创建名为tbs1的表空间,并指定该空间上拥有 2个数据文件,每个数据文件的大小为50M ,设置自动扩展
-- 达梦表空间数据文件单位默认为M,不需要带单位,路径可以省略,使用system_path的路径
create tablespace tbs1 datafile '/home/dmdba/dmdbms/data/ECARD/TBS101.DBF' size 50 autoextend on next 10 maxsize 10240,'/home/dmdba/dmdbms/data/ECARD/TBS102.DBF' size 50 autoextend on next 10 maxsize 10240;
1.2.2 修改表空间名
DM 预定义表空间不支持重命名,自定义表空间支持重命名。
alter tablespace tbs1 rename to tbs1_new;
1.2.3 修改表空间状态
用户表空间有联机和脱机两种状态。系统表空间、回滚表空间、重做日志表空间和临时文件表空间不允许脱机。
设置表空间状态为脱机状态时,如果该表空间有未提交的事务,则脱机失败报错。 脱机后可对表
空间的数据进行备份.
alter tablespace tbs1 offline;
alter tablespace tbs1 online;
1.2.4 修改表空间数据缓冲区
用户表空间可以切换使用的数据缓冲区,系统表空间、回滚表空间、重做日志表空间和临时文件表空间不允许修改数据缓冲区。可以使用的数据缓冲区有 NORMAL 和 KEEP。表空间修改成功后,并不会立即生效,而是需要服务器重启。缓冲池名 KEEP 是达梦的保留关键字,使用时必须加双引号。
SQL> alter tablespace tbs1_new cache="KEEP";
SQL> select name,cache from v$tablespace;
SQL> alter tablespace tbs1_new cache="NORMAL";
1.2.5 删除表空间
只可以删除用户创建的表空间并且只能删除未使用过的表空间,删除表空间时会删除其拥有的所有数据文件。
drop tablespace tbs1;
1.2.6 管理数据文件
1.添加数据文件
--可以使用相对路径
alter tablespace tbs1 add datafile 'TBS103.DBF' size 50;
2.设置数据文件自动扩展
alter tablespace tbs1 datafile 'TBS103.DBF' autoextend on next 2 maxsize 20480;
alter tablespace tbs1 datafile 'TBS101.DBF' autoextend off;
3.修改数据文件大小
--dm老版本不支持将数据文件改小,2022年9月份以后的版本支持
alter tablespace tbs1 resize datafile 'TBS103.DBF' TO 100;
4.迁移自定义表空间数据文件
alter tablespace tbs offline;
--Oracle19c之前,需要手动拷贝数据文件,然后再进行rename
alter tablespace tbs rename datafile 'TBS01.DBF' TO '/dm8/data/DM/TBS/TBS01.DBF';
alter tablespace tbs rename datafile 'TBS02.DBF' TO '/dm8/data/DM/TBS/TBS02.DBF';
alter tablespace tbs online;
1.2.7 表空间相关查询
相关数据字典:
select * from dba_tablespaces;
select * from DBA_DATA_FILES;
select * from v$tablespace;
select * from v$datafile;
--查询数据文件剩余空间
select * from DBA_FREE_SPACE;
表空间和数据文件对应关系查询:
SQL> SELECT df.GROUP_ID,ts.NAME, df.PATH FROM V$TABLESPACE AS ts, V$DATAFILE AS df WHERE ts.ID= df.GROUP_ID;
行号 GROUP_ID NAME PATH
---------- ----------- ------ ---------------------------------
1 0 SYSTEM /dm8/dmdbms/data/ECARD/SYSTEM.DBF
2 7 TEST /dm8/dmdbms/data/ECARD/TEST02.DBF
3 7 TEST /dm8/dmdbms/data/ECARD/TEST01.DBF
4 5 DMHR /dm8/dmdbms/data/ECARD/DMHR.DBF
5 4 MAIN /dm8/dmdbms/data/ECARD/MAIN.DBF
6 3 TEMP /dm8/dmdbms/data/ECARD/TEMP.DBF
7 1 ROLL /dm8/dmdbms/data/ECARD/ROLL.DBF
7 rows got
-- file_id是针对某个表空间内部排序的
SQL> select TABLESPACE_NAME,FILE_ID,FILE_NAME from dba_data_files order by 1,2;
行号 TABLESPACE_NAME FILE_ID FILE_NAME
---------- --------------- ----------- ---------------------------------
1 DMHR 0 /dm8/dmdbms/data/ECARD/DMHR.DBF
2 MAIN 0 /dm8/dmdbms/data/ECARD/MAIN.DBF
3 ROLL 0 /dm8/dmdbms/data/ECARD/ROLL.DBF
4 SYSTEM 0 /dm8/dmdbms/data/ECARD/SYSTEM.DBF
5 TEMP 0 /dm8/dmdbms/data/ECARD/TEMP.DBF
6 TEST 0 /dm8/dmdbms/data/ECARD/TEST01.DBF
7 TEST 1 /dm8/dmdbms/data/ECARD/TEST02.DBF
7 rows got
1.3 重做日志文件管理
重做日志包含联机日志和归档日志(数据库在归档模式下才会产生归档日志文件)。
联机重做日志:存放 redo 信息,循环使用,不断覆盖,默认重做日志大小256M。联机日志 v$rlog 中记录有日志序列号(LSN: Log Sequence Number)。
DM 数据库联机日志自动切换,不能手工切换,无法删除重做日志。DM 联机日志没有日志组。
1.3.1 调整重做日志大小
--建议所有日志大小一样
alter database resize logifle 'DAMENG01.log' to 500;
alter database resize logifle 'DAMENG02.log' to 500;
1.3.2 添加重做日志
alter database add logfile 'DAMENG03.log' SIZE 500;
1.3.3 修改重做日志路径
alter database mount;
alter database RENAME LOGFILE 'DM01.log' TO '/dm8/data/DM/REDO/DM01.log';
alter database RENAME LOGFILE 'DM02.log' TO '/dm8/data/DM/REDO/DM02.log';
alter database RENAME LOGFILE 'DM03.log' TO '/dm8/data/DM/REDO/DM03.log';
alter database open;
1.3.4 重做日志相关查询
相关视图:
select * from v$rlogfile;
--cur_file表示正在使用的联机日志
select * from v$rlog;
查询redo日志相关信息:
--查询redo log日志信息
SQL> select group_id,file_id,path,rlog_size/1024/1024 M from v$rlogfile;
行号 GROUP_ID FILE_ID PATH M
---------- ----------- ----------- ---------------------------------- --------------------
1 2 0 /dm8/dmdbms/data/ECARD/ECARD01.log 256
2 2 1 /dm8/dmdbms/data/ECARD/ECARD02.log 256
2.数据库参数
2.1 参数分类
手动,静态和动态三种类型。分别对应 v$parameter 视图中 type 的 read only,in file,sys 和 session.
**手动参数(read only):**不能通过 SQL 命令或函数修改,只能通过修改 dm.ini 文本文件修改此参数(需要重启数据库才能生效)。
**静态参数(IN FILE) :**不能修改内存中的值,只能修改参数文件中的值,可以通过 SQL 命令或函数修改,但需要重启数据库才能生效。
动态参数(SYS 和SESSION ):ini 文件和内存可同时修改, 修改后即时生效。其中,SYS为动态系统级参数,修改后会影响所有的会话;SESSION 为动态会话级参数,修改后只针对当前会话生效。
-- v$parameter和v$dm_ini均可以查询dm数据库的参数
SQL> desc v$parameter;
行号 NAME TYPE$ NULLABLE
---------- ------------- ------------- --------
1 ID INTEGER Y
2 NAME VARCHAR(80) Y
3 TYPE VARCHAR(200) Y
4 VALUE VARCHAR(4000) Y
5 SYS_VALUE VARCHAR(4000) Y
6 FILE_VALUE VARCHAR(4000) Y
7 DESCRIPTION VARCHAR(255) Y
8 DEFAULT_VALUE VARCHAR(256) Y
9 ISDEFAULT INTEGER Y
9 rows got
已用时间: 2.155(毫秒). 执行号:1605
SQL> desc v$dm_ini;
行号 NAME TYPE$ NULLABLE
---------- ------------- ------------ --------
1 PARA_NAME VARCHAR(128) Y
2 PARA_VALUE VARCHAR(256) Y
3 MIN_VALUE VARCHAR(256) Y
4 MAX_VALUE VARCHAR(256) Y
5 DEFAULT_VALUE VARCHAR(256) Y
6 MPP_CHK CHAR(1) Y
7 SESS_VALUE VARCHAR(256) Y
8 FILE_VALUE VARCHAR(256) Y
9 DESCRIPTION VARCHAR(256) Y
10 PARA_TYPE VARCHAR(200) Y
10 rows got
已用时间: 10.981(毫秒). 执行号:1604.
--查询参数类型
SQL> select distinct type from v$parameter;
行号 TYPE
---------- ---------
1 READ ONLY
2 SYS
3 IN FILE
4 SESSION
2.2 查看数据库参数
2.2.1 通过dm.ini文件查看
达梦的ini参数文件在实例路径中,文件名为dm_ini,可以直接查看该文件,获取具体ini的参数信息。
[dmdba@dmserver ECARD]$ pwd
/home/dmdba/dmdbms/data/ECARD
[dmdba@dmserver ECARD]$ head dm.ini
#DaMeng Database Server Configuration file
#this is comments
#file location of dm.ctl
CTL_PATH = /home/dmdba/dmdbms/data/ECARD/dm.ctl #ctl file path
CTL_BAK_PATH = /home/dmdba/dmdbms/data/ECARD/ctl_bak #dm.ctl backup path
CTL_BAK_NUM = 10 #backup number of dm.ctl, allowed to keep one more backup file besides specified number.
SYSTEM_PATH = /home/dmdba/dmdbms/data/ECARD #system path
CONFIG_PATH = /home/dmdba/dmdbms/data/ECARD #config path
TEMP_PATH = /home/dmdba/dmdbms/data/ECARD #temporary file path
2.2.2 通过参数动态视图查看
相关视图有V$PARAMETER和V$DM_INI。 同时系统视图查看参数对比查看dm.ini文件的优点是,如果要重新配置参数,可以知道参数配置的值的范围、参数类型,及其配置生效的条件和范围等。视图有V$PARAMETER和V$DM_INI,内容比dm.ini文件多一些。
通过v$parameter查看:
SQL> select name,type,value from v$parameter limit 5;
行号 NAME TYPE VALUE
---------- ------------ --------- -------------------------------------
1 CTL_PATH READ ONLY /home/dmdba/dmdbms/data/ECARD/dm.ctl
2 CTL_BAK_PATH READ ONLY /home/dmdba/dmdbms/data/ECARD/ctl_bak
3 CTL_BAK_NUM SYS 10
4 SYSTEM_PATH READ ONLY /home/dmdba/dmdbms/data/ECARD
5 CONFIG_PATH READ ONLY /home/dmdba/dmdbms/data/ECARD
通过v$dm_ini查看:
SQL> select PARA_NAME,PARA_VALUE from v$dm_ini limit 5;
行号 PARA_NAME PARA_VALUE
---------- ------------ -------------------------------------
1 CTL_PATH /home/dmdba/dmdbms/data/ECARD/dm.ctl
2 CTL_BAK_PATH /home/dmdba/dmdbms/data/ECARD/ctl_bak
3 CTL_BAK_NUM 10
4 SYSTEM_PATH /home/dmdba/dmdbms/data/ECARD
5 CONFIG_PATH /home/dmdba/dmdbms/data/ECARD
2.2.3 通过系统函数查看
在DM达梦数据库中,有3个系统函数可以查看参数配置情况。
分别是SF_GET_PARA_VALUE、SF_GET_PARA_DOUBLE_VALUE和SF_GET_PARA_STRING_VALUE三个函数,分别对应参数值为数值类型、浮点类型、字符串类型的参数时使用。
语法格式:
-- 其中,SCOPE参数为1表示获取INI文件中配置参数的值,为2表示获取内存中配置参数的值
SF_GET_PARA_VALUE(scope int, paraname varchar(256))
SF_GET_PARA_DOUBLE_VALUE(scope int, paraname varchar(8187))
SF_GET_PARA_STRING_VALUE(scope int, paraname varchar(8187))
使用示例:
--查看数据库实例最大连接数,在文件和内存中的配置
SQL> SELECT SF_GET_PARA_VALUE(1, 'MAX_SESSIONS');
行号 SF_GET_PARA_VALUE(1,'MAX_SESSIONS')
---------- -----------------------------------
1 1500
已用时间: 4.974(毫秒). 执行号:1405.
SQL> SELECT SF_GET_PARA_VALUE(2, 'MAX_SESSIONS');
行号 SF_GET_PARA_VALUE(2,'MAX_SESSIONS')
---------- -----------------------------------
1 1500
已用时间: 0.770(毫秒). 执行号:1406.
2.3 修改数据库参数
查看数据库参数之后,通常需要根据应用系统和业务及数据库运行情况对参数进行修改。DM达梦数据库修改参数的方法一般有四种。
2.3.1 通过console 控制台工具修改
图形化界面方式修改,不管修改什么类型参数都需要重启数据库才能生效
2.3.1. 通过编辑dm.ini文件修改
通常在linux系统里,使用VI工具对dm.ini文件进行参数修改,然后对数据库进行重启,使得参数值生效。
2.3.2 通过alter语句修改
1.alter system
语法:
alter system set '<参数名称>'=<参数值> [DEFERRED] [MEMORY|BOTH|SPFILE];
参数说明:
DEFERRED: 只适用于动态参数,指定 DEFERRED,参数值延迟生效,对当前 session 不生效,只对新创建的会话生效;缺省为立即生效,对当前会话和新创建的会话都生效。
MEMORY: 只对内存中的值做修改即时生效;
SPFILE: 只对 INI 文件中的值做修改;
BOTH: 内存和 INI 文件都做修改。默认情况下,为MEMORY。对于静态参数,只能指定SPFILE。
使用示例:
1)修改COMPATIBLE_MODE参数
# 查询服务器兼容模式设置,value当前会话,sys_value系统,file_value参数文件
SQL> select name,type,value,sys_value,file_value from v$parameter where name='COMPATIBLE_MODE';
行号 NAME TYPE VALUE SYS_VALUE FILE_VALUE
---------- --------------- ------- ----- --------- ----------
1 COMPATIBLE_MODE IN FILE 0 0 0
已用时间: 11.199(毫秒). 执行号:1702.
# 修改静态参数COMPATIBLE_MODE为2,兼容oracle
SQL> alter system set 'COMPATIBLE_MODE'=2 spfile;
DMSQL 过程已成功完成
已用时间: 11.896(毫秒). 执行号:1704.
SQL> select name,type,value,sys_value,file_value from v$parameter where name='COMPATIBLE_MODE';
行号 NAME TYPE VALUE SYS_VALUE FILE_VALUE
---------- --------------- ------- ----- --------- ----------
1 COMPATIBLE_MODE IN FILE 0 0 2
2)修改UNDO_RETENTION参数
# 系统级动态参数
SQL> select name,type,value,sys_value,file_value from v$parameter where name='UNDO_RETENTION';
行号 NAME TYPE VALUE SYS_VALUE FILE_VALUE
---------- -------------- ---- --------- --------- ----------
1 UNDO_RETENTION SYS 90.000000 90.000000 90.000000
SQL> select name,type,value,sys_value,file_value from v$parameter where name='UNDO_RETENTION';
行号 NAME TYPE VALUE SYS_VALUE FILE_VALUE
---------- -------------- ---- ---------- ---------- ----------
1 UNDO_RETENTION SYS 180.000000 180.000000 90.000000
3)修改buffer
SQL> select name,type,value,sys_value,file_value from v$parameter where name='BUFFER';
行号 NAME TYPE VALUE SYS_VALUE FILE_VALUE
---------- ------ ------- ----- --------- ----------
1 BUFFER IN FILE 1000 1000 1000
已用时间: 10.933(毫秒). 执行号:1800.
SQL> alter system set 'BUFFER'=2000 spfile;
2.alter session
语法:
alter session set '<参数名称>'=<参数值> [purge];
参数说明:
PURGE:指是否清理执行计划。设置后的值只对当前会话有效。当包含 PURGE 选项时会清除服务器保存的所有执行计划。
使用示例:
SQL> select name,type,value,sys_value,file_value from v$parameter where name='LIST_TABLE';
行号 NAME TYPE VALUE SYS_VALUE FILE_VALUE
---------- ---------- ------- ----- --------- ----------
1 LIST_TABLE SESSION 0 0 0
已用时间: 7.494(毫秒). 执行号:1710.
SQL> alter session set 'LIST_TABLE'=1;
DMSQL 过程已成功完成
已用时间: 1.013(毫秒). 执行号:1711.
SQL> select name,type,value,sys_value,file_value from v$parameter where name='LIST_TABLE';
行号 NAME TYPE VALUE SYS_VALUE FILE_VALUE
---------- ---------- ------- ----- --------- ----------
1 LIST_TABLE SESSION 1 0 0
已用时间: 5.848(毫秒). 执行号:1712.
2.3.3 通过系统函数修改
通常使用较多的有以下5个,分别是:
SP_SET_PARA_VALUE、SP_SET_PARA_DOUBLE_VALUE、SP_SET_PARA_STRING_VALUE;
和 SF_SET_SESSION_PARA_VALUE、SF_SET_SYSTEM_PARA_VALUE;
SQL> select name,id from v$ifun t where t.name like 'SP_SET_PARA%';
行号 NAME ID
---------- ------------------------ -----------
1 SP_SET_PARA_DOUBLE_VALUE 2902
2 SP_SET_PARA_DOUBLE_VALUE 586
3 SP_SET_PARA_STRING_VALUE 2901
4 SP_SET_PARA_STRING_VALUE 585
5 SP_SET_PARA_VALUE 2900
6 SP_SET_PARA_VALUE 584
SQL> select * from v$ifun_arg where id=586;
行号 ID NAME SEQ DATA_TYPE LEN PREC IO_TYPE COMMENT$
---------- ----------- -------- ----------- ---------------- ----------- ----------- ------- --------
1 586 RVAL -1 UNKNOWN DATATYPE 0 0 RETURN NULL
2 586 SCOPE 0 INTEGER 4 0 IN NULL
3 586 PARANAME 1 VARCHAR 256 0 IN NULL
4 586 VALUE 2 DOUBLE 8 0 IN NULL
1.SP_SET_PARA_VALUE 函数:
作用:
设置 dm.ini 文件中非浮点和字符串类型的参数值
语法:
SP_SET_PARA_VALUE (scope int, ini_param_name varchar(256) ,value bigint)
参数说明:
SCOPE:修改范围(0:memory;1:both;2:spfile)
2.SP_SET_PARA_DOUBLE_VALUE 函数
作用:
设置 dm.ini 参数中浮点型的参数值
语法:
SP_SET_PARA_DOUBLE_VALUE (scope int, ini_param_name varchar(256),value double
3.SP_SET_PARA_STRING_VALUE 函数
作用:
设置 dm.ini 文件中的字符串型参数值
语法:
SP_SET_PARA_STRING_VALUE (scope int, ini_param_name varchar(256) ,value varchar(8187))
4.SF_SET_SESSION_PARA_VALUE 函数
作用:
设置会话级INI参数的值
语法:
SF_SET_SESSION_PARA_VALUE (paraname varchar(8187),value bigint)
参数说明:
paraname: 会话级 INI 参数的参数名
5.SF_SET_SYSTEM_PARA_VALUE 函数
作用:
修改系统整型、double、varchar的静态配置参数或动态配置参数。
语法:
SF_SET_SYSTEM_PARA_VALUE (paraname varchar(256), value bigint/double/varchar(256),deferred int, scope int)
参数说明:
paraname:ini 参数的参数名。
value:要设置的新值。
deferred:是否立即生效。为 0 表示当前 session 修改的参数立即生效,为 1 表示当前
session 不生效,后续再生效,默认为 0。
scope:取值为 0、1、2 。0 表示修改内存中的参数值,1 表示修改内存和 INI 文件中参数值,0 和 1 都只能修改动态的配置参数。2 表示修改 INI 文件中参数,此时可用来修改静态配置参数和动态配置参数
使用示例:
SQL> SP_SET_PARA_VALUE (2, 'MAX_SESSIONS', 200)
SQL> SELECT SF_GET_PARA_VALUE(1, 'MAX_SESSIONS');
SQL> SELECT SF_GET_PARA_VALUE(2, 'MAX_SESSIONS');
3.内存结构
3.1 数据缓冲区
用于缓存数据文件中的数据页。BUFFER 是从磁盘读出的数据页在内存中的镜像,包含四个类型,分别是normal、fast、recycle、keep,由 INI 配置中的 BUFFER、FAST_POOL_PAGES、RECYCLE、KEEP 等确定大小,不同类型的缓冲区主要表现为淘汰机制不同。
数据缓冲区的大小影响数据库的读写性能,OLTP 数据缓冲区占内存 40-60%,OLAP 可以稍大;系统应尽量减少物理读,提高逻辑读。
--查询数据缓冲区,四种类型的空间配置,如果安装时勾选自动优化,会调整数据缓冲区配置
SQL> select name,type,value,sys_value,file_value,description from v$parameter where name in ('BUFFER','FAST_POOL_PAGES','RECYCLE','KEEP');
行号 NAME TYPE VALUE SYS_VALUE FILE_VALUE DESCRIPTION
---------- --------------- ------- ----- --------- ---------- ---------------------------
1 BUFFER IN FILE 1000 1000 2000 Initial System Buffer Size In Megabytes
2 FAST_POOL_PAGES IN FILE 3000 3000 3000 Fast Pool Pages
3 KEEP IN FILE 8 8 8 Initial System KEEP Buffer Size In Megabytes
4 RECYCLE IN FILE 300 300 300 Initial System KEEP Buffer Size In Megabytes
已用时间: 9.918(毫秒). 执行号:1901.
--查看数据缓冲区信息
SQL> select * from v$bufferpool
3.2 重做日志缓冲区
重做日志是数据库与磁盘间的一层缓存,将随机的磁盘写转换成顺序写,日志缓冲区是数据库和日志间的缓存,对应 INI 参数 RLOG_BUF_SIZE。
SQL> select name,type,value,sys_value,file_value,description from v$parameter where name in ('RLOG_BUF_SIZE');
行号 NAME TYPE VALUE SYS_VALUE FILE_VALUE DESCRIPTION
---------- ------------- ------- ----- --------- ---------- -----------------------------
1 RLOG_BUF_SIZE IN FILE 1024 1024 1024 The Number Of Log Pages In One Log Buffer
已用时间: 9.359(毫秒). 执行号:1903.
--查询页大小
SQL> select page;
行号 PAGE
---------- -----------
1 8192
已用时间: 0.681(毫秒). 执行号:1904.
3.3 SQL缓冲区
SQL CACHE POOL,简称 SCP,对应 INI 参数 CACHE_POOL_SIZE,是用来存储包信息(PACKAGE)、执行计划、结果集缓存的一片专用缓存区域,对于 SQL 类别比较多,或者 PKG比较多、复杂的系统,建议将该参数调大。
SQL> select name,type,value,sys_value,file_value,description from v$parameter where name in ('CACHE_POOL_SIZE');
行号 NAME TYPE VALUE SYS_VALUE FILE_VALUE DESCRIPTION
---------- --------------- ------- ----- --------- ---------- ----------------------------
1 CACHE_POOL_SIZE IN FILE 100 100 100 SQL buffer size in megabytes
已用时间: 13.914(毫秒). 执行号:1905.
参数为 USE_PLN_POOL,是否启动计划重用;为 0 时禁止计划重用,1 表示启动,默认为 1。RS_CAN_CACHE,是否启动结果集缓存,默认为 0,不启用。
SQL> select name,type,value,sys_value,file_value,description from v$parameter where name in ('USE_PLN_POOL','RS_CAN_CACHE');
行号 NAME TYPE VALUE SYS_VALUE FILE_VALUE
---------- ------------ ------- ----- --------- ----------
DESCRIPTION
------------------------------------------------------------------------------------------------------------
1 USE_PLN_POOL IN FILE 1 1 1
Query Plan Reuse Mode, 0: Forbidden; 1:strictly reuse, 2:parsing reuse, 3:mixed parsing reuse
2 RS_CAN_CACHE IN FILE 0 0 0
Resultset cache mode. 0: Forbidden; 1: Allowed only if the USE_PLN_POOL is non-zero; 2: Allowed only be set
已用时间: 7.582(毫秒). 执行号:1906.
相关视图:
select * from v$cacheitem;
select * from v$cachesql;
select * from v$cachepln;
select * from v$cachers
3.4 字典缓冲区
字典缓冲区是存在数据库对象的一片缓冲区,对应 INI 参数 DICT_BUF_SIZE,DM8 里面数据对象其实对应的是系统表上的一些信息,内存中的数据对象是通过将系统表上的信息取出并解析出来得到的,该缓冲区一是避免了频繁向磁盘请求获取系统表信息,二是可以减少系统表信息解析开销。
SQL> select name,type,value,sys_value,file_value,description from v$parameter where name='DICT_BUF_SIZE';
行号 NAME TYPE VALUE SYS_VALUE FILE_VALUE DESCRIPTION
---------- ------------- ------- ----- --------- ---------- ----------------
1 DICT_BUF_SIZE IN FILE 50 50 50 dict buffer size
已用时间: 11.512(毫秒). 执行号:1909.
相关视图:
select * from v$dynamic_tables t where T.NAME like '%DICT%';
select * from V$DICT_CACHE_ITEM;
select * from V$DICT_CACHE;
3.5 主内存池
当其他内存池(比如运行时内存池:虚拟内存池 vm pool 和会话池 session pool 等)不够时,会先向主内存池申请空间。
服务器启动时从操作系统申请的一大片内存,后续服务器运行过程中,一般情况下,很多需要内存分配的地方都是从该池分配,如果需要的内存大于配置值(MEMORY_POOL),共享内存池也可进行自动扩展,INI 参数 MEMORY_EXTENT_SIZE 指定了共享内存池每次扩展的大小,参数 MEMORY_TARGET 则指定了共享内存池能扩展到的最大大小。
相关查询:
select * from V$mem_pool;
select name, type, value, sys_value, file_value from v$parameter t where name like 'MEMORY%';
参数说明:
MEMORY_POOL:初始大小
MEMORY_EXTENT_SIZE:扩展大小
MEMORY_TARGET:目标大小
MEMORY_N_POOL:共享内存池个数,默认为 1,高并发时可设置多个。
MAX_OS_MEMORY:内存占用操作系统内存的比例,默认 100,建议调整到 80-90%。
3.6 运行时内存
特点:
使用时申请,用完即释放。包含:虚拟内存池 vm pool、会话池 session pool、排序区、HASH 区等。HASH 区和排序区都属于虚拟缓冲区 ,实际申请时使用虚拟内存池或会话内存池。
**排序区:**SORT_BUF_SIZE
少量的数据排序,优先在内存中排序,此时占用排序区;
大量的数据排序,内存中放不下,占用临时表空间排序。
如果业务经常有排序,可以适当调大排序区,提高效率。
select name, type, value, sys_value, file_value from v$parameter t where name like 'SORT%';
**HASH 区:**HJ_BUF_SIZE
HASH 连接、HASH 分区占用哈希区。如果业务 hash 连接较多,可以调大哈希区。
select name, type, value, sys_value, file_value from v$parameter t where name
like 'HJ%';
4.数据库进程
达梦为单进程多线程架构,Oracle 是多进程架构。DM 进程中主要包括监听线程、IO 线程、工作线程、调度线程、日志线程等,可以通过 DM 的动态性能视图查看线程的相关信息。
4.1 相关视图
主要相关的线程视图有如下 4 个:
V$LATCHES :记录当前正在等待的线程信息。
V$THREADS :记录当前系统中活动线程的信息,以及描述信息。
V$WTHRD_HISTORY :记录自系统启动以来,所有活动过线程的相关历史信息。
V$PROCESS :记录服务器进程信息
使用示例:
SQL> select * from v$process;
行号 PID PNAME TRACE_NAME TYPE$
---------- ----------- -------- ---------- -----------
1 20921 dmserver 1
已用时间: 3.474(毫秒). 执行号:1500.
SQL> select distinct name,count(1) from v$threads group by name order by 2 desc;
行号 NAME COUNT(1)
---------- -------------- --------------------
1 dm_lpq_thd 10
2 dm_purge_thd 10
3 dm_wrkgrp_thd 8
4 dm_io_thd 8
5 dm_tskwrk_thd 4
6 dm_hio_thd 4
7 dm_sql_thd 3
8 dm_sqllog_thd 2
9 dm_sql_aux_thd 1
10 dm_sched_thd 1
11 dm_redolog_thd 1
行号 NAME COUNT(1)
---------- ------------- --------------------
12 dm_chkpnt_thd 1
13 dm_trctsk_thd 1
14 dm_quit_thd 1
15 dm_lsnr_thd 1
16 dm_audit_thd 1
16 rows got
已用时间: 4.437(毫秒). 执行号:1501.
4.2 查看数据库进程
查看数据库进程:
[root@dmserver ~]# ps -ef|grep dmserver
dmdba 2761 1 0 11月12 ? 00:02:28 /dm8/dmdbms/bin/dmserver path=/dm8/dmdbms/data/FACE/dm.ini -noconsole
查看数据库线程:
[root@dmserver ~]# ps -T -p 2761
PID SPID TTY TIME CMD
2761 2761 ? 00:00:00 dmserver
2761 2764 ? 00:00:01 dm_sqllog_thd
2761 2766 ? 00:00:00 dm_quit_thd
2761 2767 ? 00:00:00 dm_io_thd
2761 2768 ? 00:00:00 dm_io_thd
2761 2769 ? 00:00:00 dm_io_thd
2761 2770 ? 00:00:00 dm_io_thd
2761 2771 ? 00:00:00 dm_io_thd
2761 2772 ? 00:00:00 dm_io_thd
2761 2773 ? 00:00:00 dm_io_thd
2761 2774 ? 00:00:00 dm_io_thd
2761 2775 ? 00:00:00 dm_io_thd
2761 2776 ? 00:00:00 dm_io_thd
2761 2777 ? 00:00:00 dm_io_thd
2761 2778 ? 00:00:00 dm_io_thd
2761 2779 ? 00:00:00 dm_io_thd
2761 2780 ? 00:00:00 dm_io_thd
2761 2781 ? 00:00:00 dm_io_thd
2761 2782 ? 00:00:00 dm_io_thd
2761 2783 ? 00:00:05 dmserver
2761 2786 ? 00:00:00 dm_chkpnt_thd
2761 2787 ? 00:00:07 dm_redolog_thd
2761 2789 ? 00:00:00 dm_hio_thd
2761 2790 ? 00:00:00 dm_hio_thd
2761 2791 ? 00:00:00 dm_hio_thd
2761 2792 ? 00:00:00 dm_hio_thd
2761 2793 ? 00:00:01 dm_tskwrk_thd
2761 2794 ? 00:00:01 dm_tskwrk_thd
2761 2795 ? 00:00:01 dm_tskwrk_thd
2761 2796 ? 00:00:01 dm_tskwrk_thd
2761 2797 ? 00:00:01 dm_tskwrk_thd
2761 2798 ? 00:00:01 dm_tskwrk_thd
2761 2799 ? 00:00:01 dm_tskwrk_thd
2761 2800 ? 00:00:01 dm_tskwrk_thd
2761 2801 ? 00:00:01 dm_tskwrk_thd
2761 2802 ? 00:00:01 dm_tskwrk_thd
2761 2803 ? 00:00:01 dm_tskwrk_thd
2761 2804 ? 00:00:01 dm_tskwrk_thd
2761 2805 ? 00:00:01 dm_tskwrk_thd
2761 2806 ? 00:00:01 dm_tskwrk_thd
2761 2807 ? 00:00:01 dm_tskwrk_thd
2761 2808 ? 00:00:01 dm_tskwrk_thd
2761 2809 ? 00:00:01 dm_sqllog_thd
2761 2810 ? 00:00:00 dm_sql_aux_thd
2761 2811 ? 00:00:13 dm_purge_thd
2761 2812 ? 00:00:05 dmserver
top 命令查看达梦数据库 CPU 资源占用:
[dmdba@dmserver script]$ cd ../bin
[dmdba@dmserver bin]$ ./DmServiceECARD status
DmServiceECARD (pid 3068) is running.
[dmdba@dmserver bin]$ ps -ef|grep dm.ini
dmdba 2761 1 0 11月12 ? 00:02:28 /dm8/dmdbms/bin/dmserver path=/dm8/dmdbms/data/FACE/dm.ini -noconsole
dmdba 3068 1 0 11月12 ? 00:02:30 /dm8/dmdbms/bin/dmserver path=/dm8/dmdbms/data/ECARD/dm.ini -noconsole
dmdba 24043 23880 0 23:49 pts/5 00:00:00 grep --color=auto dm.ini
[dmdba@dmserver bin]$ top -Hp 2761
Threads: 66 total, 0 running, 66 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.1 us, 0.1 sy, 0.0 ni, 99.8 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 8172916 total, 1469456 free, 4174348 used, 2529112 buff/cache
KiB Swap: 8388604 total, 8387316 free, 1288 used. 3669488 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2761 dmdba 20 0 3126724 545116 17528 S 0.0 6.7 0:00.48 dmserver
2764 dmdba 20 0 3126724 545116 17528 S 0.0 6.7 0:01.12 dm_sqllog_thd
2766 dmdba 20 0 3126724 545116 17528 S 0.0 6.7 0:00.00 dm_quit_thd
2767 dmdba 20 0 3126724 545116 17528 S 0.0 6.7 0:00.00 dm_io_thd
2768 dmdba 20 0 3126724 545116 17528 S 0.0 6.7 0:00.00 dm_io_thd
2769 dmdba 20 0 3126724 545116 17528 S 0.0 6.7 0:00.00 dm_io_thd
2770 dmdba 20 0 3126724 545116 17528 S 0.0 6.7 0:00.01 dm_io_thd
5.归档日志
5.1 开启归档
归档配置有 三 种方式:
SQL 语句完成 dmarch.ini 和 ARCH_INI 配置;
手动编写 dmarch.ini 文件和设置参数 ARCH_INI;
利用 manager 图形化工具配置。
5.1.1 通过sql命令开归档
-- 1.查看当前的归档模式
select arch_mode from v$database;
-- 2.启动到mount状态,状态3为mount
alter database mount;
select status$ from v$database;
-- 3.添加存放归档的目录,dm没有默认归档路径,file_sie达到多大切换另一个归档,space_limit设置归档空间限制
alter database add archivelog 'dest= /dm8/dmdbms/arch,type=local,file_size=64,space_limit=10240';
-- 4.开归档
SQL> alter database archivelog;
-- 5.启动到open状态,状态4为open
alter database open;
select status$ from v$database;
-- 6.查看归档配置
select arch_mode from v$database;
select arch_name,arch_type,arch_dest,arch_file_size,arch_space_limit from v$dm_arch_ini;
-- 7.检查归档线程
select DISTINCT name, thread_desc from v$threads;
说明:
1. V$database 中的 status$用数字来表示状态的,这里一共有 6 种状态,如下:
1:启动;2:启动,redo 完成;3 :MOUNT ;4 :打开;5:挂起;6:关闭
2. Roles$:角色,也是用数字表示。
0:普通;1:主库;2:备库
5.1.2 修改dm.ini 与dmarch.ini开归档
# 1.使用配置文件开关归档
[dmdba@dmserver DAMENG]$ cd /opt/dm8/data/DAMENG
# 2.开启dmarch.ini配置文件
[dmdba@dmserver DAMENG]$ cat dm.ini | grep -i arch_ini
ARCH_INI = 1 #启用dmarch.ini
# 3.手动编辑dmarch.ini 文件,之后保存 。dmarch.ini文件中添加内容如下:
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL
ARCH_DEST = /home/dmdba/arch
ARCH_FILE_SIZE = 64
ARCH_SPACE_LIMIT = 0
[ARCHIVE_LOCAL2]
ARCH_TYPE = LOCAL
ARCH_DEST = /home/dmdba/arch1
ARCH_FILE_SIZE = 64
ARCH_SPACE_LIMIT = 0
# 4.重启数据库服务生效
[dmdba@dmserver DAMENG]$ DmServiceDMSERVER stop
Stopping DmServiceDMSERVER: [ OK ]
[dmdba@dmserver DAMENG]$ DmServiceDMSERVER start
Starting DmServiceDMSERVER: [ OK ]
# 5.检查验证
SQL> select arch_mode from v$database;
SQL> select arch_name,arch_type,arch_dest,arch_file_size,arch_space_limit from v$dm_arch_ini;
参数说明:
ARCH_TYPE:归档类型,有以下几种: 本地归档 LOCAL(一台主库最多配 8 个)、 远程实时归档REALTIME(一台主库最多配 8 个)、远程异步归档 ASYNC(一台主库最多配 8 个)、即时归档 TIMELY(一个主库最多配 8 个)、远程归档 REMOTE(一个主库最多配 8 个)
ARCH_DEST: 归档路径
ARCH_FILE_SIZE:单个归档文件大小,单位 MB,取值范围(64~2048),默认为 1024MB,即 1G
ARCH_SPACE_LIMIT:归档文件空间限制,单位 MB,取值范围(1024~4294967294),0表示无空间限制
5.1.3 使用manager工具开归档
使用manager图像化工具来开启归档。
5.2 关闭归档
alter database mount;
alter database noarchivelog;
-- 删除归档路径配置,可以不做
ALTER DATABASE DELETE ARCHIVELOG 'dest=/home/dmdba/arc';
ALTER DATABASE DELETE ARCHIVELOG 'dest=/home/dmdba/arc1';
alter database open;
select arch_mode from v$database;
5.3 归档切换
数据库自动完成归档的切换,DM 支持手工切换归档。
--三条语句功能一样,选择一条执行即可,产生新的归档日志,redo日志并不会切换
alter database archivelog current;
alter system archive log current;
alter system switch logfile; --oracle中是切换联机日志的,达梦中是切换归档的
5.4 归档日志清理
--归档删除相关的系统函数
SQL> select name from v$ifun t where name like 'SF_ARCHIVELOG_%';
行号 NAME
---------- --------------------------------
1 SF_ARCHIVELOG_DELETE_BEFORE_LSN
2 SF_ARCHIVELOG_DELETE_BEFORE_TIME
--删除10天前的归档日志。
Select SF_ARCHIVELOG_DELETE_BEFORE_TIME(sysdate-10);
--删除某个lsn之前的归档
select SF_ARCHIVELOG_DELETE_BEFORE_LSN(803946);
归档自动删除:
#dmarch.ini,可以设置保留期,到期自动清理
arch_reserver_time #归档日志保留时间,单位分钟
针对业务繁忙期间,出现磁盘 IO 不定时繁忙的情况,因为配置了归档的空间上限(归档达到此上限),生成新的归档日志前删除旧的归档日志文件造成了 IO 的不定时繁忙。
解决方案:配置 JOB 作业,在业务空间期定时清理 N 天之前的归档文件。
5.5 归档日志检测
可以通过dmrachk检查归档日志连续性.
dmrachk帮助信息:
[dmdba@dmserver ~]$ dmrachk
rachk V8
version: 03134283904-20220630-163817-20005
格式: dmrachk keyword=value
例程: dmrachk arch_fil=/opt/a.log
强制参数: 必须指定arch_fil或者arch_path
关键字 说明(默认值)
--------------------------------------------------------------------------------
ARCH_FIL 指定一个归档文件
CMP_FIL 指定一个用于比较的归档文件
ARCH_PATH 指定一个归档目录
CMP_PATH 指定一个用于比较的归档目录
RECV_PATH 指定一个待修复的归档目录
TRUNC_FIL 指定新的文件,用于存储从错误归档中,抽取的有效数据。
EXTRACT_FIL 指定新的文件,用于存储从指定的seq范围的归档文件中抽取数据
ARCH_BAK_PATH 指定备份文件路径,用于存储归档修复过程中的重复文件
CHECK 校验级别(0, 1, 2, 3, 4) 0: 文件校验, 1: 包校验(seq & magic),2:ptx校验,3:rrec校验, 4:清理无效的归档文件, 5:修复归档文件到free之后的最后一个有效日志包。默认(0)
BEGIN_LSN 指定归档目录时,指定排除小于该LSN的文件
END_LSN 指定归档目录时,指定排除大于该LSN的文件
BEGIN_SEQ 指定归档目录时,抽取大于该SEQ的文件
END_SEQ 指定归档目录时,抽取小于该SEQ的文件
BEFORE_LSN CHECK=4,指定归档目录,删除该LSN之前的文件。默认为0,所有LSN范围内日志均删除
BEFORE_SEQ CHECK=4,指定归档目录,删除该SEQ之前的文件。默认为0,所有SEQ范围内日志均删除
BEFORE_TIME CHECK=4,指定归档目录,删除该时间点之前的文件。默认删除所有时间点的归档
EXCLUDE_DB_MAGIC CHECK=4,指定归档目录,删除指定的DB_MAGIC之外的文件。
OUTPUT_FIL LOG可以指定输出到文件
DCR_INI 指定dmdcr.ini路径,若未指定,则不使用
DM_INI 目标库dm.ini的路径,用于获取日志加密信息
AFTER_FREE 指定TRUNC_FIL时,是否校验并抽取FREE之后的内容。0 不抽取;1 抽取。默认0
CYT_UPDATE 是否更新归档密钥,需要与ARCH_PATH同时使用。0 不更新;1 更新。默认0。
CYT_UPDATED_PATH 归档密钥更新目标文件所在目录。未指定时,直接在原文件上更新;若指定,则更新到新的路径,原文件保持不变
HELP 显示帮助信息
dmrachk检测归档日志:
dmrachk arch_path=/dm8/dmdbms/arch
5.6 相关数据字典
V$ARCHIVED_LOG:显示当前实例的所有归档日志文件信息。
V$DM_ARCH_INI :用来存放归档路径等相关归档参数信息。
V$ARCH_FILE :查询本地归档日志信息。对DMDSC集群,除了显示本地归档外,也显示远程归档信息。
V$ARCH_QUEUE :显示当前归档任务队列信息。
V$ARCH_SEND_INFO:用于在主库上查询各备库的日志发送统计信息。
V$ARCH_STATUS :查询归档状态信息,归档状态是由主库记录和维护的,此视图只在主库上查询有效,备库上的查询结果没有实际意义。
V$BACKUPSET_ARCH: 显示备份集的归档信息。
V$BACKUPSET_SEARCH_DIRS: 查询 V$BACKUPSET_SEARCH_DIRS 显示当前会话已添加的备份目录,即备份集搜索目录。若用户没有添加备份目录,那么仅显示默认的备份目录。
6.服务管理
6.1 数据库服务状态
Mount:不能访问数据,只能对归档模式,数据库模式等进行维护
Open:可以访问数据,对外正常提供服务
Suspend:不允许对数据更改,写日志,限制磁盘写入,否则挂起
Mount 与 open 状态可以互切 ,open 与 suspend 状态可以互切,但是 mount 与 suspend不能互切
6.2 数据库模式
Normal:默认打开服务时是 open,第一次初始化打开时不允许 mount 打开.
Primary :无论是否指定状态,打开服务时是 mount
Standby:无论是否指定状态,打开服务时是 mount
以上三种模式,在 mount 状态下允许切换
6.3 数据库服务的启动
方式1:
[dmdba@dmserver ~]$ DmServiceDMSERVER start
Starting DmServiceDMSERVER: [ OK ]
或 mount--->open
[dmdba@dmserver ~]$ DmServiceDMSERVER start mount
Starting DmServiceDMSERVER: [ OK ]
[dmdba@dmserver arch]$ disql sysdba/dmdba123
服务器[LOCALHOST:5236]:处于普通配置状态
登录使用时间: 14.063(毫秒)
SQL> select status$ from v$instance;
行号 status$
---------- -------
1 MOUNT
SQL> alter database open;
SQL> alter database mount;
Mount 与 open 可以互切.
方式2:
[dmdba@dmserver ~]$dmserver /opt/dm8/data/DAMENG/dm.ini -noconsole mount &
[dmdba@dmserver ~]$dmserver /opt/dm8/data/DAMENG/dm.ini -noconsole
Dmserver help 查看帮助
最好调到后台启动
disql sysdba/dmdba123
服务器[LOCALHOST:5236]:处于普通配置状态
登录使用时间: 13.229(毫秒)
SQL> select status$ from v$instance;
行号 status$
---------- -------
1 MOUNT
SQL>alter database open;
注意此处加& 和不加的区别:加&时,在当前窗口执行 ctrl+c,服务的状态不受影响
方式3:
[root@dmserver ~]# systemctl enable DmServiceDMSERVER.service
[root@dmserver ~]# systemctl start DmServiceDMSERVER.service
[root@dmserver ~]# systemctl status DmServiceDMSERVER.service
方式4:类似于windows的服务管理方式
调用图形,所在位置:/opt/dm8/tool/dmservice.sh
[dmdba@dmserver tool]$ dmservice.sh
6.4 数据库服务的关闭
方式1:
[dmdba@dmserver ~]$ DmServiceECARD status
DmServiceECARD (pid 6880) is running.
[dmdba@dmserver ~]$ DmServiceECARD stop
Stopping DmServiceECARD: [ OK ]
方式2:
[dmdba@dmserver ~]$ disql sysdba/Newcapec.2022
服务器[LOCALHOST:5236]:处于普通打开状态
登录使用时间 : 4.157(ms)
disql V8
SQL> shutdown immediate;
或
SQL> shutdown abort;
操作已执行
已用时间: 1.331(毫秒). 执行号:0.
SQL> exit
[dmdba@dmserver ~]$ DmServiceECARD status
DmServiceECARD dead but pid file exists
方式3:
[root@dmserver ~]# systemctl stop DmServiceECARD.service
方式4:
使用图形化工具:dmservice.sh
7.数据库版本查询
方式1:
SQL> select * from v$version;
行号 BANNER
---------- ---------------------------------
1 DM Database Server 64 V8
2 8.1
3 企业版
4 DB Version: 0x7000c
5 03134283904-20220630-163817-20005
已用时间: 0.339(毫秒). 执行号:56802.
方式2:
SQL> select id_code;
行号 ID_CODE
---------- -----------------------------------
1 --03134283904-20220630-163817-20005
已用时间: 1.932(毫秒). 执行号:56803.
04.达梦DCA认证课程-DM用户和权限管理
1.用户管理
DM 默认的预定义用户:
SYS:系统内置用户,不允许登录。
SYSDBA:系统管理员,拥有几乎所有权限(除审计和强制访问控制)
SYSAUDITOR:系统审计管理员,具有审计相关权限。
SYSSSO:系统安全管理员,具有强制访问控制等权限;
SYSDBO:安全版本才有的用户,安全操作员
1.1 创建用户
数据库系统在运行的过程中,往往需要根据实际需求创建用户,然后为用户指定适当的权限。创建用户的操作一般只能由系统预设用户 SYSDBA 、SYSSSO 和 和 SYSAUDITOR 完成,如果普通用户需要创建用户,必须具有 CREATE USER 的数据库权限。
创建用户的命令是 CREATE USER, 创建用户所涉及的内容包括为用户指定用户名、认证模式、口令、口令策略、空间限制、只读属性以及资源限制。其中用户名是代表用户账号的标识符,长度为 1~128 个字符。用户名可以用双引号括起来,也可以不用,但如果用户名以数字开头,必须用双引号括起来。
语法格式:
create user XXX identified by XXX;
使用示例:
--创建用户
create user hr identified by dameng123 password_policy 0 default tablespace tbs default index tablespace tbsidx;
密码带有特殊字符的登录处理:
达梦中密码带有特殊字符需要双引号括起来,在 linux 系统下可以使用单引号‘转义
disql hrtest/'"Dameng@123"'
--也可以使用右斜杠\转义
disql dmoa/\"Dameng@123\"
1.2 配置口令策略
用户口令最长为 48 字节,创建用户语句中的 PASSWORD Y POLICY 子句用来指定该用户的口令策略,系统支持的口令策略有:
0 无策略
1 禁止与用户名相同
2 口令长度不小于 9
4 至少包含一个大写字母(A-Z)
8 至少包含一个数字(0-9)
16 至少包含一个标点符号(英文输入法状态下,除“和空格外的所有符号)
口令策略可单独应用,也可组合应用。组合应用时,如需要应用策略 2 和 4,则设置口令策略为 2+4=6 即可。
除了在创建用户语句中指定该用户的口令策略,隐含参数 PWD_POLICY(不在dm.ini中) 可以指定系统的默认口令策略,其参数值的设置规则与 PASSWORD POLICY 子句一致,缺省值为2。若在创建用户时没有使用 PASSWORD POLICY 子句指定用户的口令策略,则使用系统的默认口令策略。
查询系统默认口令策略:
--PWD_POLICY是隐含参数,只能通过函数或者sql语句修改
SQL> select name,type,value,sys_value,file_value from v$parameter where name='PWD_POLICY';
行号 NAME TYPE VALUE SYS_VALUE FILE_VALUE
---------- ---------- ---- ----- --------- ----------
1 PWD_POLICY SYS 0 0 0
查询用户当前的口令策略:
SQL> select username,account_status,password_versions from dba_users;
行号 USERNAME ACCOUNT_STATUS PASSWORD_VERSIONS
---------- ---------- -------------- -----------------
1 SYSAUDITOR OPEN 0
2 SYSSSO OPEN 0
3 SYSDBA OPEN 0
4 SYS OPEN 0
--修改用户口令策略
alter user sysdba password_policy 31;
SQL> select username,account_status,password_versions from dba_users where username='SYSDBA';
行号 USERNAME ACCOUNT_STATUS PASSWORD_VERSIONS
---------- -------- -------------- -----------------
1 SYSDBA OPEN 31
修改系统默认口令策略:
方法1:通过alter system
select name,type,value from v$parameter where name='PWD_POLICY';
alter system set 'pwd_policy'=6 both;
方法2:通过console工具
console为脱机工具,对参数值的修改是通过修改dm.ini文件中的参数值来进行,无论参数是静态还是动态,都需要重启DM数据库才能使新设置的参数值生效。
[dmdba@dmserver tool]$ pwd
/home/dmdba/dmdbms/tool
[dmdba@dmserver tool]$ ./console
方法3:使用系统过程
使用系统过程 SP_SET_PARA_VALUE 来配置 PWD_POLICY 参数值。
SQL> SP_SET_PARA_VALUE(1, 'PWD_POLICY',2);
DMSQL 过程已成功完成
已用时间: 2.139(毫秒). 执行号:56607.
SQL> select name,value from v$parameter where name='PWD_POLICY';
行号 NAME VALUE
---------- ---------- -----
1 PWD_POLICY 2
已用时间: 34.398(毫秒). 执行号:56608.
1.3 修改用户信息
使用 ALTER R USER 语句可修改用户口令 。 除口令外 , 这个语句还可以修改用户的口令策略 、 空间限制 、只读属性以及资源限制等。当然,系统固定用户的系统角色和资源限制不能被修改。
语法格式:
alter user xxx 选项
使用示例:
--用户锁定
alter user hr ACCOUNT UNLOCK;
--用户解锁
alter user hr ACCOUNT LOCK;
--修改用户的默认表空间
alter user hr DEFAULT TABLESPACE dmtbs;
--修改用户密码
alter user hr IDENTIFIED by "Dameng@123";
设置操作系统认证:
--隐含参数 enable_local_osauth
SQL> select name,type,value,sys_value,file_value from v$parameter where name='ENABLE_LOCAL_OSAUTH';
行号 NAME TYPE VALUE SYS_VALUE FILE_VALUE
---------- ------------------- --------- ----- --------- ----------
1 ENABLE_LOCAL_OSAUTH READ ONLY 0 0 0
--启用操作系统认证
alter system set 'ENABLE_LOCAL_OSAUTH'=1 spfile;
--创建dmdba用户组
groupadd dmdba
usermode -G dmdba dmdba
id dmdba
--重启数据库
sql> shutdown immediate;
--启动数据库
[dmdba@dmserver ~]$ DmServiceECARD start
Starting DmServiceECARD: [ OK ]
[dmdba@dmserver ~]$ DmServiceECARD status
DmServiceECARD (pid 3527) is running.
--操作系统认证登录
[dmdba@dmserver ~]$ disql / as sysdba
服务器[LOCALHOST:5236]:处于普通打开状态
登录使用时间 : 3.748(ms)
disql V8
SQL> select user;
行号 USER()
---------- ------
1 SYSDBA
1.4 用户资源限制
用户资源限制设置(可以直接使用 limit 子句,也可以使用 profile 来管理用户的资源限制)
alter user hr LIMIT FAILED_LOGIN_ATTEMPS 5, PASSWORD_LOCK_TIME 3;
DM 支持使用 profile 管理用户资源限制(新版本支持,2021 年 10 月以后的版本)
select * from DBA_PROFILES;
create profile profile1 limit FAILED_LOGIN_ATTEMPS 5, PASSWORD_LOCK_TIME 3, PASSWORD_LIFE_TIME 180;
alter user hrtest PROFILE profile1;
--查询用户使用的profile资源限制文件
select a.pid profileid, b.name profile_name, a.uid userid, c.name user_name
from SYSUSERPROFILES a, SYSOBJECTS b, SYSOBJECTS c
where a.PID = b.id and a.UID = c.ID;
1.5 删除用户
一个用户被删除后, 这个用户本身的信息,以及它所拥有的数据库对象的信息都将从数据字典中被删除。
语法格式:
DROP USER <用户名> [RESTRICT | CASCADE];
使用示例:
drop user if EXISTS hr;
drop user if EXISTS hr CASCADE;
如果在删除用户时未使用 CASCADE 选项(缺省使用 RESTRICT 选项),若该用户建立了 数据库对象, DM 将返回错误信息,而不删除此用户。
如果在删除用户时了 使用了 CASCADE 选项,除数据库中该用户及其创建的所有对象被删除外,若其他用户创建的对象引用了该用户的对象,DM 还将自动删除相应的引用完整性约束及依赖关系。
2.权限管理
2.1 用户默认权限
SQL> conn test/dameng123
服务器[LOCALHOST:5236]:处于普通打开状态
登录使用时间 : 7.961(ms)
select user;
行号 USER()
---------- ------
1 TEST
SQL> select * from session_privs;
行号 PRIVILEGE
---------- --------------
1 CREATE SESSION
2 PUBLIC
3 SOI --具有查询sys开头系统表的权限
2.3 授予权限
--赋予对象权限
grant select on dmhr.employee to hrtest;
--赋予系统权限
grant create table to hrtest;
grant create session to hrtest;
grant resource to hrtest;
--赋予查询对象权限,精确到列
grant select (employee_id, employee_name) on dmhr.employee to hrtest;
2.4 回收权限
--回收对象权限
revoke select on dmhr.employee from hrtest;
--回收系统权限
revoke create table from hrtest;
2.4 相关视图
select * from dba_sys_privs t where t.GRANTEE= 'HRTEST';
select * from dba_role_privs t where t.GRANTEE= 'HRTEST';
select * from dba_tab_privs t where t.GRANTEE= 'HRTEST';
3.角色管理
角色是权限的集合,角色使权限管理更加方便。
DBA:具有几乎所有权限(除数据库审计和强制访问控制之外),默认赋给 SYSDBA 用户。
PUBLIC:具有对当前模式下对象的 DML 数据操作权限。
RESOURCE:具有在当前模式下对象定义权限(创建表、索引、视图等);
SOI:具有查询 sys 开头系统表的权限;
VTI:具有查询 v$开头的动态视图权限(动态视图记录在 v$dynamic_tables,如果没有此权限,DM 管理工具上会报没有查询 v$视图权限)
3.1 创建角色
语法:
create role <角色名>;
使用说明:
1.创建者必须具有 CREATE ROLE 数据库权限;
2.角色名的长度不能超过128个字符;
3.角色名不允许和系统已存在的用户名重名;
4.角色名不允许是DM保留字;
查询角色:
select * from dba_roles;
3.2 删除角色
语法:
drop role <角色名>;
说明:
即使已将角色授予了其他用户,删除这个角色的操作也将成功。此时,那些之前被授予该角色的用户将不再具有这个角色所拥有的权限,除非用户通过其他途径也获得了这个角色所具有的权限。
3.3 启用与禁用角色
某些时候, 用户不愿意删除一个角色, 但是却希望这个角色失效,此时可以使用 DM 系统过程 SP_SET_ROLE
来设置这个角色为不可用,将第二参数置为0表示禁用角色。
语法格式:
-- 禁用角色
SP_SET_ROLE('角色名', 0);
-- 启用角色
SP_SET_ROLE('角色名', 1);
使用说明:
1.只有拥有ADMIN_ANY_ROLE权限的用户才能启用和禁用角色,并且设置后立即生效;
2.凡是包含禁用角色A的角色M,M中禁用的角色A将无效,但是M仍有效;
3.系统预设的角色是不能设置的,如:DBA、PUBLIC、RESOURCE。
05.达梦DCA认证课程-DM模式对象管理
1.模式对象管理
1.1 管理模式
1.1.1 模式与用户之间的关系
模式定义:
模式是一个特定的对象集合,在概念上可将其看作是包含表、视图、索引等若干对象的对象集
模式对象:
表、视图、约束、索引、序列、触发器、存储过程/函数、包、同义词、类、域
模式与用户之间的关系:
当系统建立一个用户时,会自动生成一个同名的模式用户还可以建立其他模式,DM 中用户和模式是一对多的关系,一个用户可以拥有多个模式,一个模式仅能归属于一个用户。Oracle 中用户和模式是一对一的关系。
相关查询:
--查看模式
select * from SYSOBJECTS t where t."TYPE$" ='SCH';
--查看用户
select * from SYSOBJECTS t where t."SUBTYPE$" ='USER';
--查询模式和用户的对应关系
select a.id scheid, a.name schename, b.id userid, b.name username
from SYS.SYSOBJECTS a, SYS.SYSOBJECTS b
where a."TYPE$" = 'SCH' and a.pid = b.id;
1.1.2 模式管理
建议采用单用户,单模式来使用
创建模式:
--创建模式
create schema hrtest01 AUTHORIZATION HRTEST;
--指定模式创建表
create table hrtest01.t_test(id int, name varchar(20));
查看当前模式和当前用户:
--查询当前模式
select sys_context('USERENV','CURRENT_SCHEMA');
--查询当前用户
select sys_context('USERENV','CURRENT_USER'); 或 select user;
切换模式
--仅对当前会话生效
[dmdba@dmserver ~]$ disql sysdba/Newcapec.2022
服务器[LOCALHOST:5236]:处于普通打开状态
登录使用时间 : 4.327(ms)
disql V8
SQL> select sys_context('USERENV','CURRENT_SCHEMA');
行号 SYS_CONTEXT('USERENV','CURRENT_SCHEMA')
---------- ---------------------------------------
1 SYSDBA
SQL> set schema dmhr;
操作已执行
已用时间: 0.410(毫秒). 执行号:0.
SQL> select sys_context('USERENV','CURRENT_SCHEMA');
行号 SYS_CONTEXT('USERENV','CURRENT_SCHEMA')
---------- ---------------------------------------
1 DMHR
删除模式
drop SCHEMA IF EXISTS HRTEST01;
--级联删除模式下对象,生产环境慎用
drop SCHEMA IF EXISTS HRTEST01 CASCADE;
1.2 管理表
1.2.1 管理表
表包含:索引组织表、堆表、分区表、HUGE 列存储表、外部表、临时表。DM 默认创建的是索引组织表,Oracle 默认创建的是堆表。
索引组织表和堆表的区别:
索引组织表:有且仅有一个聚簇索引键,表数据按照聚簇索引键排序(数据是有序的,插入
有序),如果在创建表时未指定聚簇索引键,默认使用 rowid 为聚簇索引键。rowid 是逻辑
rowid,占用存储空间,所以索引组织表比堆表占用较多空间。
堆表:数据是无序的,插入无序,堆表插入效率较高,rowid 是物理 rowid,不占用存储空
间。所以堆表比索引组织表节约空间。
对聚簇索引键的范围查询,索引组织表更高效。
创建表:
--创建表
create table t_userinfo(userid int,username varchar(20),sex bit,logdate date default sysdate,logtime defaut sysdate,logdatetime default sysdate) tablespace tbs;
--插入数据
insert into t_userinfo(userid,username,sex) values(1,'cheng',0)
CTAS创建表:
--备份表和数据
create table t_emp01 as select * from dmhr.employee;
create table t_emp02 like dmhr.employee;
--只要表结构,不要数据
create table t_emp03 as select * from dmhr.employee where 1=0
使用CREATE table as创建表时,默认不会复制表的约束信息,由参数CTAB_SEL_WITH_CONS指定:
select * from SYS."V$PARAMETER" t where t.name like 'CTAB_SEL_WITH_CONS%';
添加字段:
alter table t_userinfo add column email varchar(50);
修改字段:
alter table t_userinfo modify email varchar(200);
删除字段:
alter table t_userinfo drop column email;
重命名表或字段:
alter table t_userinfo rename to t_user;
alter table t_userinfo rename column sex to gender;
相关数据字典:
select * from dba_tables t where t.owner='HRTEST';
select * from dba_tab_columns t where t.owner='HRTEST';
select t.TABLE_NAME, t.TABLESPACE_NAME from user_tables t;
select t.TABLE_NAME, t.COLUMN_NAME, t.NULLABLE from USER_TAB_COLS t;
1.2.2 数据导入
DM 在 DISQL 下用 start 或`都可以, Oracle 用@:
SQL> start /dm8/backup/dts/t_department.sql
SQL> `/dm8/backup/dts/t_department.sql
DM 管理工具只能使用`, `后面的文件路径不能有空格,导入后需要手工 commit:
`/dm8/backup/dts/t_department.sql
1.3 管理约束
1.3.1 约束类型
NOT NULL:非空约束
UNIQUE:唯一约束
PRIMARY KEY:主键约束 (唯一约束+非空约束)
FOREIGN KEY:外键约束
CHECK:检验约束
1.3.2 管理约束
非空约束:
alter table hrtest.t_testpid modify pname not null;
唯一约束:
alter table hrtest.t_testpid add CONSTRAINT uk_testpid_email unique (email);
主键约束:
alter table hrtest.t_testpid ADD CONSTRAINT pk_testpid_pid PRIMARY KEY(pid);
检查约束:
alter table hrtest.t_testpid ADD CONSTRAINT ck_testpid_salary CHECK (salary>=2100);
alter table dmtest.t_userinfo add constraint ck_userinfo_logdatetime check (logdatetime>'2022-1-1');
外键约束:
--引用另外一张表的主键或者唯一键
alter table hrtest.t_test add CONSTRAINT fk_test_id FOREIGN KEY(id) REFERENCES
hrtest.t_testpid(pid);
alter table ccense.t_userinfo add CONSTRAINT fk_dmhr_dept FOREIGN KEY(deptno) REFERENCES dmhr.DEPARTMENT(department_id);
约束的禁用和启用、删除:
alter table hrtest.t_test disable CONSTRAINT fk_test_id;
alter table hrtest.t_test enable CONSTRAINT fk_test_id;
alter table hrtest.t_test drop CONSTRAINT fk_test_id;
批量禁用外键约束:
select 'alter table '||owner||'.'||table_name||' disable constraint '|| t.CONSTRAINT_NAME ||';'
from DBA_CONSTRAINTS t
where t.OWNER ='DMTEST' and t.CONSTRAINT_TYPE = 'R';
相关数据字典:
select * from dba_constraints t where t.owner='HRTEST';
select * from DBA_CONS_COLUMNS t where t.owner='HRTEST';
1.4 管理索引
索引类型包含:聚簇索引、二级索引、函数索引、位图索引(主要用于 OLAP 系统)、位图连接
索引、全文索引、组合索引等。
索引:二级索引(B 树索引),索引的存在是为了提高查询速度。索引存放的是索引列值、聚簇
索引键和 rowid。
一种数据库对象,通过指针加速查询速度,通过快速定位数据的方法,减少磁盘 I/O。
索引特点:
索引与表相互独立,索引占用存储空间(如果一个表越大,其索引也会越来越大),
索引相当于一个小表,索引是有序的(按照索引字段排序),在查询时服务器自动使用索引,DML
操作时自动维护索引。
索引的优点:
提高查询性能、减少排序。
索引的缺点:
索引不是越多越好,索引会降低 DML 的效率(DML 操作需要维护索引)。
组合索引创建时要注意索引列的顺序(一般经常查询的列放在前面,等值查询列放在前面)
创建索引:
create index ix_emp01_employeename ON HRTEST.T_EMP01(EMPLOYEE_NAME);
--查看执行计划
explain select * from hrtest.t_emp01 t where T.EMPLOYEE_NAME = '马学铭';
索引的监控:
--开启索引监控
alter index HRTEST.IX_EMP01_EMPLOYEENAME MONITORING USAGE;
--关闭索引监控
alter index HRTEST.IX_EMP01_EMPLOYEENAME NOMONITORING USAGE;
--查看索引的监控信息
select * from v$object_usage;
索引的重建:
--生产环境建议使用 online 方式重建,不影响表的DML操作
alter index HRTEST.IX_EMP01_EMPLOYEENAME rebuild ONLINE;
删除索引:
drop index HRTEST.IX_EMP01_EMPLOYEENAME;
索引相关的数据字典:
select * from dba_indexes t where t.OWNER ='HRTEST';
select * from dba_ind_columns t where t.index_OWNER ='HRTEST';
1.5 管理视图
普通视图(物化视图除外)中不包含数据,数据来源于基表。视图提供一个查询窗口。
从用户角度来看,一个视图是从一个特定的角度来查看数据库中的数据。
从数据库系统内部来看,一个视图是由 SELECT 语句组成的查询定义的虚拟表。
简单视图:单表查询,不包含聚合函数、group by 等。一般可以支持 DML 操作,对视图的
DML 操作都会转化为对基表的 DML 操作,DML 操作要满足基表的约束条件。
复杂视图:多表连接,包含聚合函数、group by 等。一般不支持增删改操作。
创建视图:
create view hrtest.v_emp
as
select a.EMPLOYEE_ID, a.EMPLOYEE_NAME, a.EMAIL, a.PHONE_NUM
from dmhr.employee a
where a.DEPARTMENT_ID = 1001;
重建视图:
create or REPLACE view hrtest.v_emp
as
select a.EMPLOYEE_ID, a.EMPLOYEE_NAME, a.EMAIL, a.PHONE_NUM, a.SALARY
from dmhr.employee a
where a.DEPARTMENT_ID = 1001;
创建复杂视图:
create or REPLACE view hrtest.v_emp_salary
as
select a.DEPARTMENT_ID, sum(A.SALARY) SUM_SALARY
from dmhr.employee a
group by a.DEPARTMENT_ID
having sum(A.SALARY) > 100000;
06.达梦DCA认证课程-DM数据库备份恢复
1.数据库物理备份
1.1 相关参数
备份还原两个重要参数:
BAK_PATH:DM 默认的备份路径,生产环境不要和源库数据文件放在同一磁盘上。避免磁盘损坏,数据文件和备份文件同时损坏的情况。
BAK_USE_AP:备份还原策略,默认使用 DMAP 辅助进程进行备份还原。
参数查询:
SQL> select name,type,value,sys_value,file_value,description from v$parameter t where name in ('BAK_PATH', 'BAK_USE_AP');
行号 NAME TYPE VALUE SYS_VALUE FILE_VALUE
---------- ---------- --------- -------------------------- -------------------------- --------------------------
DESCRIPTION
-----------------------------------------------------------------------------------
1 BAK_PATH READ ONLY /dm8/dmdbms/data/ECARD/bak /dm8/dmdbms/data/ECARD/bak /dm8/dmdbms/data/ECARD/bak
backup file path
2 BAK_USE_AP SYS 1 1 1
backup use assistant plus-in, 0:use sub process; 1:use AP; 2:not use AP. default 1.
1.2 AP服务
联机备份需要开归档,AP服务需要启动。
查看AP进程:
#安装达梦数据库软件,执行root脚本创建ap自启动服务
[root@dmserver ~]# ps -ef |grep dmap|grep -v grep
dmdba 8715 1 0 11月12 ? 00:00:20 /dm8/dmdbms/bin/dmap
查看AP状态:
[dmdba@dmserver ~]$ DmAPService status
DmAPService (pid 8715) is running.
停止AP:
[dmdba@dmserver ~]$ DmAPService stop
Stopping DmAPService: [ OK ]
启动AP:
[dmdba@dmserver ~]$ DmAPService start
Starting DmAPService: [ OK ]
2.DM联机备份
**联机备份:**数据库是启动状态,联机备份要求数据库打开归档,备份时 AP 服务需要为启动状态。联机备份支持全库,表空间,表,归档级别的备份,备份时数据库需要开启归档模式。
联机备份的方式有两种:1、sql语句备份 2、manager工具图形化备份
2.1 sql备份数据库
2.1.1 备份数据库
查询数据库归档模式:
--没有开归档的话,要先开归档
SQL> select name,arch_mode from v$database;
行号 NAME ARCH_MODE
---------- ----- ---------
1 ECARD Y
全量备份:
SQL> backup database;
--to后面跟备份名称 backupset后面指定备份路径
SQL> backup database full to ONLINEBAK_01 backupset '/dm8/backup/full/ONLINEBAK_01';
增量备份:
SQL> backup database increment;
SQL> backup database increment BASE ON BACKUPSET '/dm8/backup/full/ONLINEBAK_01' to ONLINEBAKINCR_01 backupset '/dm8/backup/incr/ONLINEBAK_01' ;
SQL> backup database increment with BACKUPDIR '/dm8/backup/full/' to ONLINEBAKINCR_02 backupset '/dm8/backup/incr/ONLINEBAK_02' ;
刚开归档后备份报错处理:
--查询ckpt_lsn:
select * from v$rlog;
--执行检查点
checkpoint(100)
--查询当前的ckpt_lsn:
select * from v$rlog;
2.1.2 备份集管理
dm的备份集是指文件夹,文件夹下面存放数据备份片和元数据(备份片信息)。
查看备份集:
select * from v$backupset;
备份集相关函数:
SQL> select name from v$ifun t where t.name like 'SF_BAKSET%';
行号 NAME
---------- -------------------------------
1 SF_BAKSET_BACKUP_DIR_REMOVE
2 SF_BAKSET_BACKUP_DIR_REMOVE_ALL
3 SF_BAKSET_REMOVE_BATCH
4 SF_BAKSET_BACKUP_DIR_ADD
5 SF_BAKSET_CHECK
6 SF_BAKSET_REMOVE
7 SF_BAKSET_REMOVE
添加备份集目录:
注意:添加后目录,只针对当前会话有效
--默认只读取bak_path参数中指定的路径,如果要读取自己指定的备份路径,需要添加备份集目录
SF_BAKSET_BACKUP_DIR_ADD('DISK','/dm8/backup/full/');
SF_BAKSET_BACKUP_DIR_ADD('DISK','/dm8/backup/incr/');
移除备份集目录:
SF_BAKSET_BACKUP_DIR_REMOVE('DISK','/dm8/backup/full/');
校验备份集:
select SF_BAKSET_CHECK('DISK','/dm8/backup/incr/ONLINEBAK_02');
查看各个增量备份集的基础备份集:
select t.BACKUP_NAME, t.BACKUP_PATH, LEVEL, t.type,
SYS_CONNECT_BY_PATH(t.BACKUP_NAME, '/') BACKUP_BASECONNECT,
CONNECT_BY_ISLEAF ISLEAF
from (select a.BACKUP_NAME, a.BACKUP_PATH, a.BASE_NAME, a.TYPE
from V$BACKUPSET a) t
connect by t.BASE_NAME = PRIOR t.BACKUP_NAME
start with t.type = 0;
2.1.3 表空间备份
backup tablespace dmtbs;
backup tablespace dmtbs to tbsfullbak backupset '/dm8/backup/TBSBSK01'
backup tablespace dmtbs INCREMENT with BACKUPDIR '/dm8/backup/full/' to DMTBSINCR_01 backupset '/dm8/backup/incr/DMTBSINCR_01' ;
2.1.4 表和归档的备份
--表的备份,表只有全备
backup table dmhr.emp;
backup table dmhr.emp to empbak backupset '/dm8/backup/EMPBAK';
--归档备份
backup archivelog all;
2.2 manager工具图形化备份
使用manger图形化工具进行备份,后台调用disql进行备份。备份集存放的位置,默认为bak_path的值。
manager->备份->库备份、表备份、表空间备份、归档备份
3.DM脱机备份
**脱机备份:**冷备份,数据库关闭状态下的备份,可以开归档也可以不开,DMAP服务要开启(操作系统拷贝方式备份不需要)。脱机备份只支持库备份和归档备份。
**脱机备份的方式有三种:**1.操作系统拷贝、2.dmrman备份、3.console工具图形化备份
3.1 操作系统拷贝备份
1.查询数据文件
select file_name from dba_data_files;
2.关闭数据库
SQL> shudown immediate;
3.查看数据库状态
[dmdba@dmserver ~]$ DmServiceECARD status
4.创建备份目录
mkdir -p /home/dmdba/coldbak
5.使用cp命令备份数据文件
cp *.DBF /home/dmdba/coldbak
3.2 dmrman备份
dmrman备份支持全库备份和归档备份,备份时需要关闭数据库,DMAP服务开启,属于脱机备份。DMRMAN可以针对整个数据库执行脱机完全备份和增量备份,数据库可以配置归档也可以不配置。与oracle的rman不一样,oracle的支持联机和脱机备份。
3.2.1 dmrman命令使用
1.dmran启动和退出
[dmdba@dmserver ~]$ dmrman
dmrman V8
RMAN> exit
time used: 2.359(ms)
2.查看dmrman支持的命令帮助
[dmdba@dmserver ECARD]$ dmrman
dmrman V8
RMAN> help
version: 03134283904-20220630-163817-20005
格式: ./dmrman KEYWORD=value
例程: ./dmrman CTLFILE=/opt/dm7data/dameng/res_ctl.txt
必选参数:
关键字 说明
--------------------------------------------------------------------------------
CTLFILE 指定执行语句所在的文件路径
CTLSTMT 指定待执行语句
DCR_INI 指定dmdcr.ini路径;若未指定且当前目录中dmdcr.ini存在,则使用当前目录中的dmdcr.ini。
可单独使用,也可与其他参数配合使用
DFS_INI 指定dmdfs.ini路径;若未指定且当前目录中dmdfs.ini存在,则使用当前目录中的dmdfs.ini。
可单独使用,也可与其他参数配合使用
USE_AP 指定备份、还原执行载体,1/2:DMAP/进程自身,默认是DMAP。
AP_PORT 连接AP时用的端口号。默认是4236。可单独使用,也可与其他参数配合使用
HELP 打印帮助信息
time used: 4.221(ms)
RMAN>
2.查看dmrman配置信息
RMAN> configure;
THE DMRMAN DEFAULT SETTING:
DEFAULT DEVICE:
MEDIA : DISK
DEFAULT TRACE :
FILE :
LEVEL : 1
DEFAULT BACKUP DIRECTORY:
TOTAL COUNT :0
DEFAULT ARCHIVE DIRECTORY:
TOTAL COUNT :0
time used: 3.507(ms)
3.configure进行dmrman参数配置
# 恢复配置的默认值
configure default device clear
# 清除所有的默认配置
configure clear;
# 配置备份集搜索目录
configure default backupdir '/home/dmdba/backup','/home/dmdba/rman_bak';
# 增加备份集搜索目录
configure default backupdir add '/home/dm_bak3';
# 删除备份集搜索目录
configure default backupdir delete '/home/dm_bak3';
# 配置归档日志搜索目录
configure default archivedir '/home/dm_arch1','/home/dm_arch2';
configure default archivedir add '/home/dm_bak3';
configure default archivedir delete '/home/dm_bak3';
# 显示文件的默认值
CONFIGURE DEFAULT TRACE;
# 配置默认TRACE文件
configure default trace file '/home/dm_trace/trace.log';
# 配置默认TRACE级别
configure default trace level 2;
# 同时配置trace文件和trace级别
configure default trace file '/home/dm_trace/trace.log' trace level 2;
4.备份命令
# 备份数据库,因为数据库已关闭,需要指定dm.ini
backup database '/opt/dm8/data/ECARD/dm.ini';
backup database '/dm8/data/ECARD/dm.ini' backupset '/dm8/backup/FULLBAK03'
# 备份归档
backup archive log database '/opt/dm8/data/ECARD/dm.ini';
5.备份集的维护命令
# 查看
show backupset '/home/dm_bak/DB_ECARD_FULL_20220726_153458_577896';
show backupsets with backupdir '/home/dm_bak1','/home/dm_bak2';
# 校验
check backupset '/home/dm_bak/DB_ECARD_FULL_20220726_153458_577896';
check backupset 'db_bak_for_check_02' database '/opt/dmdbms/data/ECARD/dm.ini'
# 删除备份集
remove backupset '/home/dm_bak/dm_bak_for_remove_01';
remove backupset 'db_bak_for_remove_01' database '/opt/dmdbms/data/ECARD/dm.ini';
3.2.2 dmrman备份
1.关闭数据库
--不关闭数据库,使用dmrman备份时会报[-8216]:归档日志不完整
SQL> shudown immediate;
2.查看数据库状态
[dmdba@dmserver ~]$ DmServiceECARD status
3.dmrman备份数据库
#需关闭数据库,DMAP服务器启动
RMAN> backup database '/home/dmdba/dmdbms/data/ECARD/dm.ini';
backup database '/home/dmdba/dmdbms/data/ECARD/dm.ini';
Global parameter value of DSC_TRX_VIEW_SYNC is illegal, use max value!
Database mode = 0, oguid = 0
Normal of FAST
Normal of DEFAULT
Normal of RECYCLE
Normal of KEEP
Normal of ROLL
EP[0]'s cur_lsn[465979], file_lsn[465979]
Processing backupset /home/dmdba/dmdbms/data/ECARD/bak/DB_ECARD_FULL_20220726_153458_577896
[Percent:100.00%][Speed:0.00M/s][Cost:00:00:02][Remaining:00:00:00]
backup successfully!
time used: 00:00:03.838
4.dmrman备份归档
RMAN> backup archive log database '/home/dmdba/dmdbms/data/ECARD/dm.ini';
backup archive log database '/home/dmdba/dmdbms/data/ECARD/dm.ini';
Global parameter value of DSC_TRX_VIEW_SYNC is illegal, use max value!
Database mode = 0, oguid = 0
Normal of FAST
Normal of DEFAULT
Normal of RECYCLE
Normal of KEEP
Normal of ROLL
EP[0]'s cur_lsn[465979], file_lsn[465979]
Processing backupset /home/dmdba/dmdbms/data/ECARD/bak/ARCH_LOG_20220726_153739_163491
[Percent:100.00%][Speed:0.00M/s][Cost:00:00:02][Remaining:00:00:00]
backup successfully!
time used: 00:00:03.839
5.查看备份信息
RMAN> show backupset '/home/dmdba/dmdbms/data/ECARD/bak/DB_ECARD_FULL_20220726_153458_577896';
show backupset '/home/dmdba/dmdbms/data/ECARD/bak/DB_ECARD_FULL_20220726_153458_577896';
<backupset [DEVICE TYPE:DISK, BACKUP_PATH: /home/dmdba/dmdbms/data/ECARD/bak/DB_ECARD_FULL_20220726_153458_577896] info start ..........>
<DB INFO>
system path: /home/dmdba/dmdbms/data/ECARD
pmnt_magic: 2052031187
src_db_magic: 1379715536
db_magic: 1379715536
dsc node: 1
sys mode: 0
page check: 0
rlog encrypt: 0
rlog encrypt id: 0
external cipher[id/name]: 0/
external hash[id/name]: 0/
length in char: 0
use new hash: 1
page size: 32KB
extent size: 32
case sensitive: 1
log page size: 512B
unicode_flag/charset: 0
data version: 0x7000C
sys version: V8
pseg version: 0x7000B
enable policy: 0
archive flag: 1
blank_pad_mode: 0
crc_check: TRUE
page_enc_slice_size: 4096
char_fix_storage: 0
sql_log_forbid: 0
secur_flag: 2
db_enc_extend_size: 0
page_check_hash_size: 0
dpc_magic: 0
<META INFO>
backupset sig: BA
backupset version: 0x400A
database name: ECARD
backup name: DB_FULL_20220726_153458_577896
backupset description:
n_magic: 0x3001AD24
parent n_magic: 0xFFFFFFFF
meta file size : 119296
compressed level: 0
encrypt type: 0
parallel num: 1
backup range: database
mpp_timestamp: 1658820898
with_huge: FALSE
backupset_type: NORMAL
mpp_flag: FALSE
backup level: offline
backup type: full
without log: FALSE
end_lsn: 465979
max_trxid: 439068
base begin_lsn: -1
base end_lsn: -1
base n_magic: 0xFFFFFFFF
base name:
base backupset:
backup time: 2022-07-26 15:35:02
min exec ver: 0x08010227
min dct ver: 4
pkg size: 0x04000000
bak_magic: 0
l_term_id: 0
term_id: 0
c_seqno: 379506
c_lsn: 465979
<EP INFO>
EP[0]:
begin_pkg_seq: 379506
begin_lsn: 465979
end_pkg_seq: 379506
end_lsn: 465979
<FILE INFO>
backupset directory: /home/dmdba/dmdbms/data/ECARD/bak/DB_ECARD_FULL_20220726_153458_577896
backupset name: DB_ECARD_FULL_20220726_153458_577896
backup data file num: 11
backup piece num: 1
backup huge file num: 0
<backup_piece_list>
$file_seq |$size(KB) |$pos_desc |$content_type
0 |23306 |DB_ECARD_FULL_20220726_153458_577896.bak |DATA
<data_file_list>
$file_seq |$group_id |$group_name |$file_id |$file_path |$mirror_path |$file_len |$copy_num |$size_flag
1 |0 |SYSTEM |0 |/home/dmdba/dmdbms/data/ECARD/SYSTEM.DBF| |192937984 |0 |0
2 |1 |ROLL |0 |/home/dmdba/dmdbms/data/ECARD/ROLL.DBF| |232783872 |0 |0
3 |4 |MAIN |0 |/home/dmdba/dmdbms/data/ECARD/MAIN.DBF| |134217728 |0 |0
4 |5 |DMHR |0 |/home/dmdba/dmdbms/data/ECARD/DMHR.DBF| |134217728 |0 |0
5 |6 |V8_TABLESPACE |0 |/home/dmdba/dmdbms/data/ECARD/V8_TABLESPACE.dbf| |209715200 |0 |0
6 |7 |OPENPLARTFORM_DATA|0 |/home/dmdba/dmdbms/data/ECARD/OPENPLARTFORM_DATA.dbf| |209715200 |0 |0
7 |8 |CHANNEL_DATA |0 |/home/dmdba/dmdbms/data/ECARD/CHANNEL_DATA_01.dbf| |209715200 |0 |0
8 |8 |CHANNEL_DATA |1 |/home/dmdba/dmdbms/data/ECARD/CHANNEL_DATA_02.dbf| |209715200 |0 |0
9 |8 |CHANNEL_DATA |2 |/home/dmdba/dmdbms/data/ECARD/CHANNEL_DATA_03.dbf| |209715200 |0 |0
10 |8 |CHANNEL_DATA |3 |/home/dmdba/dmdbms/data/ECARD/CHANNEL_DATA_04.dbf| |209715200 |0 |0
11 |8 |CHANNEL_DATA |4 |/home/dmdba/dmdbms/data/ECARD/CHANNEL_DATA_05.dbf| |209715200 |0 |0
<arch_file_list>
$file_seq |$dsc_seq |$file_path |$file_len |$begin_seqno |$begin_lsn |$end_seqno |$end_lsn
<huge_file_list>
$group_id |$schema_id|$table_id |$column_id|$file_id |$file_len |$path
<backupset [DEVICE TYPE:DISK, BACKUP_PATH: /home/dmdba/dmdbms/data/ECARD/bak/DB_ECARD_FULL_20220726_153458_577896] info end .>
show backupsets successfully.
time used: 29.842(ms)
RMAN> show backupset '/home/dmdba/dmdbms/data/ECARD/bak/ARCH_LOG_20220726_153739_163491';
show backupset '/home/dmdba/dmdbms/data/ECARD/bak/ARCH_LOG_20220726_153739_163491';
<backupset [DEVICE TYPE:DISK, BACKUP_PATH: /home/dmdba/dmdbms/data/ECARD/bak/ARCH_LOG_20220726_153739_163491] info start ..........>
<DB INFO>
system path: /home/dmdba/dmdbms/data/ECARD
pmnt_magic: 2052031187
src_db_magic: 1379715536
db_magic: 1379715536
dsc node: 1
sys mode: 0
page check: 0
rlog encrypt: 0
rlog encrypt id: 0
external cipher[id/name]: 0/
external hash[id/name]: 0/
length in char: 0
use new hash: 1
page size: 32KB
extent size: 32
case sensitive: 1
log page size: 512B
unicode_flag/charset: 0
data version: 0x7000C
sys version: V8
pseg version: 0x7000B
enable policy: 0
archive flag: 1
blank_pad_mode: 0
crc_check: TRUE
page_enc_slice_size: 4096
char_fix_storage: 0
sql_log_forbid: 0
secur_flag: 2
db_enc_extend_size: 0
page_check_hash_size: 0
dpc_magic: 0
<META INFO>
backupset sig: BA
backupset version: 0x400A
database name: ECARD
backup name: ARCH_LOG_20220726_153739_163491
backupset description:
n_magic: 0x472644A4
parent n_magic: 0xFFFFFFFF
meta file size : 102912
compressed level: 0
encrypt type: 0
parallel num: 1
backup range: archivelog
mpp_timestamp: 1658821058
arch start lsn: 265409
arch end lsn: 465979
backup level: offline
backup type: archive
without log: FALSE
end_lsn: 465979
max_trxid: 439068
base begin_lsn: -1
base end_lsn: -1
base n_magic: 0xFFFFFFFF
base name:
base backupset:
backup time: 2022-07-26 15:37:42
min exec ver: 0x08010227
min dct ver: 4
pkg size: 0x04000000
bak_magic: 0
l_term_id: 0
term_id: 0
c_seqno: 379506
c_lsn: 465979
<EP INFO>
EP[0]:
begin_pkg_seq: 379506
begin_lsn: 465979
end_pkg_seq: 379506
end_lsn: 465979
<FILE INFO>
backupset directory: /home/dmdba/dmdbms/data/ECARD/bak/ARCH_LOG_20220726_153739_163491
backupset name: ARCH_LOG_20220726_153739_163491
backup data file num: 8
backup piece num: 1
backup huge file num: 0
<backup_piece_list>
$file_seq |$size(KB) |$pos_desc |$content_type
0 |88605 |ARCH_LOG_20220726_153739_163491.bak |LOG
<data_file_list>
$file_seq |$group_id |$group_name |$file_id |$file_path |$mirror_path |$file_len |$copy_num |$size_flag
<arch_file_list>
$file_seq |$dsc_seq |$file_path |$file_len |$begin_seqno |$begin_lsn |$end_seqno |$end_lsn
1 |0 |/home/dmdba/dmdbms/arc/ARCHIVE_LOCAL1_0x523CC9D0_EP0_2022-07-20_17-35-31.log|660480 |209462 |265409 |209559 |270417
2 |0 |/home/dmdba/dmdbms/arc/ARCHIVE_LOCAL1_0x523CC9D0_EP0_2022-07-20_17-40-16.log|10240 |209560 |270417 |209565 |270422
3 |0 |/home/dmdba/dmdbms/arc/ARCHIVE_LOCAL1_0x523CC9D0_EP0_2022-07-20_17-40-31.log|8305664 |209566 |270423 |225663 |286806
4 |0 |/home/dmdba/dmdbms/arc/ARCHIVE_LOCAL1_0x523CC9D0_EP0_2022-07-21_07-05-07.log|1788416 |225664 |286807 |227939 |294147
5 |0 |/home/dmdba/dmdbms/arc/ARCHIVE_LOCAL1_0x523CC9D0_EP0_2022-07-21_08-59-37.log|610816 |227940 |294148 |227990 |299262
6 |0 |/home/dmdba/dmdbms/arc/ARCHIVE_LOCAL1_0x523CC9D0_EP0_2022-07-21_09-14-45.log|601600 |227991 |299263 |228032 |304369
7 |0 |/home/dmdba/dmdbms/arc/ARCHIVE_LOCAL1_0x523CC9D0_EP0_2022-07-21_09-16-51.log|568320 |228033 |304370 |228042 |309443
8 |0 |/home/dmdba/dmdbms/arc/ARCHIVE_LOCAL1_0x523CC9D0_EP0_2022-07-21_09-18-23.log|78172672 |228043 |309444 |379506 |465979
<huge_file_list>
$group_id |$schema_id|$table_id |$column_id|$file_id |$file_len |$path
<backupset [DEVICE TYPE:DISK, BACKUP_PATH: /home/dmdba/dmdbms/data/ECARD/bak/ARCH_LOG_20220726_153739_163491] info end .>
show backupsets successfully.
time used: 26.384(ms)
5.启动数据库
[dmdba@dmserver ~]$ DmServiceECARD start
3.3 console工具图形化备份
使用console图形化工具进行备份,备份时需要指定备份存放目录,后台调用dmrman进行备份,数据库需要关闭,开启DMAP服务。
#dfs_ini不要选,集群环境才需要选,否则会报非法的INI配置参数
console->备份还原->新建备份
4.DM数据库恢复
数据库恢复使用console(脱机备份工具)或drman进行恢复。库级、表空间的还原和恢复不支持联机恢复,只支持脱机还原恢复(需要把数据库关闭)。
4.1 通过dmrman进行恢复
4.1.1 表空间的还原和恢复
1.删除TBS1表空间的数据文件
[root@dmserver ECARD]# pwd
/dm8/dmdbms/data/ECARD
[root@dmserver ECARD]# rm -f TBS1*.DBF
2.关闭数据库
SQL> shutdown immediate;
3.查看备份集信息
RMAN> show backupset '/dm8/dmdbms/data/ECARD/bak/TS_TBS1_FULL_20221116_130900_918910';
4.还原表空间文件
RMAN> restore database '/dm8/dmdbms/data/ECARD/dm.ini' tablespace tbs1 from backupset '/dm8/dmdbms/data/ECARD/bak/TS_TBS1_FULL_20221116_130900_918910';
5.恢复表空间
--表空间的恢复系统会自动利用归档恢复到最新状态
RMAN> recover database '/dm8/dmdbms/data/ECARD/dm.ini' tablespace tbs1;
6.启动数据库
[dmdba@dmserver ECARD]$ DmServiceECARD start
Starting DmServiceECARD: [ OK ]
4.1.2 数据库的还原和恢复
1.删除system表空间文件,system表空间的恢复需要采用库级恢复
[root@dmserver ECARD]# pwd
/dm8/dmdbms/data/ECARD
[root@dmserver ECARD]# rm SYSTEM.DBF
2.关闭数据库
SQL> shutdown immediate;
3.查看备份集信息
RMAN> show backupset '/dm8/dmdbms/backup/full/FULLBAK11161343';
4.还原数据库
restore database '/dm8/dmdbms/data/ECARD/dm.ini' from backupset '/dm8/dmdbms/backup/full/FULLBAK11161343';
5.恢复数据库
--可以基于备份集或者归档来恢复
recover database '/dm8/dmdbms/data/ECARD/dm.ini' with archivedir '/dm8/dmdbms/arch'
6.更新数据库魔数db_magic
recover database '/dm8/dmdbms/data/ECARD/dm.ini' update db_magic;
4.1.3 不完全恢复
表误删除(DROP),可以指定归档恢复到删除的前一刻。
recover database '/dm8/data/DMTEST/dm.ini' with archivedir '/dm8/arch' until lsn XX;
recover database '/dm8/data/DMTEST/dm.ini' with archivedir '/dm8/arch' until time XX;
4.2 通过console工具图形化恢复
库级别恢复,恢复类型采用指定归档恢复,添加归档日志目录,恢复完成以后,要更新数据库魔数,否则数据库无法启动。
console->备份还原->通过配置添加搜索目录->获取备份->选择备份->点击还原->根据恢复级别,选择库还原、归档还原、表空间还原->恢复->如果是数据库恢复的话,要点击更新Magic
07.达梦DCA认证课程-DM数据库逻辑导出导入
1.逻辑导出导入概述
dexp 工具可以对本地或者远程数据库进行数据库级、用户级、模式级和表级的逻辑备份。备份的内容非常灵活,可以选择是否备份索引、数据行和权限,是否忽略各种约束(外键约束、非空约束、唯一约束等)。
dimp 逻辑导入工具利用 dexp 工具生成的备份文件对本地或远程的数据库进行联机逻辑还原。dimp 导入是 dexp 导出的相反过程。还原的方式可以灵活选择,如是否忽略对象存在而导致的创建错误、是否导入约束、是否导入索引、导入时是否需要编译、是否生成日志等。
1.1 dexp命令帮助
[dmdba@dmserver ~]$ dexp help
dexp V8
version: 03134283904-20220630-163817-20005
格式: ./dexp KEYWORD=value 或 KEYWORD=(value1,value2,...,valueN)
例程: ./dexp SYSDBA/SYSDBA GRANTS=Y TABLES=(SYSDBA.TAB1,SYSDBA.TAB2,SYSDBA.TAB3)
USERID 必须是命令行中的第一个参数
关键字 说明(默认值)
--------------------------------------------------------------------------------
USERID 用户名/口令 格式:{<username>[/<password>] | /}[@<connect_identifier>][<option>] [<os_auth>]
<connect_identifier> : [<svc_name> | host[:port] | <unixsocket_file>]
<option> : #{<exetend_option>=<value>[,<extend_option>=<value>]...}
--此行外层{}是为了封装参数之用,书写时需要保留
<os_auth> : AS {SYSDBA|SYSSSO|SYSAUDITOR|USERS|AUTO}
FILE 导出文件 (dexp.dmp)
DIRECTORY 导出文件所在目录
FULL 整库导出 (N)
OWNER 以用户方式导出 格式 (user1,user2,...)
SCHEMAS 以模式方式导出 格式 (schema1,schema2,...)
TABLES 以表方式导出 格式 (table1,table2,...)
FUZZY_MATCH TABLES选项是否支持模糊匹配 (N)
QUERY 用于导出表的子集的select 子句
PARALLEL 用于指定导出的过程中所使用的线程数目
TABLE_PARALLEL 用于指定导出的过程中表内的并发线程数目,MPP模式下会转换成单线程
TABLE_POOL 用于指定表的缓冲区个数
EXCLUDE 忽略指定的对象
格式 EXCLUDE=(CONSTRAINTS,INDEXES,ROWS,TRIGGERS,GRANTS) or
EXCLUDE=TABLES:table1,table2 or
EXCLUDE=SCHEMAS:sch1,sch2
INCLUDE 包含指定的对象
格式 INCLUDE=(CONSTRAINTS,INDEXES,ROWS,TRIGGERS,GRANTS) or
INCLUDE=TABLES:table1,table2
CONSTRAINTS 导出约束 (Y)
TABLESPACE 导出对象带有表空间 (N)
GRANTS 导出权限 (Y)
INDEXES 导出索引 (Y)
TRIGGERS 导出触发器 (Y)
ROWS 导出数据行 (Y)
LOG 屏幕输出的日志文件
NOLOGFILE 不使用日志文件(N)
NOLOG 屏幕上不显示日志信息(N)
LOG_WRITE 日志信息实时写入文件: 是(Y),否(N)
DUMMY 交互信息处理: 打印(P), 所有交互都按YES处理(Y),NO(N)
PARFILE 参数文件名
FEEDBACK 每 x 行显示进度 (0)
COMPRESS 导出数据是否压缩 (N)
ENCRYPT 导出数据是否加密 (N)
ENCRYPT_PASSWORD 导出数据的加密密钥
ENCRYPT_NAME 加密算法的名称
FILESIZE 每个转储文件的最大大小
FILENUM 一个模板可以生成的文件数
DROP 导出后删除原表,但不级联删除 (N)
DESCRIBE 导出数据文件的描述信息,记录在数据文件中
COL_DEFAULT_SEPARATE 是否单独导出列默认值 (Y)
HELP 打印帮助信息
1.2 dimp命令帮助
[dmdba@dmserver ~]$ dimp help
dimp V8
version: 03134283904-20220630-163817-20005
格式: ./dimp KEYWORD=value 或 KEYWORD=(value1,value2,...,vlaueN)
例程: ./dimp SYSDBA/SYSDBA IGNORE=Y ROWS=Y FULL=Y
USERID 必须是命令行中的第一个参数
关键字 说明(默认值)
--------------------------------------------------------------------------------
USERID 用户名/口令 格式:{<username>[/<password>] | /}[@<connect_identifier>][<option>] [<os_auth>]
<connect_identifier> : [<svc_name> | host[:port] | <unixsocket_file>]
<option> : #{<exetend_option>=<value>[,<extend_option>=<value>]...}
--此行外层{}是为了封装参数之用,书写时需要保留
<os_auth> : AS {SYSDBA|SYSSSO|SYSAUDITOR|USERS|AUTO}
FILE 导入文件名称 (dexp.dmp)
DIRECTORY 导入文件所在目录
FULL 整库导入 (N)
OWNER 以用户方式导入 格式 (user1,user2,...)
SCHEMAS 以模式方式导入 格式 (schema1,schema2,...)
TABLES 以表名方式导入 格式(table1,table2,...)
PARALLEL 用于指定导入的过程中所使用的线程数目
TABLE_PARALLEL 用于指定导入的过程中每个表所使用的子线程数目,在FAST_LOAD为Y时有效
IGNORE 忽略创建错误 (N)
TABLE_EXISTS_ACTION 需要的导入表在目标库中存在时采取的操作[SKIP | APPEND | TRUNCATE | REPLACE]
FAST_LOAD 是否使用dmfldr来导数据(N)
FLDR_ORDER 使用dmfldr是否需要严格按顺序来导数据(Y)
COMMIT_ROWS 批量提交的行数(5000)
EXCLUDE 忽略指定的对象 格式
格式 EXCLUDE=(CONSTRAINTS,INDEXES,ROWS,TRIGGERS,GRANTS)
GRANTS 导入权限 (Y)
CONSTRAINTS 导入约束 (Y)
INDEXES 导入索引 (Y)
TRIGGERS 导入触发器 (Y)
ROWS 导入数据行 (Y)
LOG 指定日志文件
NOLOGFILE 不使用日志文件(N)
NOLOG 屏幕上不显示日志信息(N)
LOG_WRITE 日志信息实时写入文件(N): 是(Y),否(N)
DUMMY 交互信息处理(P): 打印(P), 所有交互都按YES处理(Y),NO(N)
PARFILE 参数文件名
FEEDBACK 每 x 行显示进度 (0)
COMPILE 编译过程, 程序包和函数... (Y)
INDEXFILE 将表的索引/约束信息写入指定的文件
INDEXFIRST 导入时先建索引(N)
REMAP_SCHEMA 格式(SOURCE_SCHEMA:TARGET_SCHEMA)
将SOURCE_SCHEMA中的数据导入到TARGET_SCHEMA中
ENCRYPT_PASSWORD 数据的加密密钥
ENCRYPT_NAME 加密算法的名称
SHOW/DESCRIBE 打印出指定文件的信息(N)
TASK_THREAD_NUMBER 用于设置dmfldr处理用户数据的线程数目
BUFFER_NODE_SIZE 用于设置dmfldr读入文件缓冲区大小
TASK_SEND_NODE_NUMBER 用于设置dmfldr发送节点个数[16,65535]
LOB_NOT_FAST_LOAD 如果一个表含有大字段,那么不使用dmfldr,因为dmfldr是一行一行提交的
PRIMARY_CONFLICT 主键冲突的处理方式[IGNORE|OVERWRITE|OVERWRITE2],默认报错
TABLE_FIRST 是否先导入表(N):是(Y),否(N)
SHOW_SERVER_INFO 是否打印服务器信息(N):是(Y),否(N)
IGNORE_INIT_PARA 忽略建库参数差异(0): CASE_SENSITIVE(1),LENGTH_IN_CHAR(2)
AUTO_FREE_KEY 导入数据完成后, 是否释放密钥(N):是(Y), 否(N)
REMAP_TABLE 格式(SOURCE_SCHEMA.SOURCE_TABLE:TARGET_TABLE)
将SOURCE_TABLE中的数据导入到TARGET_TABLE中
REMAP_TABLESPACE 格式(SOURCE_TABLESPACE:TARGET_TABLESPACE)
将SOURCE_TABLESPACE表空间映射到TARGET_TABLESPACE表空间中
HELP 打印帮助信息
2.逻辑导出导入使用
2.1 四种级别的导入导出
全库(full=y)
按用户(owner=XXX)
按模式(schemas=XXX)
按表(tables=XX
2.1.1 full级别导出
设置 FULL=Y,导出数据库的所有对象,导出数据库文件和日志文件放在路径/mnt/data/dexp 下
dexp USERID=SYSDBA/SYSDBA FILE=db_str.dmp LOG=db_str.log FULL=Y DIRECTORY=/mnt/data/dexp
设置导出文件方法:
dexp USERID =SYSDBA/SYSDBA FILE=db_str.dmp LOG=db_str.log FULL=Y DIRECTORY=/mnt/data/dexp
等价于
dexp USERID =SYSDBA/SYSDBA FILE=/mnt/data/dexp/db_str.dmp LOG=/mnt/data/dexp/db_str.log FULL=Y
2.1.2 owner级别导出
设置 OWNER=test,导出用户 test 所拥有的对象全部导出。
# 1.Sysdba/dmdba123@localhost:5236 库中创建用户 test:
create tablespace test datafile '/opt/dm8/data/DAMENG/test01.dbf' size 50;
create user test identified by test123456 default tablespace test;
create table test.t (id number);
insert into test.t values(10);
commit;
# 2.执行导出
dexp USERID=SYSDBA/dmdba123 FILE=user_test.dmp LOG=user_test.log OWNER=test DIRECTORY=/home/dmdba/backup
# 3.在目标库创建test用户
disql sysdba/SYSDBA@localhost:5237
SQL> create user test identified by test123456;
# 4.执行导入
dimp USERID=SYSDBA/SYSDBA@localhost:5237 FILE=user_test.dmp LOG=imp_test.log OWNER=test DIRECTORY=/home/dmdba/backup
2.1.3 schemas级别导出
设置 SCHEMAS=USER01,导出模式 USER01 模式下的所有对象。和 owner 的类似
dexp USERID=SYSDBA/SYSDBA FILE=db_str.dmp LOG=db_str.log SCHEMAS=USER01 DIRECTORY=/mnt/data/dexp
2.1.4 tables级别导出
TABLES 方式导出和导入一个或多个指定的表或表分区。导出所有数据行、约束、索引等信息。
设置 TABLES=t1,导出 t1 表的所有数据和信息:
# 1.Sysdba/dmdba123@localhost:5236中模拟业务:
create table test.t1 (id number,name varchar2(10));
insert into test.t1 values(10,'test1');
commit;
# 2.执行导出
dexp USERID=SYSDBA/dmdba123 FILE=tab_t1.dmp LOG=tab_t1.log TABLES=test.t1 DIRECTORY=/home/dmdba/backup
# 3.导入到 sysdba/SYSDBA@localhost:5237
dimp USERID=SYSDBA/SYSDBA@localhost:5237 FILE=tab_t1.dmp LOG=tab_t1_imp.log TABLES=test.t1 DIRECTORY=/home/dmdba/backup
2.2 使用示例
环境说明:
导出库: 环境为 linux,服务器为 192.168.6.110,用户名和密码均为 sysdba/dmdba123。安装时带有
BOOKSHOP 的示例库,端口号 5236。导出全库
导入库: 环境为 linux,服务器为 192.168.6.110,用户名和密码均为 SYSDBA。准备一个空数据库作为导入库,端口号为 5237。
导出数据库的所有对象:
# 导出文件为full.dmp,导出日志为full.log,存放目录为/home/dmdba/backup
dexp sysdba/dmdba123 file=full.dmp log=full.log directory=/home/dmdba/backup full=y
按模式导入:
# 导入sysdba,person,dmhr模式中的数据
dimp sysdba/SYSDBA@localhost:5237 file=full.dmp log=imp.log directory=/home/dmdba/backup schemas=SYSDBA,PERSON,DMHR
全库导入:
dimp sysdba/SYSDBA@localhost:5237 file=full.dmp log=imp.log directory=/home/dmdba/backup full=y
08.达梦DCP认证课程-表管理
1.分区表管理
1.1 分区的方法
达梦数据库 DM 支持对表进行水平分区。对于水平分区,提供以下分区方式:
范围(range) 水平分区:对表中的某些列上值的 范围进行分区,根据某个值的范围,决定将该数据存储在哪个分区上,比如 时间范围。
哈希 (hash ) 水平分区:通过指定分区编号来 均匀分布数据的一种分区类型,通过在 I/O 设备上进行散列分区,使得这些 分区大小基本一致;
列表(list )水平分区:通过指定表中的 某个列的离散值集,来确定应当存储在一起的数据。例如,可以对表上的 status 列的值在(‘A’,‘H’,‘O’)放在一个分区,值在(‘B’,‘I’,‘P’)放在另一个分区,以此类推; 比如地区。
多级分区表:按上述 三种分区方 式 进行任意组合,将表进行多次分区,称为多级分区表。
1.2 创建分区表
1.2.1 创建范围分区表
范围分区是按照 某个列或几个列的值的范围来创建分区,当用户向表中写入数据时,数据库服务器将按照这些列上的值进行判断,将数据写入相应的分区中。
在创建范围分区时,首先要指定分区列,即按照哪些列进行分区,然后为每个分区指定数据范围。范围分区支持 MAXVALUE 范围值的使用,MAXVALUE 相当于一个比任何值都大的值。范围分区非常适用于数据按时间范围组织的表,不同的时间段的数据属于不同的分区。
1.2.1.1 创建普通表的分区表
创建一个范围分区表 callinfo,用来记录用户的 2010 年的电话通讯信息,包括主叫号码、被叫号码、通话时间和时长,并且根据季度进行分区。
创建范围分区表:
--VALUES EQU OR LESS THAN(包含上限)
CREATE TABLE callinfo(
caller CHAR(15),
callee CHAR(15),
time DATETIME,
duration INT
)
PARTITION BY RANGE(time)(
PARTITION p1 VALUES LESS THAN ('2020-04-01'),
PARTITION p2 VALUES LESS THAN ('2020-07-01'),
PARTITION p3 VALUES LESS THAN ('2020-10-01'),
PARTITION p4 VALUES EQU OR LESS THAN ('2020-12-31'));
--VALUES LESS THAN(不包含上限)
CREATE TABLE callinfo2(
caller CHAR(15),
callee CHAR(15),
time DATETIME,
duration INT
)
PARTITION BY RANGE(time)(
PARTITION p1 VALUES LESS THAN ('2020-04-01'),
PARTITION p2 VALUES LESS THAN ('2020-07-01'),
PARTITION p3 VALUES LESS THAN ('2020-10-01'),
PARTITION p4 VALUES LESS THAN ('2020-12-31'),
PARTITION p5 VALUES LESS THAN (maxvalue));
--增加存放超出范围数据的分区
alter table callinfo add partition pn values less than(maxvalue);
通过数据字典查看分区的信息:
--查看表是否为分区表属性:
select table_name,partitioned from dba_tables where table_name='CALLINFO';
行号 TABLE_NAME PARTITIONED
---------- ---------- -----------
1 CALLINFO YES
--查看表的分区类型:
select table_name,partitioning_type,partition_count from dba_part_tables where
table_name='CALLINFO';
行号 TABLE_NAME PARTITIONING_TYPE PARTITION_COUNT
---------- ---------- ----------------- --------------------
1 CALLINFO RANGE 4
--查看表每个分区的最大值:
select table_name,partition_name,HIGH_VALUE from dba_tab_partitions;
行号 TABLE_NAME PARTITION_NAME HIGH_VALUE
---------- ---------- -------------- -----------------------------
1 CALLINFO P4 DATETIME'2020-12-31 00:00:00'
2 CALLINFO P1 DATETIME'2020-04-01 00:00:00'
3 CALLINFO P2 DATETIME'2020-07-01 00:00:00'
4 CALLINFO P3 DATETIME'2020-10-01 00:00:00'
插入数据:
insert into callinfo values('art','add','2020-01-01 10:00:00',10);
insert into callinfo values('art','add','2020-02-01 11:00:00',3);
insert into callinfo values('art','add','2020-04-01 00:00:00',5);
insert into callinfo values('srt','bdd','2020-07-01 11:00:00',5);
insert into callinfo values('brt','ddd','2020-12-31 11:00:00',5);
insert into callinfo values('brt','ddd','2020-12-31 11:00:00',5);
insert into callinfo values('brt','ddd','2020-12-31 00:00:00',5);
insert into callinfo values('crt','ddd','2021-1-1 00:00:00',5);
insert into callinfo values('crt','ddd','2021-1-1 00:00:00',5);
查看数据:
select * from callinfo partition(p1);
select * from callinfo partition(p2);
select * from callinfo partition(p3);
select * from callinfo partition(p4);
创建分区表,每个分区指定表空间:
--创建表空间:
create tablespace test1 datafile 'test101.dbf' size 64;
create tablespace test2 datafile 'test201.dbf' size 64;
create tablespace test3 datafile 'test301.dbf' size 64;
create tablespace test4 datafile 'test401.dbf' size 64;
--创建分区表:
create table callinfo3 (
caller CHAR(15),
callee CHAR(15),
time DATETIME,
duration INT
)
PARTITION BY RANGE(time)(
PARTITION p1 VALUES LESS THAN ('2020-04-01') tablespace test1,
PARTITION p2 VALUES LESS THAN ('2020-07-01') tablespace test2,
PARTITION p3 VALUES LESS THAN ('2020-10-01') tablespace test3,
PARTITION p4 VALUES EQU OR LESS THAN (maxvalue) tablespace test4);
--查看分区所在表空间:
select table_name,partition_name,HIGH_VALUE,tablespace_name from dba_tab_partitions where
table_name='CALLINFO3';
行号 TABLE_NAME PARTITION_NAME HIGH_VALUE TABLESPACE_NAME
---------- ---------- -------------- ----------------------------- ---------------
1 CALLINFO3 P4 MAXVALUE TEST4
2 CALLINFO3 P1 DATETIME'2020-04-01 00:00:00' TEST1
3 CALLINFO3 P2 DATETIME'2020-07-01 00:00:00' TEST2
4 CALLINFO3 P3 DATETIME'2020-10-01 00:00:00' TEST3
1.2.1.2 创建堆表的分区表
所有子分区必须在同一个表空间
create table callinfo4 (
caller CHAR(15),
callee CHAR(15),
time DATETIME,
duration INT
)
PARTITION BY RANGE(time)(
PARTITION p1 VALUES LESS THAN ('2020-04-01'),
PARTITION p2 VALUES LESS THAN ('2020-07-01'),
PARTITION p3 VALUES LESS THAN ('2020-10-01'),
PARTITION p4 VALUES EQU OR LESS THAN (maxvalue)) storage(on test1,nobranch);
1.2.2 创建间隔分区表
属于范围分区表的扩展,当插入的数据超出分区范围后,按照指定的间隔规则, 自动创建分区,实现分区自动管理。不允许手动添加分区。不支持 NUMTODSINTERVAL(1,‘day’)。
间隔分区关键字:
numtoyminterval(年、月)
numtodsinterval(日、小时、分钟、秒)
创建以月为单位的间隔分区:
CREATE TABLE interval_sales
( prod_id NUMBER(6)
, cust_id NUMBER
, time_id DATE
, amount_sold NUMBER(10,2)
)
PARTITION BY RANGE (time_id)
INTERVAL(NUMTOYMINTERVAL(1, 'MONTH'))
( PARTITION p0 VALUES LESS THAN ('2008-1-1'),
PARTITION p1 VALUES LESS THAN ('2009-1-1'),
PARTITION p2 VALUES LESS THAN ('2009-7-1'),
PARTITION p3 VALUES LESS THAN ('2010-1-1') );
查看分区信息:
select partition_name,SUBPARTITION_COUNT,HIGH_VALUE from dba_tab_partitions where table_name like '%SALES%';
插入超出范围数据:
insert into interval_sales values(1,1,'2010-2-1',2000);
Commit;
再次查看分区信息:
select partition_name,SUBPARTITION_COUNT,HIGH_VALUE from dba_tab_partitions where table_name like '%SALES%';
创建以年为间隔的分区:
CREATE TABLE interval_sales_new
( prod_id NUMBER(6)
, cust_id NUMBER
, time_id DATE
, amount_sold NUMBER(10,2)
)
PARTITION BY RANGE (time_id)
INTERVAL(NUMTOYMINTERVAL(1, 'YEAR'))
( PARTITION p0 VALUES LESS THAN ('2008-1-1'),
PARTITION p1 VALUES LESS THAN ('2009-1-1'),
PARTITION p2 VALUES LESS THAN ('2010-1-1'),
PARTITION p3 VALUES LESS THAN ('2011-1-1') );
1.2.3 创建list分区表
范围分区是按照某个列上的数据范围进行分区的,如果某个列上的数据无法通过划分范围的方法进行分区,并且该列上的数据是相对固定的一些值,可以考虑使用 LIST 分区。
一般来说,对于 数字型或者日期型的数据,适合采用 范围分区的方法;而对于字符型数据,取值比较固定的,则适合于采用 LIST 分区的方法。
例如,创建一个产品销售记录表 sales,记录产品的销量情况。由于产品只在几个 固定的城市销售,所以可以按照销售城市对该表进行分区。
创建list分区表:
--创建list分区表
CREATE TABLE sales(
sales_id INT,
saleman CHAR(20),
saledate DATETIME,
city CHAR(10)
)
PARTITION BY LIST(city)
(
PARTITION p1 VALUES ('北京', '天津'),
PARTITION p2 VALUES ('上海', '南京', '杭州'),
PARTITION p3 VALUES ('武汉', '长沙'),
PARTITION p4 VALUES ('广州', '深圳')
);
--插入数据
insert into sales VALUES(4,'CCCCCC','2022-03-14','西安');
--增加存放超出列表数据的分区
alter table sales add partition pn values(default);
--通过指定 default 来存放超出列表的数据
CREATE TABLE sales1(
sales_id INT,
saleman CHAR(20),
saledate DATETIME,
city CHAR(10)
)
PARTITION BY LIST(city)
(
PARTITION p1 VALUES ('北京', '天津'),
PARTITION p2 VALUES ('上海', '南京', '杭州'),
PARTITION p3 VALUES ('武汉', '长沙'),
PARTITION p4 VALUES ('广州', '深圳'),
PARTITION p5 VALUES (default)
);
1.2.4 创建hash分区表
在很多情况下,用户无法预测某个列上的数据变化范围,因而无法实现创建固定数量的范围分区或 LIST 分区。
在这种情况下,DM 哈希分区提供了一种在 指定数量的分区中均等地划分数据的方法,基于 分区键的散列值将行映射到分区中。当用户向表中写入数据时,数据库服务器将根据一个哈希函数对数据进行计算,把数据均匀地分布在各个分区中。在哈希分区中,用户无法预测数据将被写入哪个分区中。
现在重新考虑产品销售表的例子。如果 销售城市不是相对固定的,而是遍布全国各地,这时很难对表进行 LIST 分区。如果为该表进行哈希分区,可以很好地解决这个问题。
CREATE TABLE sales01(
sales_id INT,
saleman CHAR(20),
saledate DATETIME,
city CHAR(10)
)
PARTITION BY HASH(city)(
PARTITION p1,
PARTITION p2,
PARTITION p3,
PARTITION p4
);
--如果不需指定分区表名,可以通过指定哈希分区个数来建立哈希分区表。
CREATE TABLE sales02(
sales_id INT,
saleman CHAR(20),
saledate DATETIME,
city CHAR(10)
)
PARTITION BY HASH(city)
PARTITIONS 4 STORE IN (test1, test2, test3, test4);
**说明:**PARTITIONS 后的数字表示哈希分区的分区数,STORE IN 子句中指定了哈希分区依次使用的表空间。使用这种方式建立的哈希分区表分区名是匿名的,DM 统一使用DMHASHPART+分区号(从 0 开始)作为分区名。
1.2.5 创建组合分区表
在很多情况下,经过一次分区并不能精确地对数据进分类,这时需要多级分区表。
例如,创建一个产品销售记录表 sales,记录产品的销量情况。由于产品需要 按地点和销售时间进行统计,则可以对该表进行 LIST-RANGE 分区。
创建组合分区:
--创建list-rang组合分区
CREATE TABLE SALES03(SALES_ID INT,SALEMAN CHAR(20),SALEDATE DATETIME,CITY CHAR(10))
PARTITION BY LIST(CITY) --主分区
SUBPARTITION BY RANGE(SALEDATE) --子分区
SUBPARTITION TEMPLATE( --子分区模板
SUBPARTITION P11 VALUES LESS THAN ('2012-04-01'),
SUBPARTITION P12 VALUES LESS THAN ('2012-07-01'),
SUBPARTITION P13 VALUES LESS THAN ('2012-10-01'),
SUBPARTITION P14 VALUES EQU OR LESS THAN (MAXVALUE))
(PARTITION P1 VALUES ('北京', '天津')
(SUBPARTITION P11_1 VALUES LESS THAN ('2012-10-01'),
SUBPARTITION P11_2 VALUES EQU OR LESS THAN (MAXVALUE)),
PARTITION P2 VALUES ('上海', '南京', '杭州'),
PARTITION P3 VALUES (DEFAULT));
--插入数据
insert into SALES03 values(1,'AAA','2012-05-01','北京');
insert into SALES03 values(1,'BBB','2012-05-01','武汉');
1.3 分区维护
1.3.1 增加分区
ALTER TABLE callinfo ADD PARTITION p5 VALUES LESS THAN ('2021-4-1');
1.3.2 删除分区
ALTER TABLE callinfo DROP PARTITION p1;
1.3.3 合并分区
要想将两个范围分区的内容融合到一个分区,就要使用 ALTER TABLE MERGE PARTITION语句。
ALTER TABLE callinfo MERGE PARTITIONS p3, p4 into partition p3_4;
1.3.4 拆分分区
ALTER TABLE 语句的 SPLIT PARTITION 子句被用于将一分区中的内容重新划分成两个新的分区。当一个分区变得太大以至于要用很长时间才能完成备份、恢复或维护操作时,就应考虑做分割分区的工作,还可以用 SPLIT PARTITION 子句来分重新划分 I/O 负载。
--拆分分区会导致数据的重组和分区索引的重建
ALTER TABLE callinfo SPLIT PARTITION p3_4 AT ('2020-9-30') INTO (PARTITION p3, PARTITION p4);
1.3.5 交换分区
CREATE TABLE callinfo_2020Q2(
caller CHAR(15),
callee CHAR(15),
time DATETIME,
duration INT
);
ALTER TABLE callinfo EXCHANGE PARTITION p2 WITH TABLE callinfo_2020Q2;
2.临时表管理
临时表 ON COMMIT 关键词指定表中的数据是事务级还是或会话级的,默认情况下是事务级的。
1.on commit delete rows:指定临时表是事务级的,每次事务提交或回滚之后,表中所有数据都被删除;
2.on commit preserve rows:指定临时表是会话级的,会话结束时才清空表,并释放临时B树。
2.1 创建事务级临时表
创建事务级临时表:
--创建临时表
CREATE GLOBAL TEMPORARY TABLE TMP_EMP(
EMPNO INT PRIMARY KEY,
ENAME VARCHAR(15) NOT NULL,
JOB VARCHAR(10))
ON COMMIT DELETE ROWS;
--插入数据
insert into tmp_emp values(1,'LILY','DBA');
insert into tmp_emp values(2,'TEST','DBA');
--未提交查询
select * from tmp_emp;
行号 EMPNO ENAME JOB
---------- ----------- ----- ---
1 1 LILY DBA
2 2 test DBA
--提交后查询
commit;
select * from tmp_emp;
未选定行
查询临时表:
select t.TABLE_NAME, t.TABLESPACE_NAME, t.DURATION from USER_TABLES t where
t.TEMPORARY='Y';
2.2 创建会话级临时表
创建会话级临时表:
--创建临时表
CREATE GLOBAL TEMPORARY TABLE TMP_EMP2(
EMPNO INT PRIMARY KEY,
ENAME VARCHAR(15) NOT NULL,
JOB VARCHAR(10))
ON COMMIT PRESERVE ROWS;
--插入数据
insert into tmp_emp2 values(1,'LILY','DBA');
insert into tmp_emp2 values(2,'TEST','DBA');
--未提交查询
select * from tmp_emp2;
行号 EMPNO ENAME JOB
---------- ----------- ----- ---
1 1 LILY DBA
2 2 TEST DBA
--提交后查询
commit;
select * from tmp_emp2;
行号 EMPNO ENAME JOB
---------- ----------- ----- ---
1 1 LILY DBA
2 2 TEST DBA
查询临时表:
select t.TABLE_NAME, t.TABLESPACE_NAME, t.DURATION from USER_TABLES t where
t.TEMPORARY='Y';
3.外部表
3.1 外部表特点
外部表不能存在大字段列
外部表不能为临时表,不能建立分区
外部表只读,不存在表锁,不允许dml操作,不允许truncate操作
3.2 外部表创建
3.2.1 通过控制文件创建
实验1: 指定控制文件创建外部表,新版本需要创建directory
#1.编写数据文件,/dm8/data/ext_dept1.txt
101|总经理办|1001|1
102|行政部|1002|1
103|开发部|1003|1
104|市场部|1004|1
105|技术支持部|1005|1
201|总经理办|2001|2
202|行政部|2002|2
204|市场部|2004|2
301|总经理办|3001|3
302|行政部|3002|3
303|开发部|3003|3
304|市场部|3004|3
305|技术支持部|3005|3
#2.编写控制文件,/dm8/data/ext_dept1.ctl
options
(character_code='UTF-8')
LOAD DATA
INFILE '/dm8/data/ext_dept1.txt'INTO TABLE EXT_DEPT1
FIELDS '|'
#3.创建外部表,并加载数据,from省略datafile关键字表示通过控制文件
CREATE EXTERNAL TABLE EXT_DEPT1 (
"DEPARTMENT_ID" INT,
"DEPARTMENT_NAME" VARCHAR(30),
"MANAGER_ID" INT,
"LOCATION_ID" INT
) FROM '/dm8/data/ext_dept1.ctl';
#4.查询外部表数据
select * from EXT_DEPT1;
3.2.2 通过数据文件创建
实验2: 指定数据文件创建外部表
#1.编写数据文件,/dm8/data/ext_dept2.txt
101|总经理办|1001|1
102|行政部|1002|1
103|开发部|1003|1
104|市场部|1004|1
105|技术支持部|1005|1
201|总经理办|2001|2
202|行政部|2002|2
204|市场部|2004|2
301|总经理办|3001|3
302|行政部|3002|3
303|开发部|3003|3
304|市场部|3004|3
305|技术支持部|3005|3
#2.创建外部表并加载数据
CREATE EXTERNAL TABLE EXT_DEPT2 (
"DEPARTMENT_ID" INT,
"DEPARTMENT_NAME" VARCHAR(30),
"MANAGER_ID" INT,
"LOCATION_ID" INT
) from datafile '/dm8/data/ext_dept2.txt' parms(fields delimited by '|',character_code 'UTF-8');
#4.查询外部表数据
select * from EXT_DEPT2;
09.达梦DCP认证课程-统计信息和索引管理
1.统计信息
统计信息是存储在数据字典中的,用于描述 数据是如何在数据库中存储的,且从多个维度描述了数据库里对象的详细信息。统计信息是 优化器的代价计算的依据,可以帮助优化器较精确地估算成本,对执行计划的选择起着至关重要的作用。
dm收集统计信息的三种方法:
使用dbms_stats包收集
使用stat on语句收集
使用sp_stat函数收集
--dbms_stats 支持对模式下对象、单个表、单个索引收集统计信息,指定采样率
dbms_stats.gather_table_stats('DMTEST','T_TESTTAB',ESTIMATE_PERCENT=>100);
--查询sp_stat相关的函数
select name from v$ifun t where name like 'SP%_STAT%_INIT';
--stat 语句支持对表、索引、列收集统计信息
stat 100 on dmtest.t_testtab(userid);
1.1 收集统计信息
1.1.1 收集数据库的统计信息
CALL SP_DB_STAT_INIT ();
1.1.2 收集模式的统计信息
DBMS_STATS.GATHER_SCHEMA_STATS('模式名',100,TRUE,'FOR ALL COLUMNS SIZE AUTO');
1.1.3 收集表的统计信息
CALL SP_TAB_STAT_INIT ('模式名', '表名');
DBMS_STATS.GATHER_TABLE_STATS('模式名','表名',null,100,TRUE,'FOR ALL COLUMNS SIZE AUTO');
示例:
--收集表的统计信息,指定采样率为100%
dbms_stats.gather_table_stats('DMTEST','T_TESTTAB',ESTIMATE_PERCENT=>100);
1.1.4 收集列的统计信息
1.1.4.1 收集所有列
--对某个表上所有的列生成统计信息
CALL SP_TAB_COL_STAT_INIT('模式名','表名')
--对某个表上所有的列,按照指定的采样率生成统计信息
CALL SP_STAT_ON_TABLE_COLS ('模式名','表名','采样率');
--兼容oracle语法
DBMS_STATS.GATHER_TABLE_STATS('模式名','表名',null,100,TRUE,'FOR ALL COLUMNS SIZE AUTO');
1.1.4.2 收集指定列
STAT <统计信息采样百分比> ON [<模式名>.]<表名>(<列名>);
CALL SP_COL_STAT_INIT ('模式名', '表名', '列名');
CALL SP_COL_STAT_INIT_EX(USER,'表名','列名',100);
示例:
STAT 100 ON TEST(A);
1.1.5 收集索引的统计信息
--收集某张表的所有索引的统计信息
CALL SP_TAB_INDEX_STAT_INIT('模式名', '表名');
--对指定的索引生成统计信息
CALL SP_INDEX_STAT_INIT('模式名', '索引名');
CALL SP_INDEX_STAT_INIT(USER,'索引名');
--兼容oracle语法
DBMS_STATS.GATHER_INDEX_STATS('模式名','索引名');
1.1.6 自动收集统计信息
1.开启AUTO_STAT_OBJ,时间SP_CREATE_AUTO_STAT_TRIGGER
2.创建定时作业调用SP_DB_STAT_INT。
1.2 删除统计信息
DBMS_STATS.DELETE_TABLE_STATS
DBMS_STATS.DELETE_SCHEMA_STATS
DBMS_STATS.DELETE_INDEX_STATS
DBMS_STATS.DELETE_COLUMN_STATS('SYSDBA','T','NAME');
1.3 查看统计信息
通过dbms_stats包查询:
DBMS_STATS.TABLE_STATS_SHOW
DBMS_STATS.INDEX_STATS_SHOW
DBMS_STATS.COLUMN_STATS_SHOW
通过视图查询:
select * from SYSSTATS;
select * from USER_TAB_STATISTICS;
--从导出的统计信息表查询,stat$为前缀,T_STATTABLE为存放导出统计信息时创建的表
select * from "STAT$_T_STATTABLE";
示例:
dbms_stats.table_stats_show('DMTEST','T_TESTTAB');
dbms_stats.column_stats_show('DMTEST','T_TESTTAB','USERID');
1.4 导出导入统计信息
创建统计信息表:
--创建后,系统会增加一个stat$_T_STATTABLE表
dbms_stats.CREATE_STAT_TABLE('DMTEST','T_STATTABLE','TBS');
导出统计信息:
--statid为标记,可选
dbms_stats.EXPORT_TABLE_stats('DMTEST','T_TESTTAB',
STATTAB=>'T_STATTABLE', statid=>'TEST01', statown=>'DMTEST');
查看导出的统计信息:
select * from stat$_T_STATTABLE;
1.5 直方图
1.5.1 使用场景
优化器会默认认为目标列的数据在其最小值(LOW_VALUE)和最大值(HIGH_VALUE)之间是 均匀分布的,并且会按照这个均匀分布原则来计算对目标列施加 WHERE 查询条件后的可选择率以及结果集的 Cardinality,进而据此来计算成本值并选择执行计划。
但是,目标列的数据是均匀分布这个原则并不总是正确的,在实际的生产系统中,有很多表的列的数据分布是不均匀的,甚至是极度倾斜、分布极度不均衡的。所以,此时 应该收集列的直方图。
直方图是一种列的特殊的统计信息,主要用来描述列上的数据分布情况。可以通过 sysstats 查看最大值和最小值:
SQL> desc sysstats;
行号 NAME TYPE$ NULLABLE
---------- ----------------- -------------- --------
1 ID INTEGER N
2 COLID SMALLINT N
3 T_FLAG CHAR(1) N
4 T_TOTAL BIGINT N
5 N_SMAPLE BIGINT N
6 N_DISTINCT BIGINT N
7 N_NULL BIGINT N
8 V_MIN VARBINARY(255) Y
9 V_MAX VARBINARY(255) Y
10 BLEVEL TINYINT Y
11 N_LEAF_PAGES BIGINT Y
12 N_LEAF_USED_PAGES BIGINT Y
13 CLUSTER_FACTOR INTEGER Y
14 N_BUCKETS SMALLINT Y
15 DATA BLOB Y
16 COL_AVG_LEN INTEGER Y
17 LAST_GATHERED DATETIME(6) Y
18 INFO1 VARBINARY(255) Y
19 INFO2 VARBINARY(255) Y
19 rows got
1.5.2 直方图分类
1.5.2.1 频率直方图
根据列的值来规划桶数, 有几个不同的值 , 那么就会有几个桶 。每个桶中记录访问的频率。达梦默认的情
况下为频率直方图。频率直方图收集的信息更准确。
验证默认为频率直方图:
1.创建表
drop table t1 purge;
create table t1 as select rownum no ,name from sysobjects where rownum<=2000;
select count (distinct no) from t1;
行号 COUNT(DISTINCTNO)
---------- -----------------
1 1876
2.收集 size auto的直方图统计信息
DBMS_STATS.GATHER_TABLE_STATS('JT','T1',null,100,TRUE,'FOR ALL COLUMNS size auto');
3.查看统计信息
SQL> DBMS_STATS.COLUMN_STATS_SHOW('JT','T1','NO');
行号 NUM_DISTINCT LOW_VALUE HIGH_VALUE NUM_NULLS NUM_BUCKETS SAMPLE_SIZE HISTOGRAM
---------- -------------------- --------- ---------- -------------------- ----------- -------------------- ---------
1 1876 1 1876 0 1876 1876 FREQUENCY
--查看第二个结果集
SQL> more
1.5.2.2 高度平衡直方图
当 distinct 的值超出桶数时为高度平衡的直方图, 将大量的数据分布到少数的桶中。每个桶的 Endpooint Number 相差越大,那么代表存放的越多。当收集直方图统计信息时,指定的method_opt 为 size auto 时,桶数可以足够多, 取决于有多少个 distinct 值,当手动指定size 值时,最多可以手动指定254。
高度平衡直方图,CBO会人为每个区间中的数据都是近似均匀分布的,实际上数据可能分布不均。
验证手工可以指定的最多桶数:
1.查询t1表数据分布
select count(distinct no) from t1;
行号 COUNT(DISTINCTNO)
---------- -----------------
1 1876
2.收集统计信息
DBMS_STATS.GATHER_TABLE_STATS('JT','T1',null,100,TRUE,'FOR ALL COLUMNS size 254');
3.查看直方图统计信息
SQL> DBMS_STATS.COLUMN_STATS_SHOW('JT','T1','NO');
行号 NUM_DISTINCT LOW_VALUE HIGH_VALUE NUM_NULLS NUM_BUCKETS SAMPLE_SIZE HISTOGRAM
---------- -------------------- --------- ---------- -------------------- ----------- -------------------- ---------------
1 1876 1 1876 0 251 1876 HEIGHT BALANCED
尝试收集 255个桶的直方图统计信息报错:
DBMS_STATS.GATHER_TABLE_STATS('JT','T1',null,100,TRUE,'FOR ALL COLUMNS size 255');
不设置直方图的方式收集统计信息:
DBMS_STATS.GATHER_TABLE_STATS('SYSDBA','T',null,100,TRUE,'FOR ALL COLUMNS size 1');
DBMS_STATS.COLUMN_STATS_SHOW('JT','T1','NO');
2.索引管理
DM8 提供了几种最常见类型的索引,对不同场景有不同的功能,它们是:
聚集索引: 每一个普通表有且只有一个聚集索引,也叫聚簇索引;
唯一索引:索引数据根据索引键唯一;
函数索引:包含函数/表达式的预先计算的值;
位图索引: 对低基数的列创建位图索引;
位图连接索引: 针对两个或者多个表连接的位图索引,主要用于数据仓库中;
全文索引:在表的文本列上建的索引;
说明:一级索引指聚簇索引,二级索引指B*tree索引,达梦的表是索引组织表,聚簇索引就是表
2.1 创建普通索引
普通索引:二级B*tree索引
--未创建索引走全表扫
explain select * from T_TESTTAB t where userid = 1;
--创建索引
create index ix_testtab_userid ON T_TESTTAB(userid) TABLESPACE TBSIDX online;
--查看执行计划,创建索引后,执行计划走二级索引定位查询
explain select * from T_TESTTAB t where userid = 1;
--更新数据,造成数据倾斜
update T_TESTTAB set userid=1 where userid < 90000;
commit;
--此时执行计划走索引定位
explain select * from T_TESTTAB t where userid = 1;
--收集列的统计信息
stat 100 on dmtest.t_testtab(userid);
--查询执行计划,走全表扫
explain select * from T_TESTTAB t where userid = 1;
说明:达梦创建索引未加online时,表上有insert事务未提交时,会产生等待,创建索引的ddl语句等待10s后会超时,加上online时会一直等待,事务提交后索引创建成功。
2.2 创建聚簇索引
--dm聚簇索引不能加online
create CLUSTER index ix_testtab_userid ON T_TESTTAB(userid);
创建主键时是否指定为聚簇索引键由参数pk_with_cluster 指定。1 表示创建主键即为表的聚簇索引键。
SQL> select name,value from v$parameter where name='PK_WITH_CLUSTER';
行号 NAME VALUE
---------- --------------- -----
1 PK_WITH_CLUSTER 0
2.3 创建唯一索引
--创建的列上要唯一才可以创建唯一索引
create UNIQUE index ix_TESTTAB_username ON T_TESTTAB (username);
2.4 创建位图索引
如果表上创建了聚簇索引,则不能在创建位图索引。位图用于列的值分布少,用于OLAP系统,查询较多,更新较少的情况。有位图索引的表,不适合经常更新。
create BITMAP index ix_testtab_optype ON T_TESTTAB(optype) TABLESPACE TBSIDX;
2.5 创建函数索引
create index ix_TESTTAB_funusername ON T_TESTTAB (upper(username));
2.6 创建分区索引
针对分区表有全局索引和局部索引,DM中分区表创建索引,默认创建的是局部索引,指定全局关键字global则为创建全局索引。oracle的索引默认为global。
分区表上创建local类型的索引:
--创建本地索引,索引数据存储在各个分区上
create index ix_PARTRANGETAB_username ON T_PARTRANGETAB(username);
create index ix_PARTRANGETAB_logtime ON T_PARTRANGETAB(logtime);
--查询索引信息
select t.INDEX_NAME, t.TABLE_NAME, t.INDEX_TYPE, t.PARTITIONED, t.GENERATED
from USER_INDEXES t
where t.TABLE_NAME='T_PARTRANGETAB' and t.INDEX_TYPE = 'NORMAL';
--查询索引分区信息
select * from USER_IND_PARTITIONS t where t.INDEX_NAME=upper('ix_PARTRANGETAB_username');
--查询索引段信息
select * from USER_SEGMENTS t where t.SEGMENT_NAME=upper('ix_PARTRANGETAB_username');
创建全局索引:
create index ix_PARTRANGETAB_AREAID ON T_PARTRANGETAB(AREAID) global;
--查询索引信息
select t.INDEX_NAME, t.TABLE_NAME, t.INDEX_TYPE, t.PARTITIONED, t.GENERATED
from USER_INDEXES t
where t.TABLE_NAME like upper('T_PARTRANGE%')
and t.INDEX_TYPE = 'NORMAL';
--查询索引分区信息
select * from USER_IND_PARTITIONS t where t.INDEX_NAME like upper('ix_PARTRANGE%_username');
--查询索引段信息
select * from USER_SEGMENTS t where t.SEGMENT_NAME like 'IX_PARTRANGE%';
3.维护索引
有效性/无效: 无效索引,DML操作不会维护索引数据,执行计划不会选择走该索引)无效的索引,重建后将有效。
可见性/不可见: 不可见索引,DML操作仍然会维护索引数据,但执行计划不会选择走该索引,不想让执行计划走这个索引,可以设置为不可见,不用删除索引。
重建索引:
SP_REBUILD_INDEX();
alter index ind_name rebuild;
删除索引:
drop index ind_name;
索引不可用:
alter index ix_TESTTAB_username UNUSABLE;
alter index ix_TESTTAB_username REBUILD ONLINE;
索引不可见:
alter index ix_TESTTAB_username INVISIBLE;
alter index ix_TESTTAB_username VISIBLE;
索引监控:
alter index ix_TESTTAB_username MONITORING USAGE;
alter index ix_TESTTAB_username NOMONITORING USAGE;
select * from SYS."V$OBJECT_USAGE";
索引查询:
select * from user_indexes;
select index_name,table_name,status,visibility from user_indexes;
select * from sys.user_ind_columns;
4.全文索引
全文检索技术是智能信息管理的关键技术之一,其主要目的就是实现对大容量的非结构化数据的快速查找。DM 实现了全文检索功能,并将其作为 DM 服务器的一个较独立的组件,提供更加准确的全文检索功能,较好地解决了模糊查询方式带来的问题。
4.1 全文检索概述
DM 全文检索根据已有词库建立全文索引,文本查询完全在索引上进行。全文索引为在字符串数据中进行复杂的词搜索提供了有效支持。用户可以在指定表的文本列上创建和删除全文索引。创建全文索引后全文索引未插入任何索引信息。当用户填充全文索引时,系统才将定义了全文索引的文本列的内容进行分词,并根据分词结果填充索引。用户可以在进行全文索引填充的列上使用 CONTAINS 谓词进行全文检索。
DM 全文索引改进了原有的分词算法,为全文检索提供了更好的基础。在创建全文索引成功后,假设索引名为 INDEX_NAME,则系统会自动产生如下相关的辅助表(I表,P 表,N 表,D 表):
CTI$INDEX_NAME$I:用于保存分词结果,记录词的基本信息,通过该信息可以快速地定位到该词的基表记录
CTI$INDEX_NAME$P:保存基表发生的增量数据变化,用于全文索引的增量填充
CTI$INDEX_NAME$N:用于保存原表记录 rowid 和新词条记录的 docid 的映射关系
CTI$INDEX_NAME$D: 保存所有被删除的 docid,被删除的 docid 将不能通过全文索引查询
定义全文索引时可以指定分词参数 lexer,DM 包含 5 种分词参数:
CHINESE_LEXER,中文最少分词;
CHINESE_VGRAM_LEXER,机械双字分词;
CHINESE_FP_LEXER,中文最多分词;
ENGLISH_LEXER,英文分词;
DEFAULT_LEXER,默认分词,为中文最少分词
4.2 创建全文索引
创建全文索引需要create context index权限,索引信息会保存在ctisys模式下的syscontextindexes系统表中。
创建全文索引: 手动填充
1.创建全文索引
--增加一个文本类型的列,并对这个列填充部分数据
alter table T_TESTTAB ADD COLUMN testinfo text;
--创建全文索引,不指定sync子句,后期需要手工填充
create CONTEXT index cti_TESTTAB_testinfo ON t_testtab(testinfo);
--使用contains关键字进行检索,没有填充查询不到数据
select * from t_testtab t where CONTAINS(testinfo, '链表');
2.查询辅助表数据
select * from "CTI$CTI_TESTTAB_TESTINFO$D";
select * from "CTI$CTI_TESTTAB_TESTINFO$I";
select * from "CTI$CTI_TESTTAB_TESTINFO$P";
select * from "CTI$CTI_TESTTAB_TESTINFO$N";
3.手动填充数据
--完全填充
alter CONTEXT index cti_TESTTAB_testinfo ON t_testtab REBUILD;
--增量填充
alter CONTEXT index cti_TESTTAB_testinfo ON t_testtab INCREMENT;
创建全文索引: 自动填充
创建全文索引时,指定SYNC TRANSACTION子句填充,后期事务提交后自动填充
create table t_contexttab as select * from T_TESTTAB;
--分词关键字可以省略,创建后无需手动填充
create CONTEXT index cti_contexttab_testinfo ON t_contexttab(testinfo) LEXER default_lexer SYNC TRANSACTION;
通过全文索引查询: 通过contains关键字
select * from t_contexttab t where CONTAINS(testinfo, '链表');
select * from t_contexttab t where CONTAINS(testinfo, '堆表' or 'ROWID');
select * from t_contexttab t where CONTAINS(testinfo, '堆表' and 'ROWID');
4.3 全文索引的删除
--删除后使用contains 子句查询报错
drop CONTEXT index cti_contexttab_testinfo ON t_contexttab;
4.4 全文索引相关视图
--记录全文索引所需要的词库信息
select * from SYSCONTEXTLIBS;
select * from SYSCONTEXTINDEXES;
10.达梦DCP认证课程-序列同义词物化视图
1.序列
1.1 创建序列
示例1:
create SEQUENCE seq_test
START WITH 1 INCREMENT BY 1 MAXVALUE 9999999999999999 MINVALUE 1 NOCYCLE;
示例2:
create SEQUENCE seq1 START WITH 20 INCREMENT by 1 MAXVALUE 200 MINVALUE 1 CACHE 20;
alter SEQUENCE SEQ1 INCREMENT by 100 NOCYCLE;
1.2 序列查询
select seq_test.currval;
select seq_test.nextval;
select * from USER_SEQUENCES;
1.3 删除序列
drop SEQUENCE seq1;
2.同义词
同义词包含普通同义词和公共同义词。
创建同义词:
1.当普通同义词名称和公共同义词名称相同时,默认用户访问的是当前模式下的同义词。
--创建同义词
create SYNONYM emp FOR t_testtab;
--创建公共同义词
create PUBLIC SYNONYM emp FOR dmhr.employee;
select * from emp;
2.换个用户查询,默认查询的是公共同义词
select * from emp;
select * from dmtest.emp;
删除同义词:
--删除普通同义词
drop SYNONYM emp;
--删除公共同义词
drop PUBLIC SYNONYM emp
3.物化视图
3.1 物化视图的语法
3.1.1 创建物化视图
创建语法:
create materialized view [view_name]
build [immediate|deferred] --创建方式,默认为immediate
refresh [fast|complete|force] --刷新方式,默认为force
[
on [commit|demand] | --刷新时间,默认为demand
start with (start_time) --刷新开始时间
next (next_time) --刷新间隔时间
with [primary key|rowid] --基于基表的主键或rowid创建,默认为primary key
]
[enable|disable] query rewrite --是否启用查询重写,默认为disable,dm不支持查询重写
as --关键字
{创建物化视图用的查询语句} --基本选取数据的select语句
例子:
--创建on commit方式的快速刷新mv:
CREATE MATERIALIZED VIEW mv_test1
REFRESH FAST ON COMMIT
AS SELECT * FROM test;
--创建on demand方式的快速刷新mv,需要手动刷新:
CREATE MATERIALIZED VIEW mv_test2
REFRESH FAST ON DEMAND
AS SELECT * FROM test;
--创建start方式的快速刷新mv,间隔30s刷新一次:
CREATE MATERIALIZED VIEW mv_test3
REFRESH FAST START WITH SYSDATE
NEXT SYSDATE + 1/2880
AS SELECT * FROM test;
/*
注意:
on demand可以和start子句组合一起使用;
on commit不能与start子句组合使用;
*/
3.1.2 删除物化视图
删除语法:
--如果在基表创建的有物化视图日志,可以先删除物化视图日志,再删除物化视图
drop materialized view log on [table_name];
drop materialized view [view_name];
例子
drop materialized view log on test;
drop materialized view mv_test;
3.1.3 手动刷新物化视图
手动刷新语法
begin
DBMS_MVIEW.REFRESH (
{ list IN VARCHAR2,
| tab IN DBMS_UTILITY.UNCL_ARRAY,} --逗号分隔要刷新的物化视图
method IN VARCHAR2 := NULL, --刷新的方式
rollback_seg IN VARCHAR2 := NULL,
push_deferred_rpc IN BOOLEAN := true,
refresh_after_errors IN BOOLEAN := false,
purge_option IN BINARY_INTEGER := 1,
parallelism IN BINARY_INTEGER := 0,
heap_size IN BINARY_INTEGER := 0,
atomic_refresh IN BOOLEAN := true,
nested IN BOOLEAN := false,
out_of_place IN BOOLEAN := false);
end;
例子:
--手动刷新,c-完全刷新,f-增量刷新,?-强制刷新
dbms_mview.refresh('mv_test2','c');
refresh MATERIALIZED VIEW V_EMP force;
3.2 物化视图数据填充方式
创建方式(Build Methods):创建物化视图时的数据填充方式,是立即生成数据,还是延迟生成数据。
build [immediate|deferred]
BUILD IMMEDIATE: 在创建物化视图的时候就生成数据。默认为BUILD IMMEDIATE。
BUILD DEFERRED: 在创建时不生成数据,以后根据需要再生成数据。
3.3 物化视图刷新
3.3.1 刷新方式
refresh [fast|complete|force]
FAST: 快速刷新,采用增量刷新的机制,只将自上次刷新以后对基表进行的所有操作刷新到物化视图中去。FAST必须在基表上创建物化视图日志。在dm8中,一般单表的物化视图,单表聚合、多表关联不涉及聚合的查询可以使用快速刷新。
COMPLETE: 完全刷新,会删除表中所有的记录,然后根据物化视图中查询语句的定义重新生成物化视图。
FORCE:默认的数据刷新方式,会自动判断是否满足快速刷新的条件,如果满足则进行快速刷新,否则进行完全刷新。
3.3.2 刷新时机
on [commit|demand] |start with ... next...
never refresh
ON COMMIT: 一旦基表有了COMMIT,即事务提交,则立刻刷新,立刻更新物化视图,使得数据和基表一致。
ON DEMAND: 在用户需要的时候进行刷新,可以手工通过refresh materialized view mv_emp或者dbms_mviews.refresh来进行刷新,也可以通过JOB定时进行刷新,即更新物化视图,以保证和基表数据的一致性;
START WITH … NEXT: START WITH 用于指定首次刷新物化视图的时间, NEXT 指定自动刷新的间隔;
NEVER REFRESH: 物化视图从不刷新
3.3.3 刷新类型
with [primary key|rowid]
WITH PRIMARY KEY: 基于基表的主键创建物化视图,基表上需要有主键,默认为primary key.
WITH ROWID: 基于基表的rowid创建物化视图,不能对基表执行分组函数、多表连结等需要把多个rowid合成一行的操作 (因为不知道以哪个rowid为准),支持只有一个单一的基表;
3.4 物化视图创建
3.4.1 创建完全刷新的物化视图
创建物化视图:
--创建物化视图
create MATERIALIZED view v_emp REFRESH FORCE on DEMAND
as
select b.department_name, count(*), sum(a.salary)
from dmhr.employee a, dmhr.department b
where a.department_id= b.department_id
group by b.department_name;
--查询物化视图
select * from v_emp;
修改物化视图的刷新方式:
--定时刷新,系统会自动创建一个数据库级触发器,修改为手动刷新后会自动删除
alter MATERIALIZED VIEW V_EMP REFRESH START WITH trunc(sysdate,'dd')+1 NEXT
trunc(sysdate,'dd')+1;
--从不刷新
alter MATERIALIZED VIEW V_EMP NEVER REFRESH;
--需要时手动刷新
alter MATERIALIZED VIEW V_EMP REFRESH FORCE on DEMAND;
手动刷新:
refresh MATERIALIZED VIEW V_EMP force;
dbms_mview.REFRESH('V_EMP','C');
查看物化视图:
select * from USER_MVIEWS;
3.4.2 创建快速刷新的物化视图
创建快速刷新物化视图:
物化视图日志的创建,可以使用with primary key或者with rowid。默认是with primary key,with primary key要求基础表要有主键。
--1.创建基表
create table t_dept as select * from dmhr.DEPARTMENT;
--2.在基表上创建物化视图日志
create MATERIALIZED VIEW LOG on t_dept WITH rowid(DEPARTMENT_ID, DEPARTMENT_NAME);
--3.创建快速刷新物化视图,需先创建物化视图日志,基于rowid的物化视图日志,物化视图创建时需要包含rowid列
create MATERIALIZED view v_deptinfo REFRESH FAST on COMMIT WITH ROWID
as
select b.DEPARTMENT_ID, b.DEPARTMENT_NAME, b.rowid dept_rowid
from t_dept b;
--4.查询物化视图
select * from v_deptinfo;
--5.更新基表
insert into t_dept(DEPARTMENT_ID, DEPARTMENT_NAME)
values(888888, 'TEST');
--6.查询物化视图日志,MLOG$_为前缀
select * from "MLOG$_T_DEPT";
commit; --提交后物化视图日志信息被删掉
--7.查询基表和物化视图
select * from v_deptinfo;
select * from t_dept;
修改物化视图刷新时机:
alter MATERIALIZED VIEW v_deptinfo REFRESH FAST on DEMAND;
delete from t_dept where DEPARTMENT_ID < 1003;
commit;
select * from "MLOG$_T_DEPT";
update t_dept set DEPARTMENT_ID =0 where DEPARTMENT_ID=2;
--未手动刷新,物化视图和基表数据不一致
select * from v_deptinfo;
select * from t_dept;
手动刷新:
refresh MATERIALIZED VIEW v_deptinfo fast;
查询数据:
--手动刷新后数据保持一致
select * from v_deptinfo;
select * from t_dept;
物化视图和物化视图日志的删除:
drop MATERIALIZED VIEW LOG on t_dept;
drop MATERIALIZED VIEW v_deptinfo;
11.达梦DCP认证课程-DEM管理
1.DEM介绍
DEM的全称为Dameng Enterprise Manager。DEM为数据库提供了对象管理和数据库监控的功能,并且通过远程主机部署代理,能够实现对远程主机状态和远程主机上达梦数据库实例状态的监控。 DEM的监控不单局限于单个数据库实例,它还能够对数据库集群(MPP、DSC、DataWatch)进行监控和管理。
DEM 由以下几个部分组成:
DEM 服务器
DEM 存储数据库
要管理和监控的数据库实例
数据库代理服务(dmagent)
2.DEM部署
2.1 服务端部署
2.1.1 配置资料库
操作用户:dmdba
1.安装单实例数据库, 创建的数据库就是DEM的后台数据库
端口5236
user/passwd:sysdba/NewcapeC.300248
2.修改 DEM 后台数据库 DM.INI 参数配置
#推荐配置:
MEMORY_POOL = 200
BUFFER = 1000
KEEP = 64
SORT_BUF_SIZE = 50
3.重启数据库生效
DmServiceDMSERVER restart
4.查看dem_init.sql脚本
[dmdba@localhost ~]$ cd /dm8/web/
[dmdba@localhost web]$ ll
总用量 335412
-rwxr-xr-x 1 dmdba dinstall 195519 3月 20 14:29 dem_init.sql
-rwxr-xr-x 1 dmdba dinstall 10309979 3月 20 14:29 DEM.pdf
drwxr-xr-x 2 dmdba dinstall 62 3月 20 14:29 demsdk
-rwxr-xr-x 1 dmdba dinstall 332947341 3月 20 14:29 dem.war
-rwxr-xr-x 1 dmdba dinstall 3261 3月 20 14:29 readme.txt
[dmdba@localhost web]$ file dem_init.sql
dem_init.sql: UTF-8 Unicode text, with CRLF line terminators
5.执行dem初始化脚本
--执行以下SQL脚本dem_init.sql,此SQL脚本编码为UTF-8,在disql中设置set CHAR_CODE UTF8;
disql sysdba/NewcapeC.300248
SET DEFINE OFF
SET CHAR_CODE UTF8
START /dm8/web/dem_init.sql
2.1.2 安装jdk
操作用户:root
1.查看是否安装有jdk
#若已安装,无需再进行配置
[root@localhost ~]# java -version
openjdk version "1.8.0_272"
OpenJDK Runtime Environment Bisheng (build 1.8.0_272-b10)
OpenJDK 64-Bit Server VM Bisheng (build 25.272-b10, mixed mode)
2.安装jdk
[root@localhost ~]# rpm -ivh jdk-8u152-linux-x64.rpm
3.配置jdk环境变量
#JAVA_HOME是自己安装jdk的安装目录地址
[root@localhost ~]# vi /etc/profile
export JAVA_HOME=/usr/java/jdk1.8.0_152
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$JAVA_HOME/bin:$PATH
#生效jdk环境变量
[root@localhost ~]# . /etc/profile
#检查jdk是否安装成功
java -version
2.1.3 安装tomcat
**操作用户:**root 目录规划为:/dm8/tomcat
1.上传并解压安装包
[root@localhost opt]# unzip apache-tomcat-8.0.20.zip
[root@localhost opt]# mv apache-tomcat-8.0.20 /dm8/tomcat
2.将启动程序添加到服务列表
#待重启机器之后,可以使用systemctl方式管理
cd /dm8/tomcat/bin
cp catalina.sh /etc/init.d/tomcat
chmod 755 /etc/init.d/tomcat
3.修改服务启动的配置
#1.修改tomcat服务,在第二行添加以下内容
[root@localhost ~]# vi /etc/init.d/tomcat
#chkconfig: 2345 10 90
#description:Tomcat service
CATALINA_HOME=/dm8/tomcat
JAVA_HOME=/usr/java/jdk1.8.0_152
JAVA_OPTS="-server -Xms256m -Xmx1024m -XX:MaxPermSize=512m -Djava.library.path=/dm8/bin"
#2.修改server.xml,找到<Connector port="8080" protocol="HTTP/1.1"... 追加属性字段添加maxPostSize="-1"
[root@localhost ~]# vi /dm8/tomcat/conf/server.xml
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
maxPostSize="-1" />
4.拷贝要发布的DEM war包,并启动tomcat
[root@localhost ~]# cp /dm8/web/dem.war /dm8/tomcat/webapps
#启动服务进行发布,必须先启动tomcat才会解压缩war包
[root@localhost ~]# /etc/init.d/tomcat start
5.编辑发布之后的dem配置文件,修改数据库连接
#进入WEB-INF目录
[root@localhost ~]# cd /dm8/tomcat/webapps/dem/WEB-INF
#编辑db.xml文件设置正确的ip,用户名和密码
[root@localhost ~]# vi db.xml
<Server>192.168.6.110</Server>
<Port>5236</Port>
<User>SYSDBA</User>
<Password>dameng123</Password>
6.重启tomcat
/etc/init.d/tomcat stop
/etc/init.d/tomcat start
2.1.4 登录DEM
DEM 的访问地址:http://ip:8080/dem/
默认用户名和密码:admin/888888
此时数据库和主机还无法监控远程服务器,因为远程服务器的代理还没有部署。
2.2 客户端部署agent
操作用户:root用户
在监控的节点部署并启用dmagent。DM的安装目录已经包含了dmagent。我们这里在同一台主机上布署。即同一台主机上既布署DEM服务又布署DEM代理dmagent。
1.修改agent配置文件agent.ini
#进入dmagent目录
[root@localhost ~]# cd /dm8/tool/dmagent
#修改url使其连接为DEM访问地址
[root@localhost dmagent]# vi agent.ini
center_url=http://192.168.1.100:8080/dem
2.启动dmagent
方式一:在 dmagent 目录执行./startup.sh -d agent.ini
方式二:在 dmagent 目录执行先执行./service.sh install,然后./service.sh start
[root@localhost dmagent]# pwd
/dm8/tool/dmagent
[root@localhost dmagent]# ll
总用量 828
-rwxr-xr-x 1 dmdba dinstall 22272 3月 24 13:24 agent.ini
drwxr-xr-x 2 dmdba dinstall 4096 3月 20 14:29 lib
drwxr-xr-x 2 dmdba dinstall 6 3月 20 14:29 log
-rwxr-xr-x 1 dmdba dinstall 2058 3月 20 14:29 log4j.xml
-rwxr-xr-x 1 dmdba dinstall 794817 3月 20 14:29 readme.pdf
drwxr-xr-x 8 dmdba dinstall 85 3月 20 14:29 resources
drwxr-xr-x 2 dmdba dinstall 6 3月 20 14:29 service
-rwxr-xr-x 1 dmdba dinstall 3635 3月 20 14:29 service.bat
-rwxr-xr-x 1 dmdba dinstall 3515 3月 20 14:29 service.sh
drwxr-xr-x 4 dmdba dinstall 42 3月 20 14:29 ssl
-rwxr-xr-x 1 dmdba dinstall 1410 3月 20 14:29 start.bat
-rwxr-xr-x 1 dmdba dinstall 2529 3月 20 14:29 start.sh
[root@localhost dmagent]# ./service.sh install
input agent home [/dm8/tool/dmagent] :
input agent.ini path [/dm8/tool/dmagent/agent.ini] :
installation the service DmAgentService completed.
[root@localhost dmagent]# ./service.sh start
重定向至 /bin/systemctl start DmAgentService.service
2.3 添加受管节点
登录dem之后,分别添加主机及数据库,添加数据库之后,要等一会才会状态正常。
12.达梦DCP认证课程-安全管理
1.安全标准
CC 标准-国际标准:
Common criteria
达梦为 EL4
TCSEC 美国国防部的数据库安全标准:
达梦安全版可以达到 B1 标记安全保护
国家标准–GB/T 20273-2006:
达梦安全四级
2.用户安全
2.1 口令策略
用户口令最长为 48 字节,创建用户语句中的 PASSWORD Y POLICY 子句用来指定该用户的口令策略,系统支持的口令策略有:
0 无策略
1 禁止与用户名相同
2 口令长度不小于 9
4 至少包含一个大写字母(A-Z)
8 至少包含一个数字(0-9)
16 至少包含一个标点符号(英文输入法状态下,除“和空格外的所有符号)
口令策略可单独应用,也可组合应用。组合应用时,如需要应用策略 2 和 4,则设置口令策略为 2+4=6 即可。
除了在创建用户语句中指定该用户的口令策略,隐含参数 PWD_POLICY(不在dm.ini中) 可以指定系统的默认口令策略,其参数值的设置规则与 PASSWORD POLICY 子句一致,缺省值为2。若在创建用户时没有使用 PASSWORD POLICY 子句指定用户的口令策略,则使用系统的默认口令策略。
查询系统默认口令策略:
--PWD_POLICY是隐含参数,只能通过函数或者sql语句修改
SQL> select name,type,value,sys_value,file_value from v$parameter where name='PWD_POLICY';
行号 NAME TYPE VALUE SYS_VALUE FILE_VALUE
---------- ---------- ---- ----- --------- ----------
1 PWD_POLICY SYS 0 0 0
查询用户当前的口令策略:
SQL> select username,account_status,password_versions from dba_users;
行号 USERNAME ACCOUNT_STATUS PASSWORD_VERSIONS
---------- ---------- -------------- -----------------
1 SYSAUDITOR OPEN 0
2 SYSSSO OPEN 0
3 SYSDBA OPEN 0
4 SYS OPEN 0
--修改用户口令策略
alter user sysdba password_policy 31;
SQL> select username,account_status,password_versions from dba_users where username='SYSDBA';
行号 USERNAME ACCOUNT_STATUS PASSWORD_VERSIONS
---------- -------- -------------- -----------------
1 SYSDBA OPEN 31
修改系统默认口令策略:
方法1:通过alter system
select name,type,value from v$parameter where name='PWD_POLICY';
alter system set 'pwd_policy'=6 both;
方法2:通过console工具
console为脱机工具,对参数值的修改是通过修改dm.ini文件中的参数值来进行,无论参数是静态还是动态,都需要重启DM数据库才能使新设置的参数值生效。
[dmdba@dmserver tool]$ pwd
/home/dmdba/dmdbms/tool
[dmdba@dmserver tool]$ ./console
方法3:使用系统过程
使用系统过程 SP_SET_PARA_VALUE 来配置 PWD_POLICY 参数值。
SQL> SP_SET_PARA_VALUE(1, 'PWD_POLICY',2);
DMSQL 过程已成功完成
已用时间: 2.139(毫秒). 执行号:56607.
SQL> select name,value from v$parameter where name='PWD_POLICY';
行号 NAME VALUE
---------- ---------- -----
1 PWD_POLICY 2
已用时间: 34.398(毫秒). 执行号:56608.
2.2 资源限制
可以通过管理工具 manager---> 用户---> 修改来设置密码和资源的安全
可以单独创建资源限制 Profile。
create PROFILE pro1 limit PASSWORD_LIFE_TIME 180;
2.3 权限控制
查看数据库中的用户
Select username from dba_users;
USERNAME
SYSSSO :安全员(安全策略,安全版商密可信版)--->可以用来做强制访问策略
SYSDBA :管理员
SYS : 内置管理账户
SYSAUDITOR
Sysdbo : 操作员(安全版才会有)
2.4 操作系统认证
基 于 OS 的身份验证需首先将操作系统用户加入到操作系统的 dmdba|dmsso|dmauditor 用户组,分别对应数据库的SYSDBA|SYSSSO|SYSAUDITOR 用户。也可以将操作系统用户加入到操作系统的 dmusers 用户组来进行基于 OS 的身份验证,对应数据库的同名用户,即此时数据库中需要存在一个与操作系统用户同名的用户。
sysdba身份登录
1.设置参数并重启数据库
--ENABLE_LOCAL_OSAUTH为隐含参数,参数修改写入system.dbf,不在dm.ini文件中
select name,type,value from v$parameter where name='ENABLE_LOCAL_OSAUTH';
--设置为1,支持操作系统认证
alter system set ENABLE_LOCAL_OSAUTH=1 spfile;
--重启数据库
[dmdba@localhost ~]$ DmServiceDMSERVER stop
[dmdba@localhost ~]$ DmServiceDMSERVER start
2.创建dmdba组,把dmdba添加到dmdba组
groupadd dmdba
usermod -G dmdba dmdba
id dmdba
3.使用操作系统认证登录
disql / as sysdba
普通用户身份登录
以普通用户身份登录,需要在数据库中创建同名用户,操作系统中创建该用户,并且将用户加入到 dmusers 用户组(重点)。
[root@localhost ~]# useradd dmtest
[root@localhost ~]# usermod -G dmusers dmtest
[root@localhost ~]# su - dmtest
[dmtest@localhost ~]$ cd /dm8/bin
#登录用户为dmtest
[dmtest@localhost bin]$ ./disql / as users
[root@localhost ~]# su - hr
[hr@localhost ~]$ cd /dm8/bin
#登录用户为hr
[hr@localhost bin]$ ./disql / as users
3.审计
执行审计需要的权限:
只有数据库审计员才能进行审计操作,数据库管理员和安全员不能参与审计活动
达梦预定义系统审计管理员:sysauditor
3.1 审计分类
数据库审计包含:系统级、语句级、对象级。
系统审计: 系统的启动与关闭,此级别的审计记录在任何情况下都会强制产生,无法也无需由用户进行设置。(启动关闭数据库)信息记录到 /dm8/data/DAMENG/AUDIT_DMSERVER*.log,相当于 oracle 中的 alert trace 文件,包含报错信息。
语句审计: 审计具体的语句,补丁某个对象,如create table,alter table。使用 SP_AUDIT_STMT 进行语句审计的设置。
对象审计: 审计对对象的操作,如person表上的insert语句。使用 SP_AUDIT_OBJECT 进行对象审计,可以是针对某个对象(表、过程、视图等)也可以精确到某张表的某列。
3.2 审计管理
3.2.1 审计开关
审计开关:
审计开关由SP_SET_ENABLE_AUDIT(param int)控制, 过程执行完后会立即生效, param 有三种取值:
0:关闭审计,缺省值为0
1:打开普通审计
2:打开普通审计和实时审计
查询是否开启审计:
--0表示关闭审计,1 表示打开审计,2 表示普通+实时审计
select para_name,para_value,para_type from v$dm_ini where para_name='ENABLE_AUDIT';
打开审计: 审计打开后,才能配置审计,否则会报” [-5301]:审计开关关闭或当前环境不支持“ 错误
--需要sysauditor用户登录操作
SP_SET_ENABLE_AUDIT(1)
关闭审计:
--需要sysauditor用户登录操作
SP_SET_ENABLE_AUDIT(0)
3.2.2 审计相关过程
SQL> select name,id from v$ifun where name like 'SP_AUDIT%';
行号 NAME ID
---------- --------------------- -----------
1 SP_AUDIT_SQLSEQ_ADD 1345
2 SP_AUDIT_SQLSEQ_END 1346
3 SP_AUDIT_SQLSEQ_DEL 1347
4 SP_AUDIT_SQLSEQ_START 1344
5 SP_AUDIT_STMT 596
6 SP_AUDIT_SET_ENC 1207
7 SP_AUDIT_OBJECT 1340
8 SP_AUDIT_OBJECT 598
8 rows got
已用时间: 12.065(毫秒). 执行号:500.
--Whenenver 表示审计时机,有三个取值:ALL\SUCCESSFUL\FAIL
SQL> select * from v$ifun_arg t where id=596;
行号 ID NAME SEQ DATA_TYPE LEN PREC IO_TYPE COMMENT$
---------- ----------- -------- ----------- ---------------- ----------- ----------- ------- --------
1 596 RVAL -1 UNKNOWN DATATYPE 0 0 RETURN NULL
2 596 TYPE 0 VARCHAR2 30 0 IN NULL
3 596 LUNAME 1 VARCHAR2 128 0 IN NULL
4 596 WHENEVER 2 VARCHAR2 20 0 IN NULL
已用时间: 10.096(毫秒). 执行号:501.
3.2.3 审计相关参数
SQL> select name,value,description from v$parameter where name like '%AUDIT%';
行号 NAME VALUE DESCRIPTION
---------- -------------------- ----- -----------------------------------------------------------------------------------------------
1 ENABLE_AUDIT 1 Flag For Allowing Audit, 0: no audit 1: normal audit 2:normal audit and realtime audit
2 AUDIT_FILE_FULL_MODE 1 operation mode when audit file is full, 1: delete old file; 2: no longer to write audit records
3 AUDIT_SPACE_LIMIT 8192 audit space limit in Megabytes
4 AUDIT_MAX_FILE_SIZE 100 maximum audit file size in Megabytes
5 AUDIT_IP_STYLE 0 IP style in audit record, 0: IP, 1: IP(hostname), default 0
已用时间: 12.167(毫秒). 执行号:502.
SQL> select name,value,description from v$parameter where name like 'AUD_PATH%';
行号 NAME VALUE DESCRIPTION
---------- -------- ----- --------------
1 AUD_PATH NULL audit log path
SQL> select name,value,description from v$parameter where name like 'SYSTEM_PATH';
行号 NAME VALUE DESCRIPTION
---------- ----------- ---------------- -----------
1 SYSTEM_PATH /dm8/data/DAMENG system path
已用时间: 2.874(毫秒). 执行号:503.
审计日志文件目录,默认使用的是 SYSTEM_PATH(dm.ini 中),也可以 dm.ini 在增加AUD_PATH 参数指定审计日志文件的存放目录。
3.2.4 审计相关函数
SQL> select name,id from v$ifun where name like 'SF_GET_AUDIT%';
行号 NAME ID
---------- -------------------------- -----------
1 SF_GET_AUDIT_TYPENAME 2249
2 SF_GET_AUDIT_LEVELNAME 2250
3 SF_GET_AUDIT_OPERATION 594
4 SF_GET_AUDIT_OPERATIONNAME 2251
5 SF_GET_AUDIT_WHENEVERNAME 2252
6 SF_GET_AUDIT_TYPE 593
6 rows got
已用时间: 1.952(毫秒). 执行号:505.
3.2 语句级审计
语句级审计的动作是全局的,不对应具体的数据库对象,粗粒度审计。
3.2.1 设置语法
语法: stmt为statements 语句的简写
sp_audit_stmt(type,username,whenever)
语法说明:
TYPE: 审计对象(表,视图,存储过程),有很多类型,具体参考官方手册。
Username: 用户,null 表示不限制
Whenever: 审计时机
ALL: 不管成功或是失败都审计
SUCCESSFUL: 操作成功的时候审计
FAIL: 操作失败的时候审计
3.2.1 使用用例
针对表的 DDL 操作审计:
--stmt为statements 语句的简写
sp_audit_stmt('TABLE','NULL','ALL');
针对表的插入操作审计:
sp_audit_stmt('INSERT TABLE','NULL','SUCCESSFUL');
删除审计:
sp_noaudit_stmt('TABLE','NULL','ALL')
审计查询:
--查询所有配置的审计类型
SQL> select * from sysaudit;
行号 LEVEL UID TVPID COLID TYPE WHENEVER
---------- ----------- ----------- ----------- ----------- ----------- -----------
1 1 -1 -1 -1 15 3
--通过type获取typename
SQL> select SF_GET_AUDIT_TYPENAME(15);
行号 SF_GET_AUDIT_TYPENAME(15)
---------- -------------------------
1 TABLE
--查询审计日志
select * from sysauditor.v$auditrecords;
3.3 对象级审计
对象级审计发生在具体的对象上,需要指定模式名以及对象名,细粒度审计。
3.3.1 设置语法
语法:
sp_audit_object(type,username,schname,tvname,colname,whenever)
语法说明:
TYPE: 对象级审计选项
USERNAME:用户名
SCHNAME: 模式名,为空时设置null
TVNAME: 表、视图、存储过程名不能为空
COLNAME:列名
WHENEVER: 审计时机,可选的取值为:
ALL: 不管成功或是失败都审计
SUCCESSFUL: 操作成功的时候审计
FAIL: 操作失败的时候审计
sp_audit_object过程参数定义:
SQL> select * from v$ifun_arg t where id in(598,1340);
行号 ID NAME SEQ DATA_TYPE LEN PREC IO_TYPE COMMENT$
---------- ----------- -------- ----------- ---------------- ----------- ----------- ------- --------
1 1340 RVAL -1 UNKNOWN DATATYPE 0 0 RETURN NULL
2 1340 TYPE 0 VARCHAR2 30 0 IN NULL
3 1340 USERNAME 1 VARCHAR2 128 0 IN NULL
4 1340 SCHNAME 2 VARCHAR2 128 0 IN NULL
5 1340 TVNAME 3 VARCHAR2 128 0 IN NULL
6 1340 COLNAME 4 VARCHAR2 128 0 IN NULL
7 1340 WHENEVER 5 VARCHAR2 20 0 IN NULL
8 598 RVAL -1 UNKNOWN DATATYPE 0 0 RETURN NULL
9 598 TYPE 0 VARCHAR2 30 0 IN NULL
10 598 USERNAME 1 VARCHAR2 128 0 IN NULL
11 598 SCHNAME 2 VARCHAR2 128 0 IN NULL
12 598 TVNAME 3 VARCHAR2 128 0 IN NULL
13 598 WHENEVER 4 VARCHAR2 20 0 IN NULL
13 rows got
已用时间: 1.892(毫秒). 执行号:517.
3.3.2 使用示例
创建对象级审计:
sp_audit_object('INSERT','DMTEST','DMTEST','T_PARTRANGETAB','SUCCESSFUL');
sp_audit_object('UPDATE','DMTEST','DMTEST','T_PARTRANGETAB','SUCCESSFUL');
sp_audit_object('DELETE','DMTEST','DMTEST','T_PARTRANGETAB','SUCCESSFUL');
--审计dmtest用户对dmtest.T_PARTRANGETAB的操作
sp_audit_object('ALL','DMTEST','DMTEST','T_PARTRANGETAB','SUCCESSFUL');
--审计所有用户对dmtest.T_PARTRANGETAB的操作
sp_audit_object('ALL','NULL','DMTEST','T_PARTRANGETAB','SUCCESSFUL');
删除审计:
sp_noaudit_object('DELETE','DMTEST','DMTEST','T_PARTRANGETAB','SUCCESSFUL');
sp_noaudit_object('ALL','DMTEST','DMTEST','T_PARTRANGETAB','SUCCESSFUL');
审计查询:
select * from sysaudit;
select * from sysauditor.v$auditrecords;
3.4 审计查询
1.sysaudit表存放审计设置信息
--查询所有审计配置信息
select * from sysaudit;
--查询某个表上的审计配置,1290为表的id
SELECT SF_GET_AUDIT_LEVELNAME(level) level,
SF_GET_AUDIT_TYPENAME(type) type,
SF_GET_AUDIT_WHENEVERNAME("WHENEVER") whenever1,
sf_get_tablename_by_id(decode(tvpid,-1,null,tvpid)) tablename,
SF_GET_USERNAME_BY_ID(UID) uname, TVPID tvname
FROM sysaudit t;
select sf_get_tablename_by_id(1290);
2.审计日志存放在操作系统文件中(AUDIT_开头.log 文件,默认在SYSTEM_PATH下),可以通过 v$auditrecords 查询
select * from SYSAUDITOR."V$AUDITRECORDS";
3.5 审计日志解析
3.5.1 dmaudtool工具
帮助信息:
[dmdba@localhost ~]$ dmaudtool help
dmaudtool V8
version: 03134283904-20220630-163817-20005
格式: ./dmaudtool KEYWORD=value
例程: ./dmaudtool USERID=sysauditor/sysauditor@192.168.0.33:4356 AFIL_PATH=/opt/dm7data/dameng/aud OUT_PATH=/opt/dm7data/dameng/out/aud_out.txt
例程: ./dmaudtool USERID=sysauditor/sysauditor@192.168.0.33:4356 AFIL_PATH=/opt/dm7data/dameng/aud UPDATE_KEY=NULL
必选参数: USERID、AFIL_PATH、(OUT_PATH or UPDATE_KEY)
关键字 说明
--------------------------------------------------------------------------------
USERID 用户名/口令 格式:<username>/<password>[@<connect_identifier>][<option>],必选
<connect_identifier> : [<svc_name> | host[:port] | <unixsocket_file>]
<option> : #{<exetend_option>=<value>[,<extend_option>=<value>]...}
--此行外层{}是为了封装参数之用,书写时需要保留
AFIL_PATH 审计文件所在的路径,必选
OUT_PATH 输出文件的生成路径,与OUT_SIZE配合使用,若超过指定文件大小,则会生成同名加序号后缀的文件,必选(如果使用分析审计日志功能)。
UPDATE_KEY 更换密钥,必选(如果使用更新审计日志密钥功能)
OUT_SIZE 输出文件的指定大小,单位为兆(M),默认为0,表示不限制文件大小,最小500,最大65534。
DCR_INI DCR_INI路径,用于连接ASM使用。当审计文件存在与ASM上使用,若没有,则忽略。
USERNAME 对应审计记录中记录的用户名,若指定,则说明收集满足该用户名的审计记录。若未指定,则不考虑
SCHNAME 对应审计记录中记录的模式名,若指定,则说明收集满足该模式名的审计记录。若未指定,则不考虑
OBJNAME 对应审计记录中记录的对象名,若指定,则说明收集满足该对象名的审计记录。若未指定,则不考虑
TIME_FROM 对应审计记录中操作时间,若指定,则收集指定时间之后的审计记录。若未指定,则不考虑
TIME_TO 对应审计记录中操作时间,若指定,则收集指定时间之前的审计记录。若未指定,则不考虑
R_SEP 输出文件中行分隔符,默认回车符
C_SEP 输出文件中列分隔符,默认|号符
HELP 打印帮助信息
Analyse the audit files successfully.
使用:
dmaudtool userid=sysauditor/NewcapeC.300248 AFIL_PATH=/dm8/data/DAMENG OUT_PATH=/dm8/data/DAMENG/audit.txt
3.5.2 DM审计分析工具
审计文件打开乱码,需通过图形化 sysauditor 连接审计分析工具 analyzer 来查看审计结果,点击审计日志查看器–>添加目录—>选择$DM_HOME/data/DAMENG/—>只选择审计日志文件,点击确定进行查看。
[dmdba@localhost ~]$ cd /dm8/tool/
[dmdba@localhost tool]$ ll analyzer
-rwxr-xr-x 1 dmdba dinstall 908 3?? 20 14:29 analyzer
13.达梦DCP认证课程-数据库迁移
7.数据库迁移
7.1 迁移工具介绍
常用的迁移工具:DTS、DEXP、DMFLDR、DMETL、DMHS
7.1.1 DTS
支持的数据源种类最多,提供主流国内外数据库迁移到DM、DM到DM、文件迁移到DM以及DM迁移到文件的功能。
DTS 适用场景:
支持一次性迁移,不能进行增量迁移。比如:生产环境有数据变化时,需要迁移一份数据进行测试验证 需要有停机窗口允许完整性迁移 不允许在源端数据库中创建任何对象
DTS优点:
支持类型全面:较比 HS 同步软件支持的异构数据库类型多一些; 低成本:不需要单独购买、部署,数据库产品中自带; 易操作:提供可视化界面,操作便捷易理解; 高度兼容 Oracle,对于 Oracle 对象定义可以直接迁移;
7.1.2 DMHS
支持异构数据库间的的迁移。类似于oracle的ogg。
**DMHS 工具使用前提:**源端数据库开启归档和逻辑附加日志
DMHS应用场景:
对停机窗口无要求,适用于平滑迁移或升级;
支持数据实时增量同步,非介入式捕获增量对源端数据库几乎无影响;
可实现数据级灾备、业务分流,支持远距离异地容灾;
对网络要求低;
7.1.3 dmfldr
dmfldr是达梦数据库提供的一个针对具有可辨识格式的文本数据的快速装载工具,不支持向临时表、外部表装载。
7.1.4 dmexp
数据库逻辑导出工具,支持对远程数据库的访问。
7.2 数据迁移
迁移过程:
迁移之前,DM 的初始化参数环境最好要与源库(要迁移的库)一致。
页大小、字符集、大小写敏感、行尾空格(兼容 Oracle)、以字符为单位等。
初始化好系统包的环境(如果业务用到了空间地理数据、DBMS_SCHEDULER、DBMS_JOB 等都需要先创建系统包)
SQL> select name,id from v$ifun where name like ‘SP_INIT%’;
行号 NAME ID
---------- -------------------------- -----------
1 SP_INIT_DBMS_SCHEDULER_SYS 2213
2 SP_INIT_GEO_SYS 767
3 SP_INIT_JOB_SYS 759
4 SP_INIT_DBG_SYS 765
5 SP_INIT_AWR_SYS 1918
DTS 新版本新增迁移前评估,迁移后数据对比的功能。
DTS 迁移时,要注意客户端版本和服务器版本最好保持一致。
迁移的性能相关: 1、 服务器可以调整 JVM 参数, JAVA_OPTIONS: -Xmx2048m -Xms2048m
2、 迁移之前建议关闭 enable_monitor、pk_with_cluster 参数;
3、 不要开归档(归档文件会暂用大量磁盘空间,也会影响性能);
4、 如果数据量大,建议分批迁移,先序列、基础表、视图、存储过程、函数等。
5、 有自增列的表,需要启用标志列插入,否则无法插入数据;
6、服务器内存足够大,可以调大普通表的读取行数等,开启并发,快速装载等提高迁移速度。
DM默认自增列不支持显示插入数据:
create table t_test03(id int IDENTITY(1,1),name varchar(20));
–开启后才能在自增列上插入值
set IDENTITY_INSERT sysdba.t_test03 on;
insert into t_test03 (id, name) VALUES (1, ‘aa’);
commit
–关闭IDENTITY_INSERT
set IDENTITY_INSERT sysdba.t_test03 off;
13.达梦DCP认证课程-快速数据加载
8.数据快速加载
8.1 dmfldr简介
dmfldr(DM Fast Loader)是 DM 提供的快速数据装载命令行工具。用户通过使用 dmfldr 工具能够把按照一定格式排序的文本数据以简单、快速、高效的方式载入到 DM 数据库中,或把 DM 数据库中的数据按照一定格式写入文本文件。
安装好 DM 数据库管理系统后,在安装目录的“bin”子目录下可找到 dmfldr 执行文件。
数据载入:
当进行 数据载入时,dmfldr 客户端接收用户提交的命令与参数,分析控制文件与数据文件,将数据打包发送给服务器端的 dmfldr 模块,由服务器完成数据的真正装载工作。并分析服务器返回的消息,必要时根据用户参数指定生成日志文件与错误数据文件。
数据导出:
当进行 数据导出时,dmfldr 客户端接收用户提交的命令与参数,分析控制文件,将用户要求转换成相应消息发送给服务器端的 dmfldr 模块。服务器解析并打包需要导出的数据,发送给 dmfldr 客户端,客户端将数据写入指定的数据文件,必要时根据用户参数指定生成日志文件。
8.2 dmfldr用法
8.2.1 帮助信息
[dmdba@localhost ~]$ dmfldr help
version: 03134283904-20220630-163817-20005
格式: ./dmfldr KEYWORD=value
例程: ./dmfldr SYSDBA/SYSDBA CONTROL='/opt/data/fldr.ctl'
USERID 必须是命令行中的第一个参数
CONTROL 必须是命令行中的第二个参数
字符串类型参数必须以引号封闭
关键字 说明(默认值)
--------------------------------------------------------------------------------
USERID 用户名/口令, 格式:{<username>[/<password>] | /}[@<connect_identifier>][<option>] [<os_auth>]
<connect_identifier> : [<svc_name> | host[:port] | <unixsocket_file>]
<option> : #{<exetend_option>=<value>[,<extend_option>=<value>]...}
--此行外层{}是为了封装参数之用,书写时需要保留
<os_auth> : AS {SYSDBA|SYSSSO|SYSAUDITOR|USERS|AUTO}
CONTROL 控制文件,字符串类型
LOG 日志文件,字符串类型 (fldr.log)
BADFILE 错误数据记录文件,字符串类型 (fldr.bad)
SKIP 初始忽略逻辑行数 (0)
LOAD 需要装载的行数 (ALL)
ROWS 提交频次 (50000), DIRECT为FALSE有效
DIRECT 是否使用快速方式装载 (TRUE)
SET_IDENTITY 是否插入自增列 (FALSE)
SORTED 数据是否已按照聚集索引排序 (FALSE)
INDEX_OPTION 索引选项 (1)
1 不刷新二级索引,数据按照索引先排序,装载完后再
将排序的数据插入索引
2 不刷新二级索引,数据装载完成后重建所有二级索引
3 刷新二级索引, 数据装载的同时将数据插入二级索引
ERRORS 允许的最大数据错误数 (100)
CHARACTER_CODE 字符编码,字符串类型 (GBK, UTF-8, SINGLE_BYTE, EUC-KR)
MODE 装载方式,字符串类型 IN表示载入,OUT表示载出,
OUTORA表示载出ORACLE (IN)
CLIENT_LOB 大字段目录是否在本地 (FALSE)
LOB_DIRECTORY 大字段数据文件存放目录
LOB_FILE_NAME 大字段数据文件名称,仅导出有效 (dmfldr.lob)
BUFFER_NODE_SIZE 读入文件缓冲区的大小 (10),有效值范围1~2048
LOG_SIZE 日志信息缓冲区的大小 (1),有效值范围1~100
READ_ROWS 工作线程一次最大处理的行数 (100000),最大支持2^26-10000
NULL_MODE 载入时NULL字符串是否处理为NULL
载出时空值是否处理为NULL字符串 (FALSE)
NULL_STR 载入时视为NULL值处理的字符串
SEND_NODE_NUMBER 运行时发送节点的个数 (20),有效值范围16~65535
TASK_THREAD_NUMBER 处理用户数据的线程数目,默认与处理器核数量相同,有效值范围1~128
BLDR_NUM 服务器BLDR数目 (64),有效值范围1~1024
BDTA_SIZE bdta的大小 (5000),有效值范围100~10000
COMPRESS_FLAG 是否压缩bdta (FALSE)
MPP_CLIENT MPP环境,是否本地分发 (TRUE)
SINGLE_FILE MPP/DPC环境,是否只生成单个数据文件(FALSE)
LAN_MODE MPP/DPC环境,是否以内网模式装载数据(FALSE)
UNREP_CHAR_MODE 非法字符处理选项(0),为0时表示跳过该数据行,为1时表示使用(*)替换错误字节
SILENT 是否静默方式装载数据(FALSE)
BLOB_TYPE BLOB类型字段数据值的实际类型,字符串类型 (HEX_CHAR)
HEX表示值为十六进制,HEX_CHAR表示值为十六进制字符类型
仅在direct=FALSE有效
OCI_DIRECTORY OCI动态库所在的目录
DATA 指定数据文件路径
ENABLE_CLASS_TYPE 允许用户导入CLASS类型数据 (FALSE)
FLUSH_FLAG 提交时是否立即刷盘 (FALSE)
IGNORE_BATCH_ERRORS 是否忽略错误数据继续导入 (FALSE)
SINGLE_HLDR_HP 是否使用单个HLDR装载HUGE水平分区表 (TRUE)
EP 指定需要发送数据的站点序号列表,仅向MPP/DPC环境导入数据时有效
PARALLEL 是否开启并行装载(FALSE)
SQL 使用自定义查询语句,仅导出模式有效
TABLE 导入/出表
ROW_SEPERATOR 行分隔符
FIELD_SEPERATOR 列分隔符
COMMIT_OPTION 提交选项(0), 0:每发送一批数据后提交, 1:发送完所有数据后提交
APPEND_OPTION 追加选项(0), 0: 追加方式, 1: 替代方式, 2: 插入方式
COLNAME_HEADING 是否在导出文件头中打印列名(FALSE)
IGNORE_AIMLESS_DATA 是否忽略无目标数据(FALSE)
LOB_AS_VARCHAR 是否将CLOB作为VARCHAR进行导入导出(FALSE)
LOB_AS_VARCHAR_SIZE 将CLOB作为VARCHAR进行导入导出时, lob数据最大大小(10)MB
LOG_LEVEL 记录错误数据信息级别(3), 0: 不记录 1: 只记录到log文件 2: 只记录到bad文件 3: 记录到log和bad文件
FLDR_INI 配置文件路径,字符串类型
HELP 打印帮助信息
8.2.2 重要参数
data: 指定数据文件,也可以在控制文件中 infile 子句指定数据文件。
指定数据文件的三种方式:
一是在控制文件中指定;
二是通过命令行参数 DATA 直接指定;
三是使用 dmfldr.ini 指定;
mode: 指定装载类型mode参数,IN/OUT,默认为IN。
control: 指定装载使用的控制文件。
8.2.3 dmfldr的控制文件
控制文件 CONTROL 是启动 dmfldr 必须要指定的参数,用于指定数据文件中数据的格式。在数据载入时,dmfldr 根据控制文件指定的格式来解析数据文件;导出数据时,dmfldr 也会根据控制文件指定的列分隔符、行分隔符等生成数据文件。
控制文件语法:
[OPTIONS(
<id>=<value>
……
)]
LOAD [DATA] #优先级高于options
INFILE < <file_option>|<directory_option> >
[BADFILE <path_name>]
[APPEND|REPLACE|INSERT]
<into_table_clause>
<into_table_clause> ::= <into_table_single>{<into_table_single>}
<into_table_single> ::=INTO TABLE [<schema>.]<tablename>
[EP <ep_option>]
[WHEN <field_conditions>]
[FIELDS [TERMINATED BY] [X] <delimiter>]
[<enclosed_option>] #设置封闭符,比如导出时字段加上双引号
[<coldef_option>]
说明:
1.关于 OPTIONS 选项,该选项支持命令行参数中除 userid,control,help 以外的所有参数的指定,每个参数值对使用空格或者换行分割。对于 option 中出现的参数,在 dmfldr 的指定执行参数中也出现的,dmfldr 会选择 option 中对应参数的值执行;
2.关于 APPEND|REPLACE|INSERT 选项,表示将数据装载时采用的加载方式。INSERT,插入方式,向空表插入新记录(如果不是空表则会报错无效的装载模式);APPEND,追加方式,为缺省方式,在表中追加新记录;REPLACE,替代方式,先清空表再插入新记录;
3.dmfldr 在处理数据文件中换行符时 windows 默认为 0x0D0A(\r\n),非windows 默认为 0x0A(\n),用户应该根据现有的数据文件中的换行符做相应的调整;
8.3 dmfldr使用示例
8.3.1 快速装载导出
mode=out
1.编写控制文件,emp.ctl
#用法1:导出所有字段,into从哪个表中导出
load data
infile 'emp.txt'
into table dmhr.employee
files ','
#用法2:导出部分字段
options
(character_code='UTF-8')
load data
infile 'emp.txt'
into table dmhr.employee
fields ','
(employee_id,
employee_name,
hire_date date format 'YYYYMMDD',
IDENTITY_CARD enclose by ''''
)
2.导出数据
dmfldr userid=jt/jiangtao.2023@localhost:5236 control=\'emp.ctl\' mode=\'OUT\'
8.3.2 指定数据文件装载
8.3.2.1 控制文件中定义列格式
1.创建test表
create table test(c1 int,c2 int,c3 date);
2.编辑数据文件test.txt,存放在/dm8/data/dmfldr/test.txt,内容如下:
1 1|2015-11-06
2 2|2015-11-05
3 3|2015-11-04
3.编辑控制文件test.ctl,存放路径为/dm8/data/dmfldr/test.ctl,内容如下:
LOAD DATA
INFILE '/dm8/data/dmfldr/test.txt'
INTO TABLE test
FIELDS '|'
(
C1 TERMINATED BY ' ',
C2,
C3 DATE FORMAT 'yyyy-mm-dd'
)
4.使用dmfldr进行数据载入
dmfldr userid=jt/jiangtao.2023@localhost:5236 control=\'/dm8/data/dmfldr/test.ctl\'
5.验证结果
select * from test;
8.3.2.2 控制文件不指定列格式
1.创建测试表dept
create table dept as select * from dmhr.department where 1=0;
2.编写数据文件dept.txt
101|总经理办|1001|1
102|行政部|1002|1
103|开发部|1003|1
104|市场部|1004|1
105|技术支持部|1005|1
201|总经理办|2001|2
202|行政部|2002|2
204|市场部|2004|2
301|总经理办|3001|3
302|行政部|3002|3
303|开发部|3003|3
304|市场部|3004|3
305|技术支持部|3005|3
3.编写控制文件dept.ctl
options
(errors=10
log='dept.log'
character_code='UTF-8')
LOAD DATA
INFILE '/dm8/data/dmfldr/dept.txt' str X '0a'
INTO TABLE DEPT
FIELDS '|'
4.使用dmfldr进行数据载入
dmfldr userid=jt/jiangtao.2023@localhost:5236 control=\'/dm8/data/dmfldr/dept.ctl\'
5.验证结果
select * from dept;
8.3.3 dmldrc和dmldrp用法
1.先启动dmldrp数据装载工具服务器
#启动时可以指定端口,不指定默认端口为8336
[dmdba@localhost bin]$ dmldrp
dmldrp V8
dmldrp is ready!
2.dmldrc连接dmldrp进行导入
dmldrc userid=dmtest/Dameng123 localhost:8336
control=\'/dm8/backup/dmfldr/dept.ctl\' mode=\'IN\'
8.3.4 大字段处理
dmfldr 支持所有 DM 数据库支持的列定义类型,包括字符串、数值、时间日期、时间日期间隔、大字段类型等。
若数据文件的编码方式与 DM 数据库服务器的编码方式不一样,dmfldr 还需要进行字符编码的转换。
dmfldr相关lob字段命令行参数:
[dmdba@localhost ~]$ dmfldr help|grep LOB
CLIENT_LOB 大字段目录是否在本地 (FALSE)
LOB_DIRECTORY 大字段数据文件存放目录
LOB_FILE_NAME 大字段数据文件名称,仅导出有效 (dmfldr.lob)
BLOB_TYPE BLOB类型字段数据值的实际类型,字符串类型 (HEX_CHAR)
LOB_AS_VARCHAR 是否将CLOB作为VARCHAR进行导入导出(FALSE)
LOB_AS_VARCHAR_SIZE 将CLOB作为VARCHAR进行导入导出时, lob数据最大大小(10)MB
1.创建测试表test_lob
--创建test_lob表
DROP TABLE TEST_LOB;
CREATE TABLE TEST_LOB(C1 INT,C2 BLOB,C3 CLOB);
--插入数据
INSERT INTO TEST_LOB VALUES(1,0XAB121032DE,'abcdefg');
INSERT INTO TEST_LOB VALUES(2,0XAB121032DE,'abcdefg');
commit;
2.编写控制文件test_lob.ctl,存放在/dm8/data/dmfldr/test_lob.ctl,内容如下:
#方式1:
LOAD DATA
INFILE '/dm8/data/dmfldr/test_lob.txt'
INTO TABLE test_lob
FIELDS '|'
(
C1,
C2,
C3
)
#方式2:不指定导出字段
LOAD DATA
INFILE '/dm8/data/dmfldr/test_lob.txt'
INTO TABLE test_lob
FIELDS '|'
3.使用dmfldr导出数据
#方式1:lob字段和导出的数据文件在一个目录
dmfldr userid=jt/jiangtao.2023@localhost:5236 control=\'/dm8/data/dmfldr/test_lob.ctl\' mode=\'out\'
#方式2:大字段数据文件存放目录
dmfldr userid=jt/jiangtao.2023@localhost:5236 control=\'/dm8/data/dmfldr/test_lob.ctl\' lob_directory=\'/dm8/data/dmfldr/\' lob_file_name=\'test_lob.lob\' mode=\'out\'
4.验证
[dmdba@localhost dmfldr]$ cat test_lob.txt
1|dmfldr.lob:0:5|dmfldr.lob:5:7
2|dmfldr.lob:12:5|dmfldr.lob:17:7
[dmdba@localhost dmfldr]$ strings dmfldr.lob
abcdefg
abcdefg
14.达梦DCP认证课程-达梦DBLINK
1.达梦dblink
1.1 创建dblink语法
语法:
CREATE [OR REPLACE] [PUBLIC] LINK <外部链接名> CONNECT ['<连接库类型>']
WITH <登录名> IDENTIFIED BY <登录口令> USING '<外部连接串>';
<连接库类型>::= DAMENG | ORACLE | ODBC | DPI
连接库类型说明:
DAMENG: 用于 DM->DM 之间数据库的连接,需要 DM 数据库配置和打开 MAL,不支持跨平台。
ORACLE: 用于 DM -> Oracle 数据库的链接;
ODBC: 通过 ODBC 接口创建 DM->其他数据库(DM、Oracle、Mysql、sql server 等)的连接,支持异构数据库的连接,支持跨平台。
DPI: 用于 DM->DM 之间数据库的连接,不需要特殊配置;新版本推荐此方式来创建DM->DM 之间的连接。支持不同平台间的数据库连接。
1.2 配置dblink
1.2.1 创建DPI类型dblink
用于 DM->DM 之间数据库的连接,不需要特殊配置。
创建dblink并查询测试:
create LINK DMLINK CONNECT 'DPI' WITH sysdba IDENTIFIED BY "jiangtao.2020" using '192.168.1.100:5236';
select * from v$instance@DMLINK;
1.2.2 创建ODBC类型dblink
通过 ODBC 接口创建 DM->其他数据库(DM、Oracle、Mysql、sql server 等)的连接,支持异构跨平台
1.解压
tar -xvf unixODBC-2.3.0.tar.gz
2.源码安装三部曲(配置、编译、安装)
#1).进入解压后的程序目录
cd unixODBC-2.3.0
#2).指定配置文件路径,进行配置
./configure --sysconfdir=/etc
#3).编译
make
#4).编译安装
make install
3.配置驱动信息odbcinst.ini和数据源信息odbc.ini
#查看配置信息
[root@localhost etc]# odbcinst -j
unixODBC 2.3.0
DRIVERS............: /etc/odbcinst.ini
SYSTEM DATA SOURCES: /etc/odbc.ini
FILE DATA SOURCES..: /etc/ODBCDataSources
USER DATA SOURCES..: /root/.odbc.ini
SQLULEN Size.......: 8
SQLLEN Size........: 8
SQLSETPOSIROW Size.: 8
#进行配置
[root@dmserver unixODBC-2.3.0]# cd /etc
[root@dmserver etc]# cat odbcinst.ini
[DM8 ODBC DRIVER]
Description = ODBC DRIVER FOR DM8
Driver = /dm8/bin/libdodbc.so
[root@dmserver etc]# cat odbc.ini
[DM8]
Description = DM ODBC DSN
Driver = DM8 ODBC DRIVER
SERVER = localhost
UID = SYSDBA
PWD = Dameng123
TCP_PORT = 5236
4.测试连接
#isql是odbc中的程序
[dmdba@localhost ~]$ isql dm8 -v
+---------------------------------------+
| Connected! |
| |
| sql-statement |
| help [tablename] |
| quit |
| |
+---------------------------------------+
SQL>
5.创建基于odbc的dblink并查询测试
create LINK ODBCLINK CONNECT 'ODBC' WITH sysdba IDENTIFIED BY Dameng123 using 'DM8';
select * from dmhr.EMPLOYEE@ODBCLINK;
1.2.3 创建oracle类型dblink
用于 DM -> Oracle 数据库的链接
1.安装oracle客户端,如果未安装需要进行如下配置:
1). 把 dblink*.tar.gz 复制到/lib64 目录下。
2). 解压:tar -zxvf dblink*.tar.gz
3). 运行:cd /lib64; ./run.sh
2.创建dblink并查询测试
create LINK ORACLELINK CONNECT 'ORACLE' WITH hr IDENTIFIED BY hr using '192.168.88.162/orcl';
select * from v$instance@oraclelink;
15.达梦数据库DCP课程-性能优化
1.实例优化
1.1 参数管理
例如,一个密集交易型数据库服务器配置如下:cpu8核、内存256G、磁盘1T
参数名 含义 优化建议 默认值 建议值
MEMORY_POOL 公共内存池,单位为M 高并发时应调大,避免频繁向os申请内存 80
N_MEM_POOLS 将公共内存池分片,减少并发访问冲突,单位为个 4
BUFFER 数据缓冲区,单位为M 如果数据量小于内存,则设置为数据量大小;否则设置为总内存的2/3比较合适 1000
BUFFER_POOLS buffer的分区数,一般配置为质数,取值范围为1-500,当max_buffer>buffer时,动态扩展的缓冲区不参与分区 并发较大的系统需要配置这个参数,减少数据缓冲区并发冲突,建议buffer=max_buffer 1
MAX_BUFFER 数据缓冲区扩展最大值 建议配置成=BUFFER 1000
RECYCLE 用于缓冲临时表空间,单位为M 高并发或大量使用with、临时表、排序等应该调大点 64
SORT_BUF_SIZE 排序缓存区,单位M 建索引时调大点,平时默认 2
CACHE_POOL_SIZE 用于缓存sql、执行计划、结果集等 一般配置1000M-4000M 10
DICT_BUF_SIZE 数据字典缓存区,单位M 用于缓存数据字典,默认为5M,系统中对象个数较多时适当加大 5
HJ_BUF_GLOBAL_SIZE 哈希连接使用的内存空间上限,单位为M 高并发、hash操作多应调大 500
HJ_BUF_SIZE 单个哈希连接使用的内存 有大表的hash连接应该调大 50 500
HAGR_BUF_GLOBAL_SIZE 聚集操作使用的内存上限,单位M 高并发、大量的聚集操作如sum等应调大 500 5000
HAGR_BUF_SIZE 单个聚集操作使用的内存 有大表的hash分组应调大 50 500
WORKER_THREADS 工作线程的个数 建议设置为cpu核数或其两倍 1-64 4 32
ENABLE_MONITOR 数据库系统监控的级别 性能优化时设置为3,运行时设置为2 2 2或3
OLAP_FLAG 启用联机分析处理,0:不启用,1:启用,2:不启用,同时倾向于使用索引范围扫描 联机交易系统建议设置为2,联机分析系统建议设置为1 0 2
OPTIMIZER_MODE 优化器计划探测模式,设置为1时,采用左深树方式探测,设置为0时,则采用卡特兰树方式进行探测 2016年以后的版本建议设置为1,采用新优化器 0 1
1.2 性能监控工具
1.2.1 AWR
1.初始化awr包
--初始化生成 dbms_workload_repository 包
sp_init_awr_sys(1);
2.设置间隔时间
--设置多长时间生成一次快照,单位为分钟
call dbms_workload_repository.awr_set_interval(10);
3.手动生成快照
Dbms_workload_repository.create_snapshot();
Dbms_workload_repository.create_snapshot();
4.生成awr报告
#查看快照的编号
Select * from Sys.wrm$_snapshot;
#把 snapshot 的 id 为 1,2 生成 awr 报告
sys.awr_report_html(1,2,'/home/dmdba','awr.html');
1.2.2 会话监控
sysobjects 可以用来模糊查询数据字典
v$event_name,v$session_event,v$system_event,V$sessions
锁查询
select o.name,l.* from v$lock l,sysobjects o where l.table_id=o.id and blocked=1;
事务等待
select * from v$trx_wait; --正在等待
select * from V$SESSION_WAIT_HISTORY; --等待历史
select * from GV$SESSION_WAIT_HISTORY --全局等待历史
sql监控
当 INI 参数 ENABLE_MONITOR=1、MONITOR_TIME=1 时,显示系统最近 1000 条执行时间超过预定值的SQL 语 句 。默认监控超过000毫秒的sql语句,可通过SP_SET_LONG_TIME 系统函数修改,通过 SF_GET_LONG_TIME 系统函数查看当前值。
相关视图: 保存长sql
SQL> select * from v$dynamic_tables where name like '%LONG%';
行号 NAME ID SCHNAME SYNONYMS
---------- ----------------------- ----------- ------- --------
1 V$LONG_EXEC_SQLS 433 SYS V$LES
2 V$SYSTEM_LONG_EXEC_SQLS 434 SYS V$SLES
相关参数: 控制长sql保存的条目
SQL> select para_name,para_value,para_type from v$dm_ini where para_name like '%LONG%';
行号 PARA_NAME PARA_VALUE PARA_TYPE
---------- ------------------------- ---------- ---------
1 LONG_EXEC_SQLS_CNT 1000 SYS --长sql保留条数,控制保存在V$LONG_EXEC_SQLS中的条数
2 SYSTEM_LONG_EXEC_SQLS_CNT 20 SYS --长sql保留条数,控制保存在V$SYSTEM_LONG_EXEC_SQLS中的条数
3 CTAB_WITH_LONG_ROW 0 SYS
相关函数: SF_GET_LONG_TIME、SP_SET_LONG_TIME
SQL> select * from v$ifun where name like '%LONG%';
行号 NAME ID ARG_NUM HAS_RT_FACT IS_READONLY IS_MPP_BRO IS_MPP_FORBIDEN IS_MOUNT_ONLY IS_INCLUDE_SQL EXTRA_ATTR CLASS$ COMMENT$ IS_LPQ_FORBIDDEN
---------- ---------------- ----------- ----------- ----------- ----------- ---------- --------------- ------------- -------------- ---------- ------------ -------- ----------------
1 SF_GET_LONG_TIME 774 0 Y Y N N N N NULL 系统函数 NULL N
2 SP_SET_LONG_TIME 773 1 Y N N N N N NULL 系统函数 NULL N
大内存的sql动态视图
V$LARGE_MEM_SQLS
V$SYSTEM_LARGE_MEM_SQLS
2.执行计划
2.1 条件查询谓词的选择率
SQL> select para_name,para_value,para_type,description from v$dm_ini where para_name like '%RATE%';
4 SEL_RATE_EQU 0.025000 SESSION Equal rate in selection
5 SEL_RATE_SINGLE 0.050000 SESSION Single rate in selection
2.2 如何查看执行计划
**方法1:**通过explain查看
SQL> explain select * from sysobjects;
1 #NSET2: [1, 2768, 396]
2 #PRJT2: [1, 2768, 396]; exp_num(17), is_atom(FALSE)
3 #CSCN2: [1, 2768, 396]; SYSINDEXSYSOBJECTS(SYSOBJECTS as SYSOBJECTS)
方式2: 通过manager管理工具查看
2.3 执行计划包含哪些信息
一个执行计划由若干个计划节点组成,每个计划节点中包含操作符(CSN2)和它的代价([0,2768,396])等信息
代价由一个三元组组成**[代价、记录行数、字节数]**
代价的单位是毫秒,记录行数表示该计划节点输出的行数,字节数表示该计划节点输出的字节数,解读一下上个查询中的第三个节点:操作符CSCN2即全表扫描,代价估值是0ms,扫描的记录行数是2768行,输出字节数是396个
2.4 表的路径访问
CSCN2: CLUSTER INDEX SCAN 的缩写即通过聚集索引扫描全表
SSEK2:Secondary index seek(定位),二级索引扫描即先扫描索引,再通过主键、聚集索引、ROWID 等信息去扫描表
CSEK2:聚集索引扫描只需要扫描索引,不需要扫描表
SSCN:secondary index scan,索引全扫描,不需要扫描表
CSEK2 : cluster index seek
FAGR:fast aggregation
SAGR:sort aggregation,流分组聚集,用于分组列没有索引只能走全表扫描的分组聚集
HAGR: hash分组聚集,用于分组列没有索引,只能走全表扫描的分组聚集
SORT:
3.sql优化
1.sql日志
--开启sql日志
SP_SET_PARA_VALUE(1,'SVR_LOG',1);
--关闭sql日志
SP_SET_PARA_VALUE(1,'SVR_LOG',0);
2.查看执行计划
explain查看预估执行计划
查看实际的执行计划:
set autotrace trace
set autotrace traceonly
3.dumpln 从缓冲区中 dump 实际的执行计划
SELECT sqlstr,cache_item from v$cachepln where sqlstr like '%t_testlock%';
alter session set events 'immediate trace name plndump level 140260322830448, dump_file
''/tmp/sqlplan.txt''';
4.ET函数,需要打开monitor_sql_exec参数
ET 是达梦数据库内置的SQL性能优化分析工具,它可以统计指定会话ID执行的SQL的所有操作符的执行时间,对于分析优化SQL提供比较直观的数据依据,对于达梦数据库SQL优化,ET的使用是必须要掌握的技能之一。
达梦数据库ET功能默认是关闭,需要设置ini参数,enable_monitor=1、monitor_time=1和monitor_sql_exec=1
--查看ET相关参数及其值
select para_name,para_value,para_type from v$dm_ini where para_name in ('ENABLE_MONITOR','MONITOR_TIME','MONITOR_SQL_EXEC')
--配置相关参数开启ET功能
SP_SET_PARA_VALUE(1,'ENABLE_MONITOR',1); #开启监视
SP_SET_PARA_VALUE(1,'MONITOR_SQL_EXEC',1); #监视SQL执行
SP_SET_PARA_VALUE(1,'MONITOR_TIME',1); #监视时间
--使用ET分析sql执行效率,语句的执行号为3105,可以通过ET(3105)的方式调用ET
SELECT D.* FROM DMTEST.EMPLOYEES E, DMTEST.DEPT_EMP D WHERE D.EMP_NO = E.EMP_NO LIMIT 10;
ET(3105);
5.dbms_sqltune,需要打开monitor_sql_exec参数
SQL> set long 50000
SQL> select dbms_sqltune.report_sql_monitor(sql_exec_id=>4030);
4.表连接
4.1 嵌套循环连接
nest loop原理:
两层嵌套循环结构,有驱动表和被驱动表之分
选定一张表作为驱动表,遍历驱动表中的每一行,根据连接条件去匹配第二张表中的行。驱动表的行数就是循环的次数,这个很大程度上影响执行效率。
需要注意的问题:
选择小表作为驱动表。统计信息尽量准确,保证优化器选对驱动表。
大量的随机读。如果没有索引,随机读很致命,每次循环只能读一块,不能读多块。使用索引可以解决这个问题。
使用场景:
驱动表有很多的过滤条件
表连接条件能使用索引
结果集比较小
4.2 哈希连接
hash join的特点:
一般没索引或用不上索引时会使用该连接方式
选择小的表或row source做hash表
只使用等值连接中的情形
原理:
使用较小的row source作为hash table和bitmap.而第二个row source被hashed,根据bitmap与第一row source生成的hash table相匹配,bitmap查找的速度极快。
hash连接比较消耗内存,如果系统有很多这种连接时,需要调整以下3个参数:
HJ_BUF_GLOBAL_SIZE/HJ_BUF_SIZE/HJ_BLK_SIZE
4.3 归并排序连接
merge sort特点:
无驱动表之分,随机读很少
两个表都需要按照连接列排序,需要消耗大量的cpu和额外的内存
应用场景:
通常情况下,merge sort join需要消耗大量的cpu和内存,效率都不会太高,如果存在相关索引可以消除sort,那么cbo可能会考虑该连接方式。
16.达梦DCP认证课程-DM数据守护和读写分离集群
1.DM数据库守护
1.1 常见术语
数据库守护DM watch,类似于oracle dg
数据库模式:
normal模式、primary模式、standby模式
数据库状态:
open状态、mount状态、suspend状态
邮件系统(MAL系统):
MAL系统是一个内部高速通信系统,基于TCP/IP协议实现。
OGUID:
数据库守护唯一标识码,用来标识、校验,相同OGUID值的实例。
1.2 数据守护配置
1.2.1 配置规划
MAL_INST_NAME MAL_INST_HOST MAL_INST_PORT MAL_INST_DW_PORT MAL_HOST MAL_PORT MAL_DW_PORT
DM01 192.168.88.2 5236 5238 192.168.88.2 15236 15238
DM02 192.168.88.3 5236 5238 192.168.88.3 15236 15238
1.2.2 配置文件
mal.ini配置(主备配置相同):
MAL_CHECK_INTERVAL = 5 #MAL链路检测时间间隔
MAL_CONN_FAIL_INTERVAL = 5 #判定 MAL 链路断开的时间
[MAL_INST1]
MAL_INST_NAME = DM01 #实例名,和 dm.ini 中的 INSTANCE_NAME 一致
MAL_HOST = 192.168.88.2 #MAL系统监听TCP连接的IP地址
MAL_PORT = 15236 #MAL系统监听TCP连接的端口
MAL_INST_HOST = 192.168.88.2 #实例的对外服务 IP 地址
MAL_INST_PORT = 5236 #实例的对外服务端口,和dm.ini中的PORT_NUM 一致
MAL_DW_PORT = 15238 #实例本地的守护进程监听 TCP 连接的端口
MAL_INST_DW_PORT = 5238 #实例监听守护进程 TCP 连接的端口
[MAL_INST2]
MAL_INST_NAME = DM02 #实例名,和 dm.ini 中的 INSTANCE_NAME 一致
MAL_HOST = 192.168.88.3 #MAL系统监听TCP连接的IP地址
MAL_PORT = 15236 #MAL系统监听TCP连接的端口
MAL_INST_HOST = 192.168.88.3 #实例的对外服务 IP 地址
MAL_INST_PORT = 5236 #实例的对外服务端口,和dm.ini中的PORT_NUM 一致
MAL_DW_PORT = 15238 #实例本地的守护进程监听 TCP 连接的端口
MAL_INST_DW_PORT = 5238 #实例监听守护进程 TCP 连接的端口
dmarch.ini(主备的归档配置不同):
[ARCHIVE_REALTIME]
ARCH_TYPE = REALTIME #实时归档类型
ARCH_DEST = DM02 #实时归档目标实例名(主机和备份配置不同,配置向备机同步)
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL #本地归档类型
ARCH_DEST = /dm8/data/DAMENG/arch #本地归档文件存放路径
ARCH_FILE_SIZE = 128 #单位 Mb,本地单个归档文件最大值
ARCH_SPACE_LIMIT = 0 #单位 Mb,0 表示无限制,范围 1024~4294967294M
dmwatcher.ini:
[GRP1]
DW_TYPE = GLOBAL #全局守护类型
DW_MODE = AUTO #自动切换模式
DW_ERROR_TIME = 10 #远程守护进程故障认定时间
INST_RECOVER_TIME = 60 #主库守护进程启动恢复的间隔时间
INST_ERROR_TIME = 10 #本地实例故障认定时间
INST_OGUID = 8888 #守护系统唯一OGUID 值(这里要和数据库的 OGUID 一致,OGUID 是写入控制文件的)
INST_INI = /dm8/data/DAMENG/dm.ini #dm.ini 配置文件路径
INST_AUTO_RESTART = 1 #打开实例的自动启动功能
INST_STARTUP_CMD = /dm8/bin/dmserver #命令行方式启动
RLOG_SEND_THRESHOLD = 0 #指定主库发送日志到备库的时间阀值,默认关闭
RLOG_APPLY_THRESHOLD = 0 #指定备库重演日志的时间阈值,默认关闭
1.2.3 配置步骤
类似于oracle的冷备份搭建dg
1、主库配置dm.ini、dmmal.ini、dmarch.ini、dmwatcher.ini,dm.ini中需要开启归档归档和MAL:
ALTER_MODE_STATUS = 0 #不允许手工方式修改实例模式/状态/OGUID
ENABLE_OFFLINE_TS = 2 #不允许备库 OFFLINE 表空间
MAL_INI = 1 #打开 MAL 系统
ARCH_INI = 1 #打开归档配置
2、关闭主库,使用rman备份主库
rman> backup database 'dm.ini' backupset '/dm8/backup/fullbak'
3、拷贝备份到备库上进行还原,还原后更新数据库魔数
#拷贝备份
scp -r /dm8/backup/fullbak db02:/dm8/
#使用rman进行恢复
rman> restore database to '/dm8/data/DAMENG' from backupset '/dm8/backup/fullbak';
#有dm.ini的rman恢复方法
rman> restore database '/dm8/data/DAMENG/dm.ini' from backupset '/dm8/backup/fullbak';
#更新魔数,一定要更新,否则数据不同步
rman> recover database '/dm8/data/DAMENG/dm.ini' update db_magic;
#查询数据库魔数
select db_magic from v$rlog;
4、拷贝主库的dmmal.ini、dmarch.ini、dmwatcher.ini参数到备库,并进行修改
#拷贝参数文件
scp dmmal.ini dmarch.ini dmwatcher.ini db02:/dm8/data/DAMENG
#修改dmarch.ini参数
ARCH_DEST = DM01
5、主库启动到mount状态,修改oguid为8888,数据库模式为primary
#启动主库到mount状态
dmserver /dm8/data/DAMENG/dm.ini mount
#修改主库的OGUID为8888
SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);
sp_set_oguid(8888);
SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);
#修改数据库模式为primary
alter database primary;
#查看数据库模式
select instance_name,status$,mode$ from v$instance;
6、备库启动到mount状态,修改oguid为8888,数据库模式为standby
#启动备库到mount状态
dmserver /dm8/data/DAMENG/dm.ini mount
#修改备库的OGUID为8888
SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);
sp_set_oguid(8888);
SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);
#修改数据库模式为standby
alter database standby;
#查看数据库模式
select instance_name,status$,mode$ from v$instance;
7、启动主库、备库的数据守护(dmwatcher)
数据守护启动成功后,集群配置正常的话,主备库会自动打开
dmwatcher dmwatcher.ini
8、查询验证主备同步
在主机上创建表,并插入数据提交,在备机上查询数据是否可以正常查询,如果正常说明主备同步正常。查看主机的归档状态,VALID 也说明主备同步正常。
select * from v$arch_status;
9、配置监视器参数dmmonitor.ini
监视器中的 OGUID 要与数据库设置的一致。配置数据守护 dmwatcher的 IP 和端口
MON_DW_CONFIRM = 1
MON_LOG_PATH = /dm8/log
MON_LOG_INTERVAL = 60
MON_LOG_FILE_SIZE = 32
MON_LOG_SPACE_LIMIT = 0
[GRP1]
MON_INST_OGUID = 8888
MON_DW_IP = 192.168.88.2:15238
MON_DW_IP = 192.168.88.3:15238
10、启动监视器
监视器上可以查看集群的状态,监视器可以是一台单独的服务器,可以不创建实例
dmmonitor /dm8/data/dmmonitor.ini
11、监视器常用命令
help #显示帮助信息
show global info #显示所有组的全局信息
show [group_name] #显示指定组的详细信息,如果未指定组,则显示所有组
choose swithover [group_name] #选择可以切换为primary库的备库列表
login [/@service_name] #登录监视器,登录使用的用户密码为数据库的
switchover
12、主备切换
show
choose switchover
#使用sysdba用户登录监视器
login
#执行切换
switchover
13、主备库注册数据守护、实例为linux系统服务
#切换目录
[root@localhost dm8]# cd /dm8/script/root/
[root@localhost root]# ll
总用量 48
-rwxr-xr-x 1 dmdba dinstall 29104 3月 20 14:30 dm_service_installer.sh
-rwxr-xr-x 1 dmdba dinstall 10155 3月 20 14:30 dm_service_uninstaller.sh
-rwxr-xr-x 1 dmdba dinstall 579 3月 20 14:30 root_installer.sh
#帮助信息
[root@localhost root]# ./dm_service_installer.sh -h
Usage: dm_service_installer.sh -t service_type [-p service_name_postfix] [-dm_ini dm_ini_file]
[-watcher_ini watcher_ini_file ] [-monitor_ini monitor_ini_file] [-cssm_ini cssm_ini_file]
[-dfs_ini dfs_ini_file] [-dcr_ini dcr_ini_file]
[-dss_ini dss_ini_file] [-drs_ini drs_ini_file] [-dras_ini dras_ini_file] [-dcs_ini dcs_ini_file] [-server server_info]
[-dmap_ini dmap_ini_file] [-dpc_mode SP|MP|BP] [-m open|mount] [-y dependent_service] [-auto true|false]
or dm_service_installer.sh [-s service_file_path]
or dm_service_installer.sh -h
-t 服务类型,包括dmimon,dmap,dmserver,dmwatcher,dmmonitor,dmcss,dmcssm,dmasmsvr,dmasmsvr3,dmdcs,dmdrs,dmdras,dmdss
-p 服务名后缀,对于dmimon,dmap服务类型无效
-dm_ini dm.ini文件路径
-watcher_ini dmwatcher.ini文件路径.
-monitor_ini dmmonitor.ini文件路径.
-dcr_ini dmdcr.ini文件路径.
-cssm_ini dmcssm.ini文件路径.
-dss_ini dss.ini文件路径.
-drs_ini drs.ini文件路径.
-dras_ini dras.ini文件路径.
-dcs_ini dcs.ini文件路径.
-dfs_ini dfs.ini文件路径.
-dmap_ini dmap.ini文件路径.
-dpc_mode DPC节点类型.
-server 服务器信息(IP:PORT)
-auto 设置服务是否自动启动,值为true或false,默认true.
-m 设置服务器启动模式open或mount,只针对dmserver服务类型生效,可选
-y 设置依赖服务,此选项只针对systemd服务环境下的dmserver,dmasmsvr,dmasmsvr3服务生效
-s 服务脚本路径,设置则忽略除-y外的其他参数选项
-h 帮助
#注册数据库实例服务
./dm_service_installer.sh -t dmserver -p DM01 -dm_ini /dm8/data/DAMENG/dm.ini
#注册dmwatcher服务
./dm_service_installer.sh -t dmwatcher -p DM01 -watcher_ini /dm8/data/DAMENG/dmwatcher.ini
#注册monitor服务
./dm_service_installer.sh -t dmmonitor -p DM01 -monitor_ini /dm8/data/DAMENG/dmmonitor.ini
14.可以配置一个非确认监视器,用于登录监视器查看主备状态
#单独创建一个dmmonitor.ini
MON_DW_CONFIRM = 0 #设置为0,非确认监视器
MON_LOG_PATH = /dm8/log
MON_LOG_INTERVAL = 60
MON_LOG_FILE_SIZE = 32
MON_LOG_SPACE_LIMIT = 0
[GRP1]
MON_INST_OGUID = 8888
MON_DW_IP = 192.168.88.2:15238
MON_DW_IP = 192.168.88.3:15238
#启动非确认监视器
dmmonitor /dm8/data/dmmonitor.ini
2 读写分离集群
2.1 配置读写分离集群
可以使用DEM 搭建或手工搭建
2.2 读写分离集群接口配置
dm网络连接配置:
[dmdba@localhost ~]$ cat /etc/dm_svc.conf
TIME_ZONE=(480)
LANGUAGE=(cn)
DMTEST=(192.168.88.6:5238)
DM=(192.168.88.5:5236)
DMG=(192.168.88.2:5236,192.168.88.3:5236)
jdbc接口配置:
rwSeparate:取值 0 和 1,默认 0,表示不使用读写分离方式
rwPercent: 取值大于 0,默认值 0.75。值越大,表示主机分配的事务数比例越多。
<DRIVER>dm.jdbc.driver.DmDriver</DRIVER>
<URL>jdbc:dm://DMG?rwSeparate=1&rwPercent=1</URL>
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




