@达梦

我的达梦DCA培训笔记

感谢达梦大学给予我三天时间的培训。新冠疫情期间,不能到现场开展面对面的学习,单依然无法阻挡我们学习达梦数据库基础运维的热情。

感谢我们的王文欢老师、李梦等老师的辛勤付出。

达梦数据库培训(DCA)

2020年8月3日-8月5日

47931966 / whdbalan
DCA 入门级别 单机
数据库的行情:
关系型
Oracle 11G,12C(12.1,12.2),18C(12.2.0.2) 机器学习,安全,CDB、PDB
MySQL 5.6 5.7 5.8 互联网 SUN
SQL Server SQL 2008 2014 办公厅
DB2 9.0 10.0 (仓库) 邮政
Sybase 12.5 sap收购 SybaseIQ (数据仓库)
Infomax 11.0
PostGreSQL 开源 9 10
达梦DM7 自主原创 安全四级 EAL4 军用B+
人大金仓 7 postgreSQL 人民大学
南大通用 8a 8t
神舟通用 7 航天 审计

非关系型
内存:
Timesten oracle 计费
SAP hana 农夫山泉 苏宁 税务
Hbase 2.8 列存
Spark 内存分析
Mongodb 3.6 斗鱼
巨杉 (mongodb)
图数据库

安装:
安装准备工作:
OS
UNIX Win Lin
UNIX:AIX 7、HP/UX、Solaris 版本(申请)
Win : 2008 2012 10 7
Lin:{sysv :redhat centos 中标、凝思 官网测试
Bsd:suse ubutu(桌面、服务器)(申请)

存储:磁盘阵列 FC-SAN ip-san IB
Raid (0、1、5、6、10、50)
EMC DELL IBM 浪潮 曙光 联想 华为 H3C HP

网络{IP地址(ABC)、路由协议、网络设备
192.168.1.0/27
255.255.255.224 256-224=32 64
192.168.1.2 /27 192.168.1.35/27
静态路由 动态路由 rip OSPF bgp IS-IS
思科、(思科和浪潮)、华为、中兴、烽火
防火墙:ASA、华赛、启明星辰、juniper、联想网域、神州数码

安装的步骤:
创建用户
[root@dmedu /]# groupadd dinstall
[root@dmedu /]# useradd -g dinstall dmdba
[root@dmedu /]# passwd dmdba
规划安装路径
[root@dmedu /]# mkdir dm7
[root@dmedu /]# ls -dl /dm7
drwxr-xr-x 2 root root 4096 3月 19 22:09 /dm7
[root@dmedu /]# chown dmdba.dinstall -R /dm7
[root@dmedu /]# ls -dl /dm7
drwxr-xr-x 2 dmdba dinstall 4096 3月 19 22:09 /dm7
设置环境变量(可以不做设置)
cd /home/dmdba; vim .bash_profile
export DM_HOME=/dm7
export PATH= D M H O M E / b i n : DM_HOME/bin: DMH​OME/bin:PATH: H O M E / b i n : HOME/bin: HOME/bin:DM_HOME/tool

[root@dmedu dmdba]# cd /etc/security/
[root@dmedu security]# vim limits.conf
dmdba soft nofile 4096
dmdba hard nofile 65536
安装
[root@dmedu opt]#mount -o loop dm7_setup_rh6_64_ent_20180130.iso /mnt
[root@dmedu opt]# mount -l
tar.gz 解压缩解包 tar -zxf ……tar.gz
zip 解压unzip ….zip
xz / tar.bz2
安装程序:DMInstall.bin
[root@dmedu mnt]# xhost +
access control disabled, clients can connect from any host
[root@dmedu mnt]# su - dmdba
[dmdba@dmedu ~]$ cd /mnt
[dmdba@dmedu mnt]$ ./DMInstall.bin
熟悉安装路径下目录的作用:
[dmdba@dmedu mnt]$ cd /dm7/
bin 达梦常用的命令和动态链接库 .so
include 数据库头文件
log 日志 {数据库运行过程中工具产生的日志、运行过程中出错,产生的日志、安装是生成的日志}
tool 常用的客户端工具
bin2
jar jar包 数据快速加载,导入导出、logmnr{日志挖掘工具}
uninstall / uninstall.sh 卸载达梦数据库的
desktop 桌面
jdk java环境
doc 帮助文档{联机手册}
samples 示例库{图书管理、达梦人力资源管理}
web DEM{利用web部署和维护数据库}部署dem需要中间件(tomcat) 配置代理agent
drivers 驱动
license_zh.txt / release_zh.txt 许可信息和版本信息
script 脚本
补充: ./DMInstall.bin -i 命令行安装
创建数据库 dbca.sh
[dmdba@dmedu ~]$ dbca.sh
-bash: dbca.sh: command not found
[dmdba@dmedu ~]$ cd
[dmdba@dmedu ~]$ source .bash_profile
dbca.sh create database
database—tablespace—segment–cluster—page
cluster — extent 申请空间的最小的逻辑单位
page ----block 存放数据的最小的逻辑单位
dminit 创建达梦数据库 (命令行)
注册数据库服务到OS(可选)
[root@dmedu root]# cd /dm7/script/root
[root@dmedu root]# ./dm_service_installer.sh -t DMSERVER -i /dm8/WUHAN/dm.ini -p DMSERVER
DM服务查看器(启动和关闭数据库)
测试
说明:Oracle通sid识别数据库,达梦是通过端口号,MySQL利用port_number
disql DM管理工具
[dmdba@dmedu ~]$ ps -ef|grep dmserver
dmdba 7350 1 0 Mar19 pts/0 00:00:05 /dm7/bin/dmserver /dm7/data/DAMENG/dm.ini -noconsole
dmdba 7761 1 0 Mar19 ? 00:00:04 /dm7/bin/dmserver /dm8/WUHAN/dm.ini -noconsole
[dmdba@dmedu ~]$ netstat -ntl |grep 523*
5236:
[dmdba@dmedu ~]$ disql
disql V7.1.6.43-Build(2018.01.29-88741)ENT
用户名:sysdba
密码:
5237:
[dmdba@dmedu ~]$ disql sysdba/SYSDBA@127.0.0.1:5237

体系结构
DMserver的构成: client + server
Server:数据库(database)+实例(instance)

数据库database:
数据文件: datafile 用户数据
SQL> select path from v d a t a f i l e ; 联 机 重 做 日 志 文 件 : r e d o l o g 存 放 的 是 用 户 对 数 据 库 做 改 变 的 数 据 S Q L > s e l e c t p a t h f r o m v datafile; 联机重做日志文件: redolog 存放的是用户对数据库做改变的数据 SQL> select path from v datafile;联机重做日志文件:redolog存放的是用户对数据库做改变的数据SQL>selectpathfromvrlogfile;
补充:
SQL> alter database add logfile ‘/dm7/data/DAMENG/DAMENG03.log’ size 256;
SQL> select rlog_size/1024/1024 from v r l o g f i l e ; r e d o l o g 特 点 : 循 环 写 , 重 复 写 注 意 事 项 : 达 梦 不 支 持 a l t e r d a t a b a s e d r o p l o g f i l e O r a c l e 支 持 : a l t e r d a t a b a s e d r o p l o g f i l e … 控 制 文 件 : 比 较 : o r a c l e : 数 据 库 的 物 理 架 构 、 S C N 、 归 档 文 件 信 息 、 r m a n 备 份 的 元 数 据 达 梦 : 物 理 架 构 信 息 、 数 据 库 的 版 本 信 息 、 数 据 库 的 名 等 S Q L > s e l e c t p a r a n a m e , p a r a v a l u e f r o m v rlogfile; redolog特点:循环写,重复写 注意事项:达梦不支持alter database drop logfile Oracle支持:alter database drop logfile … 控制文件: 比较: oracle :数据库的物理架构、SCN、归档文件信息、rman备份的元数据 达梦:物理架构信息、数据库的版本信息、数据库的名等 SQL> select para_name,para_value from v rlogfile;redolog特点:循环写,重复写注意事项:达梦不支持alterdatabasedroplogfileOracle支持:alterdatabasedroplogfile…控制文件:比较:oracle:数据库的物理架构、SCN、归档文件信息、rman备份的元数据达梦:物理架构信息、数据库的版本信息、数据库的名等SQL>selectparan​ame,parav​aluefromvdm_ini where para_name=‘CTL_PATH’;

转换达梦控制文件为文本文件
dmctlcvt type=1 src=/dm7/data/DAMENG/dm.ctl dest=/tmp/dm.txt
自动备份:
SQL> select para_name,para_value from v$dm_ini where para_name like ‘%CTL%’;
1 CTL_PATH /dm7/data/DAMENG/dm.ctl
2 CTL_BAK_PATH /dm7/data/DAMENG/ctl_bak
3 CTL_BAK_NUM 10

配置文件:数据文配置,归档配置、数据守护配置等
key—value
dm.ini 参数文件
修改参数:
Oracle: alter system set parameter_name=values;(动态、静态)
达梦:sp_set_para_value();
select para_name,para_value from vKaTeX parse error: Expected 'EOF', got '#' at position 210: …root@dmedu etc]#̲ ipcs -a Buffer…dm_ini where para_name=‘BUFFER’; 查看大小
行号 PARA_NAME PARA_VALUE


1 BUFFER 636
SQL> select para_name,para_value from v d m i n i w h e r e p a r a n a m e = ′ B U F F E R P O O L S ′ ; 1 B U F F E R P O O L S 19 S Q L > s e l e c t p a r a n a m e , p a r a v a l u e f r o m v dm_ini where para_name='BUFFER_POOLS'; 1 BUFFER_POOLS 19 SQL> select para_name,para_value from v dmi​niwhereparan​ame=′BUFFERP​OOLS′;1BUFFERP​OOLS19SQL>selectparan​ame,parav​aluefromvdm_ini where para_name=‘MAX_BUFFER’;


1 MAX_BUFFER 1272
数据块状态
free clean dirty pins/pending
如何找
LRU链表(最近做少使用)

遇到脏数据?把脏数据在LRU链表上摘取,挂到检查点队列的链表上。触发检查点操作,把脏数据写磁盘
v$buffer

字典缓冲区 最近使用的数据字典及最近的数据定义
动态性能视图 v$ x$ 动态性能视图查看到的数据来自于内存
数据字典 dba_ all_ user_ sys… 数据来自于系统表空间(一个文件)
select name from abc where id=100;
语法分析,语义分析,权限判断等….
SQL> select para_name,para_value from v$dm_ini where para_name LIKE ‘%DICT%’;
行号 PARA_NAME PARA_VALUE


1 DICT_BUF_SIZE 5
redolog buffer 改变的数据块
redolog buffer block ------->redolog
3秒
commit
oracle:3 1 1/3 commit
LOG_BUF_SIZE: 设置大小要设置成2的幂,单位是page
SQL缓冲区 最近试用的SQL或者PL/SQL代码(hash)及SQL语句的执行计划
LRU 最近做少使用
8:50 Session1:select name from abc where id=100;
8:55 Session2: select name from abc where id=100;
CACHE_POOL_SIZE
SQL> select para_name,para_value from v$dm_ini where para_name LIKE ‘%USE%’;
行号 PARA_NAME PARA_VALUE


1 USE_PLN_POOL 1
参数1,2表示可以重用执行计划,0表是不重用
排序区 数据排序 order by …
如果排序区空间不够?把部分排序转到磁盘的临时表空间上
SORT_BUF_SIZE
Hash区 多表连接做hash join 使用的区域
HJ_BUF_SIZE
Memory pool 减少数据库和系统之间的system call
Memory_target 限制上线

线程
查看
[root@dmedu vm]# ps -ef|grep dmserver 2600
[root@dmedu vm]# top -p 2600 -H
线程的意义
监听线程 5236 检测外部连接
IO线程 刷脏数据
工作线程 处理数据库任务(领取任务,执行任务)
调度线程 清洁工(清理缓存),唤醒工作线程
日志重做 数据库异常关闭,下次启动数据库的时候,利用redolog,构造脏数据
日志刷新 把日志缓冲区的数据块写到redolog中
日志归档 生成归档副本
SQL> select name ,thread_desc from v$threads;

补充:会话
数据库允许的做大的session数
MAX_SESSIONS sp_set_para_value();
结束一个正在连接会话
Oracle:alter system kill session ();
达梦:
SQL> select sess_id,create_time,user_name from v s e s s i o n s ; s p c l o s e s e s s i o n ( ) ; v sessions; sp_close_session(); v sessions;spc​loses​ession();vconnect

实例管理
实例的状态
SQL> select instance_name,status$ from v i n s t a n c e ; 达 梦 : d o w n m o u n t o p e n s u s p e n d O p e n − − − m o u n t : S Q L > a l t e r d a t a b a s e m o u n t ; M o u n t − − − o p e n : S Q L > a l t e r d a t a b a s e o p e n ; O p e n − − − s u s p e n d S Q L > a l t e r d a t a b a s e s u s p e n d ; S u s p e n d − − − o p e n S Q L > a l t e r d a t a b a s e o p e n ; O r a c l e : d o w n n o m o u n t m o u n t o p e n r e a d o n l y 数 据 库 的 状 态 n o r m a l s t a n d b y p r i m a r y 打 开 实 例 前 台 : d m s e r v e r d m s e r v e r / d m 7 / d a t a / D A M E N G / d m . i n i 指 i n i 的 路 径 后 台 脚 本 : [ d m d b a @ d m e d u i n i t . d ] instance; 达梦:down mount open suspend Open---mount: SQL> alter database mount; Mount --- open : SQL> alter database open; Open --- suspend SQL> alter database suspend; Suspend --- open SQL> alter database open; Oracle:down nomount mount open readonly 数据库的状态 normal standby primary 打开实例 前台:dmserver dmserver /dm7/data/DAMENG/dm.ini 指ini的路径 后台脚本: [dmdba@dmedu init.d] instance;达梦:downmountopensuspendOpen−−−mount:SQL>alterdatabasemount;Mount−−−open:SQL>alterdatabaseopen;Open−−−suspendSQL>alterdatabasesuspend;Suspend−−−openSQL>alterdatabaseopen;Oracle:downnomountmountopenreadonly数据库的状态normalstandbyprimary打开实例前台:dmserverdmserver/dm7/data/DAMENG/dm.ini指ini的路径后台脚本:[dmdba@dmeduinit.d] service DmServiceDMSERVER start/stop/restart
[dmdba@dmedu init.d]$ /etc/rc.d/init.d/DmServiceDMSERVER restart
RHEL7:systemctl
down—open
down—mount 根据dm.ini分配共享内存,启动后台线程.根据dm.ini中的CTL_PATH,打开控制文件
mount –- open 根据控制文件,打开机器上所有的数据文件和重做日志文件
关闭实例
前台 : exit
后台脚本:
[dmdba@dmedu init.d]$ service DmServiceDMSERVER stop
[dmdba@dmedu init.d]$ /etc/rc.d/init.d/DmServiceDMSERVER stop

脚本如何生成:注册数据库服务
dbca.sh 注册
[root@dmedu root]# cd /dm7/script/root
[root@dmedu root]# ./dm_service_installer.sh -t DMSERVER -i /dm8/WUHAN/dm.ini -p DMSERVE
查看:[dmdba@dmedu init.d]$ chkconfig --list|grep Dm
开机不启动:
[root@dmedu 2605]# chkconfig --level 2345 DmServiceDMSERVER off
开机启动:
[root@dmedu 2605]# chkconfig --level 2345 DmServiceDMSERVER on

表空间
物理结构
block(DMASM,raw,NFS,GFS,ext,fat,ntfs,xfs)----file
逻辑结构
database----tablespace(容器)—segment—extent—block

达梦表空间有哪些?
SQL> select tablespace_name from dba_tablespaces;
行号 TABLESPACE_NAME


1 SYSTEM 数据字典
2 ROLL 回滚段 MVCC
3 TEMP 临时段
4 MAIN 默认表空间
5 HMAIN HUGE 表空间

SQL> select name from v$tablespace;
行号 NAME


1 SYSTEM
2 ROLL
3 TEMP
4 MAIN
SQL> select name from v$huge_tablespace;
行号 NAME


1 HMAIN
创建?
语法:create tablespace tablespace_name datafile ‘…’ size …;
SQL> create tablespace tbs datafile ‘/dm7/data/DAMENG/tbs01.dbf’ size 31;
1 行附近出现错误[-2410]:数据文件[/dm7/data/DAMENG/tbs01.dbf]大小无效.
达梦:表空间初始文件大小要是page*4096
SQL> select page;
行号 PAGE


1 8192
SQL> select 81924096/1024/1024;
行号 8192
4096/1024/1024


32
SQL> create tablespace tbs datafile ‘/dm7/data/DAMENG/tbs01.dbf’ size 32;

创建表空间要给表空间设定上线。
SQL> create tablespace tbs1 datafile ‘/dm7/data/DAMENG/tbs.dbf’ size 32 autoextend on maxsize 2048;
SQL> create tablespace tbs2 datafile ‘/dm7/data/DAMENG/tbs2.dbf’ size 32 autoextend on maxsize 33;
SQL> create table test tablespace tbs2 as select * from sysobjects;
SQL> select table_name,tablespace_name from dba_tables where table_name=‘TEST’;
行号 TABLE_NAME TABLESPACE_NAME


1 TEST TBS2

创建表空空间,含有多个数据库文件,数据文件分散存放。
SQL> create tablespace tsb3 datafile ‘/dm7/data/DAMENG/tbs/disk1/tbs3_01.dbf’ size 32,’/dm7/data/DAMENG/tbs/disk2/tbs3_02.dbf’ size 32;
下次申请空间是多少?区大小如何获取。
SQL> select sf_get_extent_size(); 16 page
SQL> select page; 8192
Oracle: 统一区大小,系统管理区大小
每次分配1m的空间。
SQL> create tablespace tbs4 datafile ‘/dm7/data/DAMENG/tbs/tbs04.dbf’ size 32 autoextend on next 1;

5G数据导入?规划一个表空间?
create tablespace tbs4 datafile ‘/dm7/data/DAMENG/tbs/tbs04.dbf’ size 32 autoextend on maxsize 20480;

create tablespace tbs4 datafile ‘/dm7/data/DAMENG/tbs/tbs04.dbf’ size 5120 autoextend on maxsize 20480;

维护表空间?
表空间不足
创建大的,数据导入导出
更改数据文件大小 resize
SQL> alter tablespace tbs1 resize datafile ‘/dm7/data/DAMENG/tbs.dbf’ to 100;
增加数据文件
SQL> alter tablespace tbs2 add datafile ‘/dm7/data/DAMENG/tbs2_01.dbf’ size 32 autoextend on maxsize 100;
SQL> select file_id,tablespace_name,bytes/1024 from dba_free_space;
更换存储位置
(同库)
假设表空间大小为800G,存储为1T,为了防止表空间增长,导致存储满,把表空间移到2T的存储上。
补充:表空间的状态 offline online
Oracle: offline online readonly
SQL> alter tablespace tbs4 offline;
注意事项:system roll temp
SQL> alter tablespace tbs4 rename datafile ‘/dm7/data/DAMENG/tbs/tbs04.dbf’ to ‘/dm7/data/DAMENG/tbs/disk1/tbs04.dbf’; (改控制文件)
Oracle:alter database rename file ‘’ to ‘’;
SQL> alter tablespace tbs4 online;
(跨库)
达梦:导入导出
Oracle: 导入导出,传输表空间
删除
SQL> drop tablespace tbs4;
SQL> drop tablespace tbs2;
[-3412]:试图删除已经使用的表空间.

用户管理
达梦用户
SQL> select username from dba_users;
SYS 内置管理用户(不能登录数据库)
SYSAUDITOR 审计员(审计)
SYSDBA 数据库管理员
SYSSSO 安全员(安全版)
标准版(不能用数据的高级功能,例如集群)、企业版(支持集群(授权)等高级功能功能,不支持强制安全策略)、安全版(安全特性,例如透明加密)、商密版
规划用户

规划表空间
SQL> create tablespace test datafile ‘/dm7/data/DAMENG/test01.dbf’ size 32;
创建用户
create user user_name identified by “password” default tablespace tablespace_name;
SQL> create user test identified by “dameng123” default tablespace test;
SQL> select username,default_tablespace from dba_users where username=’TEST’;
注意:资源管理limit限制
授权、角色
SQL> select GRANTEE, GRANTED_ROLE from dba_role_privs where GRANTEE=‘TEST’;
创建完用户默认的角色是public
SQL> select GRANTEE,PRIVILEGE from dba_sys_privs where GRANTEE=‘PUBLIC’;
权限的分类:
系统权限和对象权限
SQL> select user;
授权:系统权限
SQL> grant create table to test;
对象权限:
SQL> grant select on dmhr.employee to test;
工作中不要把dba的角色给新建的用户。把resource的角色给用户。
SQL> grant resource to test;
撤销权限:
SQL> revoke create table from test;
SQL> revoke select on dmhr.employee from test;

管理用户/角色
create role r1;
grant create table to r1;
grant r1 to test;

锁定用户
SQL> alter user test account lock;
解锁:
SQL> alter user test account unlock;
查看账户的状态:
SQL> select username,account_status from dba_users;
把角色禁用和启用
禁用:SQL> sp_set_role(‘R1’,0);
启用:SQL> sp_set_role(‘R1’,1);
删除用户和角色
SQL> drop user test;
SQL> drop user test cascade; 很危险
SQL> drop role r1;

补充:转授
授权:with admin option with grant option
With admin option :系统权限,不级联回收
With grant option :对象权限,级联回收

细粒度授权(对象权限)
SQL> grant select(city_id,city_name) on dmhr.city to test; 不可取,view
SQL> grant insert(city_id,city_name) on dmhr.city to test;

DMSQL
SQL:结构化查询语言
SQL分类:
DML 管理 INSERT UPDATE DELETE
DDL 定义 CREATE DROP ALTER TRUNCATE
DCL 控制 GRANT REVOKE
TCL 事务管理 COMMIT ,ROLLBACK,SAVE POINT
DQL query SELECT

select
简单
select () from ();
column_name,,||,alias,expr,distinct
select employee_name,salary,salary+1000
12 as tol from dmhr.employee;
select employee_name,salary,(salary+1000)*12 as tol from dmhr.employee;
select distinct department_id from dmhr.employee;
(隐含:order by)
select employee_name||‘的工资是:’||salary from dmhr.employee; 注意:连接如果有字符串,字符串要用单引号
过滤排序
select () from () where ();
where后:
比较运算 > < = >= <= <>
SQL> select employee_id,employee_name,salary from employee where salary > 20000;
SQL> select employee_id,employee_name,salary from employee where salary > ‘20000’;
逻辑运算 and or not
SQL> select employee_id,employee_name,salary from employee where salary > 20000 and department_id=101;
not > and >or
SQL> select employee_id,employee_name,salary from employee where employee_name=‘郑晓同’ or employee_name=‘马学铭’;
枚举 IN
SQL> select employee_id,employee_name,salary from employee where employee_name in (‘郑晓同’,‘马学铭’);
模糊查询 like
% _
SQL> select employee_name,salary from employee where employee_name like ‘马_’;
SQL> select employee_name,salary from employee where employee_name like ‘马%’;
表abc,有一列,该列有索引。
a% %a %a% (全文索引)
SQL> select para_name,para_value from v$dm_ini where para_name like ‘%LIKE%’;(达梦对like做了优化)
between … and (包括边界值)

= and <=
SQL> select employee_name,salary from employee where salary between 25000 and 30000;

NULL相关 IS NULL IS NOT NULL
select employee_name,commission_pct from employee where commission_pct is null;
select employee_name,commission_pct from employee where commission_pct is not null;

排序 order by asc desc top limit
SQL> select employee_name,salary from employee order by 2 ;默认是升序
SQL> select employee_name,salary from employee order by 2 desc;降序
SQL> select top 10 employee_name,salary from employee;
SQL> select employee_name,salary from employee limit 10;
分析函数:rank over ()….
select id,name,score from stu order by score desc;X

单行函数
数字处理
round trunc mod abs
SQL> select round(98.9);
SQL> select round(98.37,1);
SQL> select round(98.37,-1);
字符串处理
lower upper initcap
SQL> select lower(‘AAA’),upper(‘hello’),initcap(‘welcome to wuhan’);
instr substr length replace trim lpad rpad
SQL> select instr(‘hello’,‘e’); 可以解决模糊查询%a%
SQL> select substr(‘hello’,2,3);
SQL> select length(‘hello’); 返回的结果是字符数
SQL> select lengthb(‘hello’);
SQL> select replace (‘this is test’,‘this’,‘that’);
SQL> select trim(‘ ′ f r o m ′ ' from ' ′from′hello’);
SQL> select lpad(‘hello’,10,’#’);
SQL> select rpad(‘hello’,10,’#’);
日期处理
注意:日期可以做加减法
sysdate now
months_between ( days weeks years)
add_months (days,weeks)
next_day
SQL> select next_day(sysdate,‘星期三’);
SQL> select next_day(sysdate,‘星期四’);
last_day

空值处理
NULL与任何数字做算数运算,结果都为null
NVL 函数 nvl(paramater,0) 如过parameter不为空,运算时直接用parameter值,如果为空,用0做计算。
Oracle:nvl nvl2(p1,p2,p3)
ifnull
SQL> select ifnull(null,1);—1
nullif
SQL> select nullif(1,1);—null
SQL> select nullif(1,2);—1
null不代表空格也不代表0

通用函数
to_char 转换成字符串 date number
SQL> select employee_name,to_char(salary,‘L99,999.00’) from employee;
注意:0 , . 9 占位符 $美元 L 取本地货币字符集
SQL> select unicode; 0 中文1 UTF-8
SQL> select employee_name,to_char(hire_date,‘yyyy/mm/dd hh24:mi:ss’) from employee;
注意:YYYY MM DD HH MI SS
RR YY
达梦不支持MON,DAY,DY
14年以后入职的员工?
SQL> select employee_name,hire_date from employee where to_char(hire_date,‘yyyy’)>‘2014’;
to_date 字符串,数字
注意:时间的取值范围
SQL> select to_date(‘2018120201150301’,‘yyyy/mm/dd hh24:mi:ss’);
SQL> select to_date(2018120201150301,‘yyyy/mm/dd hh24:mi:ss’);
to_number
注意:如果字符串或者日期中含有字面或者特殊符号,不能转换
case
涨工资:
101 10%
102 5%
103 -5%
其他不变
case expr
when 条件 then 输出
when 条件 then 输出
….
else 输出
end case
select employee_name,salary,department_id,case department_id
when 101 then salary1.1
when 102 then salary
1.05
when 103 then salary*0.95
else salary
end case as “SAL” from employee;
start /home/dmdba/a.sql
聚合函数
sum avg count min max
group by having cube rollup grouping
SQL> select department_id,sum(salary) from employee group by department_id;
注意:除了聚合函数内的列,只要出现在select之后,都要写在group by 后面
聚合函数遇到空值,不做处理
按照部门分组,找出部门平均工资大于18000.
SQL> select department_id,avg(salary) from employee group by department_id having avg(salary)>18000;
注意:过滤是对分组之后的,不能用where,要用having。出现having前面一定会有group by。
多表查询
99
内连接:
自然连接 不推荐使用
默认找表相同的列做为连接条件。
找员工所在的部门。
SQL> select e.employee_name,d.department_name from employee e natural join department d;
问题:两张表有多列相同。两张表有相同的列,但是该列没有关系。
USING
SQL> select e.employee_name,d.department_name from employee e join department d using(department_id);
ON
SQL> select e.employee_name,d.department_name from employee e join department d on e.department_id=d.department_id;
自连接 说明要拆表
SQL> select e.employee_name,m.employee_name from employee e join employee m on e.manager_id=m.employee_id;
外连接:
找员工所在的城市
SQL> select e.employee_name,l.street_address from employee e left join department d on e.department_id=d.department_id left join location l on l.LOCATION_ID=d.LOCATION_ID;
左外 left join
右外 right join
全外 full join
注意:多表查询,n张表,至少要有n-1个条件。推荐使用前缀。加快查询速度。
92
内:
等值连接
SQL> select e.employee_name from employee e , department d where e.department_id=d.department_id;
不等值连接
自连接
外:(+)
左外
select e.employee_name,d.department_name from employee e , department d where e.department_id=d.department_id(+);
右外
select e.employee_name,d.department_name from employee e , department d where e.department_id(+)=d.department_id;

hash join (把小表做hash运算,用小表根据连接条件去扫描大表,找出结果集)
SQL> select e.employee_name,d.department_name from employee e inner hash join department d on e.department_id=d.department_id;
查看执行计划
SQL> explain select e.employee_name,d.department_name from employee e inner hash join department d on e.department_id=d.department_id;
子查询
子查询的结果是主查询的条件
子查询要先于主查询运行
不建议子查询嵌套超过3层
单行 返回结果唯一,非空
找和马学铭工资相同的人?
select employee_name,salary from employee where salary =(select salary from employee where employee_name=‘马学铭’);

多行 多个值
any all > any (min) <any(max)

all (max) <all (min)
比103部门所有人工资都高?
select employee_name,salary from employee where salary>all(select salary from employee where department_id=103);
in 把子查询执行完成后,在去执行主查询
exists 只要子查询一条返回的结果为真,让后就执行主查询。直到找不到满足的条件,在去执行子查询。

模式对象
模式 在数据库中的一个逻辑概念,类似于一个容器,为了保证安全。每次创建一个用户的时候,数据库会生成一个与用户同名的模式。达梦可以创建多个模式。
注意:
Oracle数据库的user_name=schema_name
Oracle 找某个用户下的某张表,达梦张某个模式下的某张表

表 table 达梦是关系型数据库 二维表
支持哪些表?
默认表(索引组织表),堆表,临时表,外部表,分区表(范围分区,hash分区,列表分区,间隔分区)

创建表的规则
OLTP:块使用
达梦:FILLFACTOR 填充因子 块的使用 80
Oracle:PCT_FREE
SQL> select table_name from user_tables;
表名(必须以字母开头,不区分大小写,0-9,a-z,A-Z,$ # _ )
数据类型(int,char,varchar,date,clob,blob)
存储位置(tablespace)
权限(创建表的权限 create table)
约束(非空,唯一,主键,检查,外键)
备注(整张,列)
范式(三范式)
约束:
非空:
SQL> create table t1 (id int)
SQL> alter table t1 modify id int not null;
SQL> create table t2 (id int not null);
Insert: SQL> insert into t1 values (1);
SQL> select rowid,id from t1
SQL> delete from t1 where rowid=2;
SQL> update t1 set id=2 where rowid=3;

唯一约束:
SQL> create table t3 (id int);
SQL> alter table t3 add constraint t3_uni unique (id);
查看约束:SQL> select table_name,constraint_name,constraint_type from dba_constraints where table_name=‘T3’;
SQL> create table t4 (id int unique); 行级
SQL> create table t5 (id int,constraint t5_uni unique (id)); 表级别
默认的约束是以CONS开头
唯一约束遇到空值忽略
创建唯一约束的时候会自动在该列创建一个唯一索引。

主键约束:
一张只能有一个主键,主键要求的是唯一,非空,设计主键的时候,最好设计在没有任何业务逻辑的列上。创建主键也会创建唯一索引。
SQL> create table t6 (id int);
SQL> alter table t6 add constraint t6_pri primary key (id);
SQL> create table t7 (id int primary key);
SQL> create table t8 (id int,constraint t8_pri primary key(id));
检查约束:
SQL> create table t9 (id int check (id >=6));
外键约束: 参考约束
外键要求至少2张表,某张的的一列要录入数据的时候,要检查另外一张表和其该对应的列是否有要录入的值。
MySQL的myiasm引擎不支持外键。要用innodb引擎。
SQL> create table t11 (id int primary key,pid int);
SQL> create table t12 (sid int,id int, constraint t12_fk foreign key(id) references t11 (id));

导数据过程中,要禁用约束,导完数据要开。
禁用:SQL> alter table t12 disable constraint t12_fk;
启用:SQL> alter table t12 enable constraint t12_fk;

如何删除约束:
SQL> alter table t12 drop constraint t12_fk;
查看约束创建在哪列上:
SQL> select table_name,constraint_name,column_name from dba_cons_columns where table_name=‘T11’;

表是如何创建的:
sp_tabledef
SQL> sp_tabledef(‘SYSDBA’,‘T11’);
dbms_metadata
SQL> sp_create_system_packages(1);
SQL> select dbms_metadata.get_ddl(‘TABLE’,‘T11’,‘SYSDBA’) from dual;

备注:
comment
表加备注:
SQL> comment on table t12 is ‘生产表’;
dba_tab_comments
SQL> select table_name,comments from dba_tab_comments where table_name=‘T12’;
列加备注:
SQL> comment on column t12.id is ‘编号’;
dba_col_comments
SQL> select table_name,column_name,comments from dba_col_comments where table_name=‘T12’;

注意:填充因子
FILLFACTOR
SQL> create table t13 (id int) storage (fillfactor 80);

达梦如何创建堆表:
不带分支的堆表
SQL> create table t14 (id int) storage (nobranch);
带分支的堆表
SQL> create table t15 (id int) storage (branch(2,3));

维护表
加一列,删除一列
alter table t14 add name varchar(10);
alter table t14 drop name ;
oracle:
SQL> alter table t14 add column name varchar(10) ;
SQL> alter table t14 drop column name ;
修改表名
SQL> alter table t14 rename to t20; 少用
收集表的统计信息
dbms_stats
SQL> begin
dbms_stats.gather_table_stats(‘SYSDBA’,‘T12’);
end;
/
删除表
SQL> drop table t12
清空表数据
delete from t11;
truncate table t11;

视图
视图分类:简单、复杂、物化视图(表、占磁盘的空间,如果支持查询重写等特性,要创建物化视图日志)
view 表的透析 (简单视图和复杂视图)不占磁盘空间,视图的数据来自于base table
创建:create view view_name as select () from () where();
SQL> create view v1 as select employee_name,salary from employee where rownum<20;
SQL> select view_name,text from user_views where view_name=‘V1’;

SQL> create view v2 as select e.employee_name,d.department_name from employee e join department d on e.department_id=d.department_id;
注意:select授权问题。
更新:
SQL> create or replace view v1 as select employee_id,employee_name,salary from employee where rownum<=20;
删除:
drop view v1;

简单可以做DML,复杂视图做DML要利用触发器(instead of)
限制:
delete
含有聚合函数
group by
distinct
update
含有聚合函数
group by
distinct
含有表达式
insert
含有聚合函数
group by
distinct
含有表达式
非空列没有完全包含在视图中

序列 sequence
提前申请的一段内存空间,使用序列做表的主键
创建:
create sequence sequence_name
start with 起始值
increment by 每次增加几
maxvalue 序列的最大值
cache/nocache 缓存/不缓存
cycle/nocycle; 循环/不循环
SQL> create sequence s1 start with 1 increment by 1 maxvalue 5 nocache nocycle;
SQL> select sequence_name,max_value,increment_by,cycle_flag from user_sequences where sequence_name=‘S1’;
伪列:
nextval 序列的下一个值
currval 序列的当前值
insert into t1 values (s1.nextval);
SQL> create sequence s2 start with 5 increment by 1 maxvalue 15 nocache cycle; —1
更新:
SQL> alter sequence s1 maxvalue 50;
删除:
SQL> drop sequence s1;

同义词
同义词是只为表创建一个别名
分类:普通、公共
创建:
create [public] synonym synonym_name for schema.table_name;
SQL> create synonym syn1 for dmhr.employee;
SQL> select table_name,synonym_name from user_synonyms;
SQL> create public synonym syn1 for dmhr.employee;
修改:
SQL> create or replace synonym syn1 for dmhr.department;
删除:
SQL> drop synonym syn1;

索引
索引的作用和索引的结构
加快查询速度,索引理解成书的目录。索引的结构是一个倒树。使用索引,对索引结构做遍历。
索引占磁盘空间,创建索引会索引的列上做排序(索引的数据是有序)
对表做DML操作,数据库要自动维护索引。

创建原则
经常查询的列
连接条件的列
谓词经常使用的字段
表大小
该列有大量的空值(不适合)
数据的值少(不适合)
达梦支持哪些?
创建的普通索引(二级索引),复合索引(列的顺序),函数索引,位图索引(位图块),位图连接索引,分区索引等
创建
CTAS
SQL> create table emp as select * from employee;
SQL> create table emp as select * from employee where 1=2;–复制表结构
SQL> create index ind_emp on emp(employee_id);
SQL> explain select employee_name from emp where employee_id<=2000;

HINT
SQL> explain select /*+ index(emp,ind_emp) */ employee_name from emp where employee_id<=2000;

SQL> explain select employee_name from emp index ind_emp where employee_id<=2000;

收集索引的统计信息:
DBMS_STATS
SQL> begin
dbms_stats.gather_index_stats (‘DMHR’,‘IND_EMP’);
end;
/
维护
更新:
SQL> alter index ind_emp rebuild;
SQL> alter index ind_emp rebuild online
删除:
SQL> drop index ind_emp;

备份还原
备份:出现故障还原。
备份方式:冷备份、热备份(归档)
物理备份(数据文件)、逻辑备份(语句)
全库备份、增量备份(累积增量)
集群
冷备份:数据库要关闭
缺点:可能会造成数据丢失
如果使用DMAP,保证dmap服务是运行
[dmdba@dmedu ~]$ ps -ef|grep dmap
BAK2:
Console—DMRMAN
RMAN> backup database ‘/dm7/data/DAMENG/dm.ini’ backupset ‘/dm7/data/DAMENG/bak/bk’;

BAK:
[dmdba@dmedu bin]$ ./dmbackup ini_path=/dm7/data/DAMENG/dm.ini name=bak

假设数据库故障:利用冷备份还原:
BAK2:console — 还原----恢复
RMAN> restore database ‘/dm7/data/DAMENG/dm.ini’ from backupset ‘/dm7/data/DAMENG/bak/bk’;
RMAN> recover database ‘/dm7/data/DAMENG/dm.ini’ from backupset ‘/dm7/data/DAMENG/bak/bk’;
注意:DMRAN目前值支持冷备份
BAK:
./dmrestore ini_path=/dm7/data/DAMENG/dm.ini file=/dm7/data/DAMENG/bak/DB_DAMENG_20180323000018000479.bak

达梦数据库打开归档:
数据库归档的状态
SQL> select arch_mode from v d a t a b a s e ; N Y 打 开 归 档 转 换 数 据 库 到 配 置 模 式 S Q L > a l t e r d a t a b a s e m o u n t ; S Q L > s e l e c t s t a t u s database; N Y 打开归档 转换数据库到配置模式 SQL> alter database mount; SQL> select status database;NY打开归档转换数据库到配置模式SQL>alterdatabasemount;SQL>selectstatus from v$instance;
配置归档
SQL> alter database add archivelog ‘DEST=/dm7/arch,TYPE=local,file_size=64,space_limit=2048’;
打开数据库
SQL> alter database archivelog;
SQL> alter database open;

上述操作修改了dm.ini dmarch.ini
dm.ini:ARCH_INI = 0—>1
dmarch.ini默认是空的,增加了:
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL
ARCH_DEST = /dm7/arch
ARCH_FILE_SIZE = 64
ARCH_SPACE_LIMIT = 0
改配置文件:要重启数据库实例

关闭归档:
alter databae mount;
alter database noarchivelog;
[dmdba@dmedu DAMENG]$ cat /dev/null>dmarch.ini
alter database open;
利用管理工具打开归档

达梦归档:边写redolog,边写归档
Oracle归档:日志切换才写归档

BAK2:热备份:备份数据库,备份表空间,备份表,备份归档
DM管理工具:
备份数据库:SQL> backup database full to “DB_BAK” backupset ‘DB_BAK’;
备份表:SQL>backup table “DMHR”.“CITY” to “TAB_CITY” backupset ‘TAB_CITY’;
备份表空间:SQL> backup tablespace “SYSTEM” full to “TS_SYSTEM” backupset ‘/dm7/data/DAMENG/bak/TS_SYSTEM’ device type disk;
备份归档:SQL> backup archivelog all to “ARCH_2018” backupset ‘ARCH_2018’;

还原整个数据库: dmrman,控制台
还原表:
SQL>restore table from backupset ‘/dm7/data/DAMENG/bak/TAB_CITY’;

还原表空间:(不能用如下方式的表空间SYSTEM ,ROLL)
SQL>alter tablespace dmhr offline;
SQL>restore tablespace dmhr from backupset ‘/dm7/data/DAMENG/bak/DMHR_BAK’;
SQL>alter tablespace dmhr online;
归档还原:

数据库作业(任务+调度)
定时执行某项任务,定时任务
初始化代理环境(SYSJOB)
配置作业
call SP_CREATE_JOB(‘JOB1’,1,0,’’,0,0,’’,0,’’);
call SP_JOB_CONFIG_START(‘JOB1’);
call SP_ADD_JOB_STEP(‘JOB1’, ‘STEP1’, 5, ‘01000/dm7/data/DAMENG/bak’, 1, 2, 0, 0, NULL, 0);
call SP_ADD_JOB_SCHEDULE(‘JOB1’, ‘SCH1’, 1, 2, 1, 9, 0, ‘23:00:00’, NULL, ‘2018-03-23 17:17:13’, NULL, ‘’);
call SP_JOB_CONFIG_COMMIT(‘JOB1’);
开发
1.达梦支持的接口?JDBC,ODBC,PYTHON等
2.PL/SQL DMSQL开发
匿名块
Begin —头
print ‘Hello world!’;—正文
end;–尾
/
declare --可选项
declare
v1 int;
begin
select salary into v1 from dmhr.employee
where employee_id=1001;
print v1;
end;
/

DMSQL程序可以支持FOR,IF,CASE
begin
for i in 1…5 loop
print i;
end loop;
end;
/
简单存储过程(不要求写异常,游标)
块来处理,有名字的快,教存储过程或者函数
带变量的存储过程!
根据员工的编号,找员工的部门?
CREATE PROCEDURE “DMHR”.“P1”(“EMPNO” IN INT)
AS
DEPTNO INT;
BEGIN
SELECT DEPARTMENT_ID INTO DEPTNO
FROM DMHR.EMPLOYEE WHERE EMPLOYEE_ID=EMPNO;
PRINT DEPTNO;
END;
/

CALL dmhr.p1(1001);
注意:函数必须有返回值

触发器
记录对表删除操作,记录操作员和时间?
create trigger “SYSDBA”.“TR1”
before DELETE
on “SYSDBA”.“EMP”
for each row
BEGIN
insert into test values(user,sysdate);
END;
/
对emp的salary列做更新,记录更新前的值和更新后的值?
create trigger “SYSDBA”.“TR2”
before UPDATE of “SALARY”
on “SYSDBA”.“EMP”
for each row
BEGIN
insert into sal values (:old.salary,:new.salary);
END;
/

数据库级别:
create trigger “SYSDBA”.“TR3”
before CREATE
on database
BEGIN
insert into test values (user,sysdate);
END;
/

复杂视图,要做修改?
create trigger “SYSDBA”.“TR4”
instead of UPDATE of “DEPARTMENT_NAME”
on “SYSDBA”.“V1”
for each row
BEGIN
insert into t2 values (:old.department_name,:new.department_name);
END;
/
对触发器进行编译:
alter trigger “SYSDBA”.“TR1” compile;
删除:drop
修改:create or replace

总结:
安装(lin)熟悉OS用户,权限,目录
创建数据库
创建表空间
用户 权限

导数据
备份,还原
作业
存储过程,触发器

我的达梦DCA培训小记相关推荐

  1. 圆你国产数据库DBA之梦,达梦DCA培训考试券免费拿

    2020首届达梦数据库精英挑战赛是在工信部等各级单位指导下,达梦公司联合国内信创产业知名企业共同打造信创人才"万人培养计划". 活动报名 报名时间:2020年7月22日-8月5日 ...

  2. 【DM】达梦DCA培训及考试认证

    达梦DCA 安装前准备 安装达梦数据库 创建数据库实例 使用DM管理工具 SQL 开启归档 数据库备份与还原 作业管理 ODBC DCA考试 达梦数据库是一款全自主的国产数据库,近年来在信息创新项目中 ...

  3. 达梦DCA培训及认证总结

    有幸参加了达梦DCA培训课程及认证考试,培训为期3天,培训老师对国产数据库的现状及未来做了精彩的介绍,然后对整个达梦数据库的产品线做了详细的讲解,后面开始对DM8数据库安装及各类基本操作进行实操培训, ...

  4. 达梦DCA培训 考试培训总结(部分内容)

    经过达梦公司组织的达梦数据库DCA培训,我获益良多,现分享我的个人学习心得笔记. 上课环境 操作系统:银河麒麟V10 数据库: DM8企业版(去达梦官网上下载支持低版本操作系统的安装包) 虚拟机:VM ...

  5. 达梦DCA培训考试笔记

    软件安装 Libc版本 Dm安装包要求得版本高于系统版本可能会报错 [root@localhost root]# ldd  --version ldd (GNU libc) 2.28 Copyrigh ...

  6. 达梦DCA培训笔记20220810-20220812

    注意事项 数据库创建完成后,如果没有初始化,可以通过使用达梦数据库配置助手创建一个数据库实例. 创建数据库时,默认情况下勾选字符串比较大小写敏感. 可以通过达梦服务查看器查看当前系统中存在的服务,包含 ...

  7. 达梦DCA认证培训考试心得体会

    一.概述 达梦数据库DCA认证是属达梦数据库入门级认证,主要针对在实际工作中系统维护实操不多的学员.线上培训三天即可预约报名参加认证考试,考试全部为机考.主要考试的知识点如下: 机试(95 分):安装 ...

  8. 达梦数据库培训学习学习心得

    达梦数据库培训学习心得内容 表空间管理 总结 学习了数据库行业的发展状态.国产数据库现状,介绍了达梦公司和达梦产品的历程,让我们明白了公司从无到有的一个过程. DM7的安装前的配置流程 1.收集软件信 ...

  9. 达梦DCA 认证考试培训学习技术分享

    DCA考试整体难度适中,有ORACLE的经验相对容易,内容上大部分兼容oracle.考试时间2小时,全为上机实操,包含:数据库安装.实例创建.参数修改.创建表空间.创建用户.角色.权限管理: 创建表. ...

最新文章

  1. php页面是什么原因,PHP空白页面常见原因及解决方法
  2. mysql多数据源切换_Springboot项目实现Mysql多数据源切换的完整实例
  3. 讲解sed用法入门帖子
  4. nginx配置文件讲解(二)
  5. Content-Disposition 响应头,设置文件在浏览器打开还是下载
  6. PHP+Ajax手机移动端发红包实例
  7. Powershell实例小结(服务管理)
  8. 【java】Java实现单向链表反转
  9. 吴恩达|机器学习作业6.1.SVM建立垃圾邮件分类器
  10. L1-041 寻找250 (10 分)—团体程序设计天梯赛
  11. 楼道游戏 c语言,C语言基础题!
  12. 【下载】JavaScript高级程序设计(第3版).pdf
  13. sql语句优化的几种方法
  14. Matpower软件简介和参数介绍
  15. oppo9s刷机教程_oppo r9s怎么刷机 oppo r9s手机在线刷机教程
  16. java 定时凌晨_Java定时任务,每天凌晨1点执行
  17. TDDL分布式数据库
  18. OC 实现扫雷达扫描动画
  19. PVR图像文件格式初探
  20. 论文导读|《Exploiting Rich Syntactic Information for Semantic Parsing with Graph-to-Sequence Model》

热门文章

  1. 独立按键的奇偶数检测
  2. 使用亚马逊云搭建服务器(详细教程,附图)
  3. Tableau填充地图、多维地图、混合地图
  4. 优质的衣帽间sketchup模型素材推荐,不容错过
  5. 易拉宝宣传广告怎么设计?
  6. 2021-3-23大学化学无机原理(4)化学反应的基本原理化学反应的方向和吉布斯函数
  7. 海康摄像头java的二次开发,集成windows和linux两个版本的报警布防
  8. 【MOOC 测验】第1章 计算机网络和因特网
  9. idea连接数据库创建实体类
  10. 猪价公众号文章文章下一键拨号