达梦数据库笔记

启动数据库实例
rhel6: service DmServiceTEST start
Rhel7: systemctl start DmServiceTEST(root)
./DmServiceDMSERVER start($DM_HOME/bin)
/etc/rc.d/init.d/DmServiceTEST stop

启动脚本的命名:
DmService+instance_name
数据库的状态:
shutdown mount(配置状态) open suspend(集群)
状态转换:
shutdown —mount (dmserver(调试))
mount—open
open—mount
open—suspend

启动后台的进程或者线程,分配共享内存,打开控制文件
./dmserver /dm7/data/TEST/dm.ini mount
./disql sysdba/SYSDBA@localhost:5237
默认disql连接的是5236
SQL> select status$ from v i n s t a n c e ; 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 ; S Q L > s e l e c t s t a t u s instance; mount ---open SQL> alter database open; SQL> select status instance;mountopenSQL>alterdatabaseopen;SQL>selectstatus from v i n s t a n c e ; 共 享 内 存 B u f f e r ( 数 据 缓 冲 区 ) 存 放 数 据 块 ( 读 取 的 数 据 和 修 改 的 数 据 ) 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 instance; 共享内存 Buffer(数据缓冲区) 存放数据块(读取的数据和修改的数据) SQL> select para_name,para_value from v instance;BufferSQL>selectparaname,paravaluefromvdm_ini where para_name=‘BUFFER’;
如何修改参数的值
sp_set_para_value();
了解参数的类型:(动态(sys,session),静态(in file),read only(数据库启动不允许修改))
Sp_set_para_value(scope,para_name,para_value);
SQL> sp_set_para_value(2,‘BUFFER’,500);
Scope=1 (内存,参数文件的值)
2 (参数文件的值)
OLTP:40%-60%
OLAP:60%-80%
LRU(冷端和热端)(数据块那些状态(free,clean,dirty,pending、pins))
字典缓冲区(最近使用的数据字典)(减少IO)
达梦的数据字典存放到system表空间
SQL> select para_name,para_value,para_type from v d m i n i w h e r e p a r a n a m e = ′ D I C T B U F S I Z E ′ ; S Q L 缓 冲 区 ( 缓 存 最 近 使 用 的 S Q L 或 者 P L / S Q L ( D M S Q L ) , 缓 冲 S Q L 的 执 行 计 划 和 S Q L 查 询 的 结 果 集 ) S Q L I D , H A S H V A L U E L R U ( 把 不 常 用 的 S Q L 在 内 存 中 置 换 出 去 ) 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 , p a r a t y p e f r o m v dm_ini where para_name='DICT_BUF_SIZE'; SQL缓冲区(缓存最近使用的SQL或者PL/SQL(DMSQL),缓冲SQL的执行计划和SQL查询的结果集)SQL_ID,HASH_VALUE LRU(把不常用的SQL在内存中置换出去) SQL> select para_name,para_value,para_type from v dminiwhereparaname=DICTBUFSIZE;SQL使SQLPL/SQLDMSQLSQLSQLSQLID,HASHVALUELRUSQLSQL>selectparaname,paravalue,paratypefromvdm_ini where para_name=‘CACHE_POOL_SIZE’;
SQL> select para_name,para_value,para_type from v d m i n i w h e r e p a r a n a m e = ′ U S E P L N P O O L ′ ; 重 做 日 志 缓 冲 区 ( 缓 存 修 改 的 数 据 块 ) 如 果 事 务 提 交 , 把 数 据 块 写 到 重 做 日 志 文 件 , ( 还 原 ) 3 s 原 则 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 , p a r a t y p e f r o m v dm_ini where para_name='USE_PLN_POOL'; 重做日志缓冲区 (缓存修改的数据块) 如果事务提交,把数据块写到重做日志文件,(还原) 3s原则 SQL> select para_name,para_value,para_type from v dminiwhereparaname=USEPLNPOOL;3sSQL>selectparaname,paravalue,paratypefromvdm_ini where para_name=‘RLOG_BUF_SIZE’;
单位是页,参数设置成2的幂

排序区(数据进行排序)
注意排序区不足,会把部分排序转到磁盘,(临时表空间)
SQL> select para_name,para_value,para_type from v$dm_ini where para_name=‘SORT_BUF_SIZE’;

HASH缓冲区(多表,hash join)
SQL> select para_name,para_value,para_type from v d m i n i w h e r e p a r a n a m e = ′ H J B U F S I Z E ′ ; 总 的 共 享 内 存 是 多 少 : 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 , p a r a t y p e f r o m v dm_ini where para_name='HJ_BUF_SIZE'; 总的共享内存是多少: SQL> select para_name,para_value,para_type from v dminiwhereparaname=HJBUFSIZE;SQL>selectparaname,paravalue,paratypefromvdm_ini where para_name=‘MEMORY_TARGET’;
后台的进程和线程
达梦在OS是多线程
1.OS
[dmdba@localhost ~]$ ps -ef|grep dmserver
[dmdba@localhost ~]$ top -p 11852 -H
cd /proc/11852/task
2.数据库的字典和视图
SQL> desc v t h r e a d s S Q L > s e l e c t n a m e , t h r e a d d e s c f r o m v threads SQL> select name,thread_desc from v threadsSQL>selectname,threaddescfromvthreads;
监听线程(门卫)
检测外部会话连接
SQL> select sess_id from v$sessions;
工作线程
执行调度线程分配的任务
调整工作线程个数WORKER_THREADS
调度线程
唤醒工作线程执行任务,回收失效的段
IO线程
把脏数据写到磁盘
日志重做线程
数据库异常关闭,把写到redolog的,但是并未写到数据文件的数据块,重构到buffer。
重做日志的归档线程
把重做日志归档
重做日志刷新线程
把重做日志缓冲区的数据写到重做日志文件
检查点线程
发生完全检查点的时候,把buffer的脏数据写到数据文件。增量检查点不一定写脏数据。

如何去结束会话
sp_close_session(sess_id);
SQL> select sess_id,create_time from v s e s s i o n s ; S Q L > s e l e c t s e s s i d , c r e a t e t i m e , s q l t e x t f r o m v sessions; SQL> select sess_id,create_time,sql_text from v sessions;SQL>selectsessid,createtime,sqltextfromvsessions;
SQL> sp_close_session(140586023720472);
Database (数据库中的文件)
数据文件
存放的是用户的真实数据,一般情况都是.DBF
SQL> select path from v$datafile;
行号 PATH


1 /dm7/data/DAMENG/SYSTEM.DBF
2 /dm7/data/DAMENG/ROLL.DBF
3 /dm7/data/DAMENG/TEMP.DBF
4 /dm7/data/DAMENG/MAIN.DBF
重做日志文件(循环写,重复写)达梦不支持手动切换日志,日志切换都是由数据库自身完成。
SQL>alter system switch logfile;(把未归档的数据进行归档)
记录用户改变的数据。
SQL> select path from v r l o g f i l e ; 增 加 一 个 日 志 文 件 : S Q L > a l t e r d a t a b a s e a d d l o g f i l e ′ / d m 7 / d a t a / D A M E N G / D A M E N G 03. l o g ′ s i z e 256 ; ( 单 位 默 认 为 M , 不 用 写 单 位 ) 注 意 : 不 支 持 删 除 重 做 日 志 文 件 控 制 文 件 记 录 数 据 库 基 本 物 理 结 构 , 数 据 库 的 版 本 , 创 建 时 间 等 。 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; 增加一个日志文件: SQL> alter database add logfile '/dm7/data/DAMENG/DAMENG03.log' size 256;(单位默认为M,不用写单位) 注意:不支持删除重做日志文件 控制文件 记录数据库基本物理结构,数据库的版本,创建时间等。 SQL> select para_name,para_value from v rlogfile;SQL>alterdatabaseaddlogfile/dm7/data/DAMENG/DAMENG03.logsize256;MSQL>selectparaname,paravaluefromvdm_ini where para_name=‘CTL_PATH’;
查看控制文件的内容?
[dmdba@localhost DAMENG]$ dmctlcvt type=1 src=/dm7/data/DAMENG/dm.ctl dest=/tmp/dm.txt
配置文件dm.ini
dm.ini类似于oracle pfile 存放是数据库的参数信息 v d m i n i v dm_ini v dminivparameter
场景把oracle迁移到达梦,保证兼容,要达梦数据库兼容oracle一些特性。
COMPATIBLE_MODE
0不兼容
1 SQL 92
2 oracle
3SQL SERVER
4 mysql
SQL> sp_set_para_value(2,‘COMPATIBLE_MODE’,2);
注意:key–value
备份文件,追踪文件,归档文件
管理表空间
数据库:
物理结构:文件系统(ext,xfs,ntfs,raw,ASM)—数据文件
逻辑结构:数据库—表空间(多个数据文件)—段---簇—页
1.达梦默认有哪些表空间?
SQL> select tablespace_name from dba_tablespaces;
行号 TABLESPACE_NAME
---------- ---------------
1 SYSTEM (系统表空间,存放数据库常用数据字典信息)
2 ROLL(回滚表空间,回滚段,可以支持MVCC(事务多版本)写操作不阻塞读操作)
3 TEMP(临时表空间,临时数据,排序操作在内存无法完全完成,临时表都用的是临时表空间)
4 MAIN (数据库默认表空间,创建数据对象,不指定存储位置)
5 HMAIN (Huge表空间,存放列存)

2.如何规划表空间?
SQL语句
案例1:创建一个表空间TBS1,数据文件初始大小为32M,最大使用限制为1G。
达梦对表空间数据文件初始值的要求:
page*4096
SQL> create tablespace tbs1 datafile ‘/dm7/data/DAMENG/TBS1.DBF’ size 32 autoextend on maxsize 1024;
案例2:创建一个表空间TBS2,数据文件有2个,并且存放到不同位置,每个数据文件的最大值为20G;
SQL> create tablespace tbs2 datafile ‘/dm7/data/DAMENG/disk1/TBS2_1.DBF’ size 32 autoextend on maxsize 20480,’/dm7/data/DAMENG/disk2/TBS2_2.DBF’ size 32 autoextend on maxsize 20480;
SQL> select tablespace_name,file_name from dba_data_files where tablespace_name=‘TBS2’
案例1和案例2每次扩展的大小为:簇大小
SQL> select sf_get_extent_size();一个簇还有多少个页
SQL> select page; 页大小
案例3:创建一个表空TBS3,初始大小为100M,每次扩展1M。最大1G
SQL> create tablespace tbs3 datafile ‘/dm7/data/DAMENG/TBS3.DBF’ size 100 autoextend on next 1 maxsize 1024;128
DM管理工具

3.维护表空间
表空间的脱机和联机
SQL> alter tablespace tbs1 offline;
SQL> select tablespace_name,status from dba_tablespaces;
1 offline 0 online
SQL> alter tablespace tbs1 online;
注意:system temp roll不能offline
表空间不足,如何解决
SQL> alter tablespace tbs4 resize datafile ‘/dm7/data/DAMENG/TBS4.DBF’ to 100;(不可取)
SQL> select tablespace_name,bytes/1024/1024 from dba_free_space;
[-523]:磁盘空间不足.
向表空间增加数据文件
SQL> alter tablespace tbs4 add datafile ‘/dm7/data/DAMENG/TBS4_2.DBF’ size 32 autoextend on maxsize 33;
表空间更换存储位置
表空间offline
SQL> alter tablespace tbs3 offline;
迁移数据文件
SQL> alter tablespace tbs3 rename datafile ‘/dm7/data/DAMENG/TBS3.DBF’ to ‘/dm7/tbs3/TSB3.DBF’;
表空间online
SQL> alter tablespace tbs3 online;
删除表空间
SQL> drop tablespace tbs1;
SQL> drop tablespace tbs4;
drop tablespace tbs4;
[-3412]:试图删除已经使用的表空间.
Huge tablespace
SQL> create huge tablespace H1 path ‘/dm7/data/DAMENG/H1’;注意:目标路径的H1是不能存在的。
SQL> drop huge tablespace H1;

管理用户
1.达梦默认有哪些账户和作用?
四权分立(不同用户完成不同的职责)
SQL> select username from dba_users;
行号 USERNAME
---------- ----------
1 SYS 内置管理用户,是使用的字典和视图的owner,不能登录数据库
2 SYSDBA 管理员
3 SYSAUDITOR 审计员
4 SYSSSO (安全版本) 安全员
版本:开发版本(不能做商用),标准版(不支持集群),企业版本(不支持强制访问控制),安全版本
2.如何规划用户
用户名(字母开头,包含0-9,KaTeX parse error: Expected 'EOF', got '#' at position 1: #̲_) 创建用户的权限(sy…dm_ini where para_name = ‘PWD_POLICY’;
默认的是2 密码至少6位
4至少含有一个大写字母
8 至少含有一个数字
16 含有一个特殊符号
密码安全选项(1.错误密码尝试登陆次数。2.密码锁定的时间。3.密码的有效期。4.密码的宽限期。5.密码重用的时间) limit (sysusers)
单独规划一个表空间
create tablespace
权限分配(系统权限和对象权限)
系统权限:create drop alter
对象权限:select insert delete update
案例1:创建一个用户user1,密码的使用期限为120天,可以尝试猜测密码2次,猜测失败,锁定2min。
SQL> create tablespace tbs_user datafile ‘/dm7/data/DAMENG/TBS_USER.DBF’ size 32 ;
SQL>create user user1 identified by “Dameng123” limit failed_login_attemps 2 ,
password_life_time 120,password_lock_time 2 default tablespace tbs_user;
SQL> select username,account_status from dba_users;
SQL> alter user user1 account unlock; 解锁
SQL> alter user user1 account lock; 锁定用户
注意:新建的用默认具有public
user1可以创建表?
授权:create table
SQL> grant create table to user1;
回收:
SQL> revoke create table from user1;
user1可以查询dmhr.city
授权:对象权限 select
SQL> grant select on dmhr.city to user1;
回收:SQL> revoke select on dmhr.city from user1;
注意:系统权限和对象权限分开授予。
数据库默认的临时表空间大小调整?
SQL> select para_name,para_value from v$dm_ini where para_name = ‘TEMP_SIZE’;
案例2:创建用户user2,把resource角色给用户?
SQL> create user user2 identified by “Dameng123” default tablespace tbs_user;
SQL> grant resource to user2;
3.维护账户
改密码
SQL> alter user user1 identified by “Dameng111”;
修改用户的密码策略
SQL> alter user user1 limit password_lock_time 5;
删除账户
SQL> drop user user1;
drop user user1;
第1 行附近出现错误[-2639]:试图删除被依赖对象[USER1].
SQL> drop user user1 cascade;(备份导出)
4.角色管理(一类权限的集合)
为了更好的管理,可以创建角色,把权限分配给角色,把角色分配给用户,方便管理
SQL> create role r1 ;
SQL> grant create table to r1;
SQL> grant r1 to user2;
SQL> drop role r1;(删除)
DMSQL
SQL分类:(结构话查询语言)
DDL 定义 create drop truncate
DML 管理 select insert update delete
DCL 控制 grant revoke
TCL 事务管理 commit rollback save point

数据查询:
1.简单查询
语法:select () from ();
第一括号
* column_name 表达式 别名 去重 ||
SQL> select table_name from user_tables;
SQL> select * from employee;
SQL> select employee_id,employee_name,salary from employee;
SQL> select employee_id,employee_name,salary,salary+1000 from employee limit 10;
+ - * / () 注意优先级
SQL> select employee_id,employee_name,salary,salary+1000 as tol from employee limit 10;
SQL> select distinct department_id from employee; (隐含排序)
SQL> select employee_name||‘的工资是:’||salary as desc1 from employee limit 10;
2.过滤排序
语法:select () from () where ();
where()
比较运算 > < >= <= <> !=
SQL> select employee_name,salary from employee where salary >25000;
SQL> select employee_name,salary from employee where employee_name =‘马学铭’;
逻辑运算 and or not
找出马学铭和谢俊人的工资?
SQL> select employee_name,salary from employee where employee_name=‘马学铭’ or employee_name=‘谢俊人’;
找出101部门,叫马学铭的工资。
SQL> select employee_id,employee_name,salary from employee where employee_name=‘马学铭’ and department_id =101;
模糊查询 like % _
找姓马?
SQL> select employee_name from employee where employee_name like ‘马%’;
SQL> select employee_name from employee where employee_name like ‘__’;
注意:like LIKE_OPT_FLAG(优化开关)
枚举 in
SQL> select employee_id,employee_name,salary from employee where employee_name in (‘马学铭’,‘谢俊人’);
介于二者之间 between … and
SQL> select employee_name,salary from employee where salary between 19700 and 30000;
salary>=19700 and salary <=30000
空值处理 IS NULL IS NOT NULL
SQL> select employee_name,commission_pct from employee where commission_pct is not null;
SQL> select employee_name,commission_pct from employee where commission_pct is null;
null不等于0
null不等于空格
排序:升序,降序
Asc 升序
Desc 降序
SQL> select employee_name,salary from employee order by salary desc ;
SQL> select employee_name,salary from employee order by salary asc ;
注意:sort_buf_size
SQL> select employee_name,salary from employee order by 2 desc ;
作业:分析函数
3.分组查询
select () from () group by () having ();
having对分组后的数据进行过滤
聚合函数:
max min avg sum count
计算employee表本月发多少工资?
SQL> select sum(salary) from employee;
SQL> select avg(salary) from employee;
请各个部门的平均工资是多少?
SQL> select department_id,avg(salary) from employee group by department_id;
找出部门平均工资大于18000?
SQL> select department_id,avg(salary) from employee group by department_id having avg(salary)>18000;
4.多表查询
99标准:
多表连接,n张表至少n-1个条件
内连接
自然连接
语法:select () from () natural join ();
自动找相同的列做为连接条件。
SQL> select e.employee_name,d.department_name from employee e natural join department d;
using
语法:select () from () join () using();
SQL> select e.employee_name,d.department_name from employee e join department d using (department_id);
on
select () from () join () 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 * from employee e cross join department d ;
Hash join
SQL> select e.employee_name,d.department_name from employee e inner hash join department d on e.department_id=d.department_id;
注意:hj_buf_size
外连接
左外
语法:select () from () left join () on ();
SQL> select e.employee_name,d.department_name from employee e left join department d on e.department_id=d.department_id;
employee全部显示,department只显示满足连接条件,不满足连接条件的用null填充。
右外
SQL> select e.employee_name,d.department_name from employee e right join department d on e.department_id=d.department_id;
department全部显示,employee只显示满足连接条件,不满足连接条件的用null填充。
全外
SQL> select e.employee_name,d.department_name from employee e full join department d on e.department_id=d.department_id;
department全部显示,employee全部显示,不满足连接条件的用null填充。
5.子查询
注意:子查询在主查询之前,子查询的结果是主查询的一个条件。
单行(返回的结果一个)
比较运算
找出和马学铭工资相同的人?
SQL> select employee_name,salary from employee where salary=(select salary from employee where employee_name=‘马学铭’);
找出和马学铭在同一个部门?
SQL> select employee_name,department_id from employee where department_id=(select department_id from employee where employee_name=‘马学铭’);
多行(返回结果有多个)
all any
>all(max) >any(min) 找出比1002部门任何人工资都高的?
SQL> select employee_name,department_id,salary from employee where salary=(select salary from employee where department_id=1002);
[-4097]:单行子查询返回多行.
SQL> select employee_name,department_id,salary from employee where salary>all(select salary from employee where department_id=1002);
in (先把子查询运行完,在运行主查询)
exists(先运行子查询,如果存在满足条件的,运行主查询,直到子查询运行完。)
运行子查询的时候,不要嵌套查过三层。
动态SQL
SQL> select d.department_name,e.employee_name from (select department_name,department_id from department) d join employee e on d.department_id=e.department_id;
模式对象管理
模式:一组数据对象的集合,安全。创建用户的时候,会生成一个与用户同名的模式。达梦支持单独创建模式。

1.达梦支持哪些表?
默认的表是索引组织表,(如果表无主键,默认以rowid),堆表,临时表,外部表,分区表,列存表
2.如何规划表?
表的名称
字母开头 0-9 KaTeX parse error: Expected 'EOF', got '#' at position 1: #̲_ 功用(数据类型) … cat a.sql
insert into t14 (id,name) values (1,‘aa’);
insert into t14 (id,name) values (2,‘bb’);
commit;
SQL> start /home/dmdba/a.sql
删除表
SQL> drop table t14;(对表做备份)
表重命名
SQL> alter table t13 rename to tt;
视图
表的透析,视图有简单视图,复杂视图和物化视图
达梦支持那些视图?(简单,复杂,物化视图)
创建视图(权限管理)
语法:create view () as select () from () where ();
SQL> create view v1 as select * from dmhr.city;
修改
语法:create or replace view () as select () from () where ();
SQL> create or replace view v1 as select city_id,city_name from dmhr.city;
SQL> select view_name,text from dba_views where view_name=‘V1’;
删除
SQL> drop view v1;
序列(预先申请的一段地址空间)
创建
语法:
Create sequence ()
Start with —开始值
Increment by–递增多少
Maxvalue—最大值
Nocache/cache —是否缓存
Nocaycle/cycle;–是否循环
SQL> create sequence s1 start with 1 increment by 1 maxvalue 10 nocache nocycle;
dba_sequences
SQL> select s1.currval; 序列当前的值
SQL> select s1.nextval; 序列下一个值
修改
语法:alter sequence () ();
SQL> alter sequence s1 maxvalue 100;
删除
SQL> drop sequence s1;
同义词(表视图的别名)
分类:
普通
公共
达梦用的数据字典和动态新能视图都是sys公共同义词
创建
语法:create [public] synonym () for ();
SQL> create synonym ttt for sysdba.test;
SQL> select table_name,synonym_name from dba_synonyms where table_name=‘TEST’;
SQL> create public synonym tttt for sysdba.test;
修改
语法: create or replace synonym () for ();
删除
SQL> drop synonym ttt;
SQL> drop public synonym tttt;
索引
索引的作用和结构
加快查询,表有索引,对表做DML操作时候,数据库会自动维护索引。索引会占磁盘空间。
多叉树,使用索引,实际是多多叉树做遍历。
达梦支持那些索引
默认索引(二级索引),位图索引,复合索引,唯一索引,函数索引,分区索引…
创建
规则:
1.经常查询的列
2.连接条件的列上
3.谓词经常出现的列(where)
4.返回值是表数据的一小部分
语法:create index () on () tablespace ();
表的数据是无序的,索引的数据是有序。
SQL> create tablespace ind datafile ‘/dm7/data/DAMENG/IND.DBF’ size 32;
SQL> create table emp tablespace tbs as select * from dmhr.employee;
SQL> create index ind_emp on emp(employee_id) tablespace ind;
SQL> explain select employee_id,employee_name from emp where employee_id<100;
未走索引:1.优化器判断走全表扫描比走索引性能更好。2.统计信息不是最新
收集表的统计信息:
SQL> begin dbms_stats.gather_table_stats(‘SYSDBA’,‘EMP’);
end;
/
维护
重建
SQL> alter index ind_emp rebuild;
SQL> alter index ind_emp rebuild online;
删除
SQL> drop index ind_emp;
备份还原
备份方式
数据自带备份工具,第三方工具(上海爱数,鼎甲)
备份介质
磁盘,磁带(驱动)
备份方法
物理备份
冷备份(数据库要处于关闭,dmap服务是打开)
[dmdba@localhost ~]$ /etc/rc.d/init.d/DmAPService status
[dmdba@localhost ~]$ ps -ef|grep dmap
遇到的问题:dmap服务是关闭,启动dmap服务时候,提示管道文件已存在。
[dmdba@localhost ~]$ /etc/rc.d/init.d/DmAPService start
D M H O M E / b i n , 把 D M P I P E D M A P L S N R ∗ 文 件 删 除 , 然 后 在 启 动 即 可 。 [ d m d b a @ l o c a l h o s t b i n ] DM_HOME/bin,把DM_PIPE_DMAP_LSNR_* 文件删除,然后在启动即可。 [dmdba@localhost bin] DMHOME/binDMPIPEDMAPLSNR[dmdba@localhostbin] /etc/rc.d/init.d/DmServiceDMSERVER stop
备份的命令: D M H O M E / b i n [ d m d b a @ l o c a l h o s t b i n ] DM_HOME/bin [dmdba@localhost bin] DMHOME/bin[dmdba@localhostbin] ./dmrman
RMAN> backup database ‘/dm7/data/DAMENG/dm.ini’;
RMAN> backup database ‘/dm7/data/DAMENG/dm.ini’ backupset ‘/dm7/data/DAMENG/bak/20190925’;
还原冷备份:(dmap,数据是关闭)
RMAN> restore database ‘/dm7/data/DAMENG/dm.ini’ from backupset ‘/dm7/data/DAMENG/bak/20190925’
RMAN> recover database ‘/dm7/data/DAMENG/dm.ini’ from backupset ‘/dm7/data/DAMENG/bak/20190925’
热备份(数据库是打开,dmap服务是启动,数据库一定要打开归档)
[dmdba@localhost 20190925]$ /etc/rc.d/init.d/DmServiceDMSERVER status
[dmdba@localhost 20190925]$ /etc/rc.d/init.d/DmAPService status
SQL> select arch_mode from v d a t a b a s e ; S Q L > s e l e c t ∗ f r o m v database; SQL> select * from v database;SQL>selectfromvdm_arch_ini;
打开数据库归档:
SQL> alter database mount;
SQL> alter database add archivelog ‘dest=/dm7/arch,type=local,file_size=64,space_limit=0’;
SQL> alter database archivelog;
SQL>alter database open;
热备:数据库,表空间,表,归档
SQL> backup tablespace dmhr backupset ‘/dm7/backup/dmhr’;
SQL> backup database backupset ‘/dm7/backup/fullbak’;
SQL> backup table sysdba.emp backupset ‘/dm7/backup/empbak’;
SQL> backup archivelog backupset ‘/dm7/backup/archbak’;
利用管理工具做备份:

DMHR表空间损坏,如何还原:
   SQL> alter tablespace dmhr offline;
   SQL> restore tablespace dmhr from backupset '/dm7/backup/dmhr/';  
   SQL> alter tablespace dmhr online;
如果表损坏:
   SQL> restore table emp from backupset '/dm7/backup/empbak/';
逻辑备份(dexp)
数据库是打开的状态。
备份内容:数据库,表,用户,模式
备份表为例:
   [dmdba@localhost dm7]$ dexp sysdba/SYSDBA file=/dm7/backup/emp.dmp tables=emp
假设表被误删除:
   [dmdba@localhost dm7]$ dimp sysdba/SYSDBA file=/dm7/backup/emp.dmp tables=emp

作业(定期执行某项操作)
配置作业的过程:
1.初始化代理环境
2.创建作业
3.创建步骤
4.创建调度
5.提交作业
完全备份:
call SP_CREATE_JOB(‘test’,1,0,’’,0,0,’’,0,’’);
call SP_JOB_CONFIG_START(‘test’);
call SP_ADD_JOB_STEP(‘test’, ‘b1’, 5, ‘01000/dm7/backup’, 1, 2, 0, 0, NULL, 0);
call SP_ADD_JOB_SCHEDULE(‘test’, ‘d1’, 1, 2, 1, 33, 0, ‘23:00:00’, NULL, ‘2019-09-25 15:50:53’, NULL, ‘’);
call SP_JOB_CONFIG_COMMIT(‘test’);
增量备份:
call SP_CREATE_JOB(‘test2’,1,0,’’,0,0,’’,0,’’);
call SP_JOB_CONFIG_START(‘test2’);
call SP_ADD_JOB_STEP(‘test2’, ‘b2’, 5, ‘11000/dm7/backup|/dm7/backup’, 1, 2, 0, 0, NULL, 0);
call SP_ADD_JOB_SCHEDULE(‘test2’, ‘d2’, 1, 2, 1, 94, 0, ‘23:00:00’, NULL, ‘2019-09-25 15:54:02’, NULL, ‘’);
call SP_JOB_CONFIG_COMMIT(‘test2’);
表观察作业的执行情况:
SQL> select * from sysjob.sysjobs;
select * from “SYSJOB”.“SYSJOBHISTORIES”;
select * from “SYSJOB”.“SYSJOBSCHEDULES”;
select * from “SYSJOB”.“SYSJOBSTEPS”;

开发配置
1.达梦支持那些语言
JAVA,C/C++,PHP,Python等等
2.配置JDBC
// 定义DM JDBC 驱动串
String jdbcString = “dm.jdbc.driver.DmDriver”;
// 定义DM URL 连接串
String urlString = “jdbc:dm://ip:5236”;
3.配置ODBC
确认是否安装 (rpm -qa|grep odbc
unixODBC-2.3.0.tar.gz
tar -xf unixODBC-2.3.0.tar.gz
进入解压目录./configure ; make ; make install
cd /usr/loacl/etc
vim odbc.ini
[dm]
Description = DM ODBC DSN
Driver = DM7 ODBC DRIVER
SERVER = localhost
UID = SYSDBA
PWD = SYSDBA
TCP_PORT = 5236
在编译odbcinst.ini
[DM7 ODBC DRIVER]
Description = ODBC DRIVER FOR DM7
Driver = /dm7/bin/libdodbc.so
测试连接:isql dm SYSDBA SYSDBA
SQL>

4.匿名块
匿名块的格式
Declare --可选项 定义变量
Begin—开始
Body; — 正文
Exception-- 可选项 异常
End; --结束
SQL> set serveroutput on
SQL> begin
print (‘hello’);
end;
/
Hello
begin
for i in 1…5 loop
print (i);
end loop;
end;
/
5.存储过程
根据员工的编号,找出员工的工资?
CREATE PROCEDURE “DMHR”.“TEST2”(“EMPNO” IN INT)
AS
SAL INT;
BEGIN
select salary into sal from dmhr.employee where employee_id=empno;
print sal;
END;
SQL> call dmhr.test2(1005);

CREATE OR REPLACE PROCEDURE "DMHR"."TEST2"("EMPNO" IN INT)
AS
	SAL INT;
BEGIN
	select salary into sal from dmhr.employee where employee_id=empno;
	print sal;
	exception when no_data_found 
	then print 'no person';
END;

6.触发器
触发器的种类:
库级别,模式级别,表级别,视图
库级别:
记录对数据库的删除操作,记录到表test4中,记录操作员和操作时间。
SQL>create table test5 (name varchar(20),d1 date);
SQL>create trigger “SYSDBA”.“T_DROP”
after DROP
on database
BEGIN
insert into test5 values (user,sysdate);
END;
验证:
SQL> drop table t1;
SQL> select * from test5;

表级别:
对emp表做更新salary,记录更前的数据和更新后的数据。
SQL> create table test6(o_sal int,n_sal int);
SQL>create trigger “SYSDBA”.“T_UPDATE”
before UPDATE of “SALARY”
on “SYSDBA”.“EMP”
for each row
BEGIN
insert into test6 values (:old.salary,:new.salary);
END;
验证:
SQL> update emp set salary=1 where rownum<=1;
SQL> commit;
SQL> select * from test6;
小结:
安装–创建数据–启动和关闭数据库—
创建表空间—创建用户—创建表–导入数据–备份数据库–还原数据库–作业配置–
了解开发配置和过程触发器的写法

你可能感兴趣的:(学习笔记,读书笔记,数据库)