文章目录
数据库物理结构
本节主要记录数据库相关文件的管理
管理数据库文件
- 控制文件转换(控制文件转换成文本文件)
[dmdba@192 bin]$ ./dmctlcvt type=1 SRC=/dm8/dmdb1/dm.ctl DEST=/dm8/dmdb1/dm.txt
DMCTLCVT V8
convert ctl to txt success!
- 管理联机重做日志
查看联机重做日志
SQL> select path,rlog_size/1024/1024 rlog_size_MB from v$rlogfile;
行号 PATH rlog_size_MB
---------- ---------------------- --------------------
1 /dm8/dmdb1/dmdb101.log 2048
2 /dm8/dmdb1/dmdb102.log 2048
增加联机重做日志
SQL> alter database add logfile '/dm8/dmdb1/dmdb103.log' size 2048;
SQL> select path,rlog_size/1024/1024 rlog_size_MB from v$rlogfile;
行号 PATH rlog_size_MB
---------- ---------------------- --------------------
1 /dm8/dmdb1/dmdb101.log 2048
2 /dm8/dmdb1/dmdb102.log 2048
3 /dm8/dmdb1/dmdb103.log 2048
修改联机重做日志大小(不支持缩小)
alter database resize logfile 'xxx.log' to 500;
移动联机重做日志
alter database rename logfile 'xxx.log' to 'NEW_PATH';
参数(查看与修改)
云适配中心 - 调整配置参数
https://eco.dameng.com/docs/zh-cn/pm/tracking-resolution.html
查看参数,跟踪日志文件是启动的
SQL> select SF_GET_PARA_VALUE(1, 'SVR_LOG');
行号 SF_GET_PARA_VALUE(1,'SVR_LOG')
---------- ------------------------------
1 1
修改参数,关闭跟踪日志文件
SQL> SP_SET_PARA_VALUE(1, 'SVR_LOG', 0);
检查参数,跟踪日志文件关闭了
SQL> select SF_GET_PARA_VALUE(1, 'SVR_LOG');
行号 SF_GET_PARA_VALUE(1,'SVR_LOG')
---------- ------------------------------
1 0
表空间管理
- 创建表空间(数据文件起始大小不能少于4096*页大小)
查看数据库页大小
SQL> select para_name,para_value from v$dm_ini where para_name = 'GLOBAL_PAGE_SIZE';
行号 para_name para_value
---------- ---------------- ----------
1 GLOBAL_PAGE_SIZE 32768
数据页大小为32KB,故每个数据文件不能小于128MB(32KB * 4096 / 1024 = 128MB)
SQL> create tablespace tbs01 datafile '/dm8/dmdb1/tbs01.dbf' size 127;
create tablespace tbs01 datafile '/dm8/dmdb1/tbs01.dbf' size 127;
第1 行附近出现错误[-2410]:数据文件[/dm8/dmdb1/tbs01.dbf]大小无效.
已用时间: 6.486(毫秒). 执行号:0.
SQL> create tablespace tbs01 datafile '/dm8/dmdb1/tbs01.dbf' size 128;
操作已执行
已用时间: 125.494(毫秒). 执行号:18201.
- 查询表空间相关信息
查询表空间相关信息
select tablespace_name, status from dba_tablespaces;
- 修改表空间状态
脱机表空间 - 表空间数据不可访问
alter tablespace tbs01 offline;
联机表空间 - 表空间数据可访问
alter tablespace tbs01 online;
检查表空间状态(联机表空间:status=0;脱机表空间:status=1)
select tablespace_name, status from dba_tablespaces;
- 表空间扩容
1. 扩大数据文件大小
SQL> select tablespace_name,file_name,bytes/1024/1024 size_MB from dba_data_files where tablespace_name='TBS01';
行号 tablespace_name file_name size_MB
---------- --------------- -------------------- --------------------
1 tbs01 /dm8/dmdb1/tbs01.dbf 128
SQL> alter tablespace tbs01 resize datafile '/dm8/dmdb1/tbs01.dbf' TO 200;
SQL> select tablespace_name,file_name,bytes/1024/1024 size_MB from dba_data_files where tablespace_name='TBS01';
行号 tablespace_name file_name size_MB
---------- --------------- -------------------- --------------------
1 tbs01 /dm8/dmdb1/tbs01.dbf 200
2. 增加数据文件
SQL> alter tablespace tbs01 add datafile '/dm8/dmdb1/tbs02.dbf' size 200;
select tablespace_name,file_name,bytes/1024/1024 size_MB from dba_data_files where tablespace_name='TBS01';
3. 创建大表空间,再进行表空间级数据迁移(导出导入)
- 迁移表空间
1. 脱机表空间
2. 迁移表空间
SQL> select tablespace_name,file_name from dba_data_files where tablespace_name='TBS01';
行号 tablespace_name file_name
---------- --------------- ----------------------------
1 tbs01 /dm8/newdisk/dmdb1/tbs01.dbf
2 tbs01 /dm8/newdisk/dmdb1/tbs02.dbf
alter tablespace TBS01 rename datafile '/dm8/dmdb1/tbs01.dbf' to '/dm8/newdisk/dmdb1/tbs01.dbf';
alter tablespace TBS01 rename datafile '/dm8/dmdb1/tbs02.dbf' to '/dm8/newdisk/dmdb1/tbs02.dbf';
3. 联机表空间
- 临时表空间扩容
select tablespace_name,file_name,bytes/1024/1024 size_MB from dba_data_files where tablespace_name='TEMP';
1. sp_set_para_value(2, 'TEMP_SIZE', 200)
2. alter tablespace temp resize datafile '/dm8/dmdb1/TEMP.DBF' to 300;
疑问:
TEMP_SIZE为静态参数,需重启生效。执行第二步使数据文件真的扩大后,不重启数据库,能使用TEMP.DBF新增的空间吗?
- roll表空间扩容
alter tablespace roll resize datafile '/dm8/dmdb1/ROLL.DBF' to 256;
- 删除表空间
drop tablespace tbs01;
注意:
1.表空间内不能有任何对象(需删除或迁移表空间内的对象)
2.要删除的表空间不能是用户的默认表空间(需删除这样的用户或修改用户的默认表空间)
用户
本节涉及用户、角色、权限
- 创建用户
create user user01 identified by 'Strong#pwd'
default tablespace tbs01;
通过下图可以发现,用户是用来约束"使用数据库的人"的,这些约束可粗略分为常规、权限、限制
- 权限授予与回收
用户创建后,需要权限才能办事
grant resource to user01;
revoke resource to user01;
- 查询用户信息及权限
select username,ACCOUNT_STATUS,LOCK_DATE,DEFAULT_TABLESPACE from dba_users;
- 用户创建、修改、删除关键字
create user
alter user
drop user
DM_SQL
本节知识来源于:DCA学习及《SQL必知必会(第5版)》
SQL是一种专门用来与数据库沟通的语言 —— 《SQL必知必会(第5版)》
SQL的作用是告诉数据库要做什么,具体怎么做由数据库管理系统(DBMS)判断并实施
标准SQL的补充,集数据定义、数据查询、数据操纵、数据控制于一体
- 数据查询(DQL)
select - 数据定义(DDL)
create、alter、drop - 数据操纵(DML)
insert、update、delete、truncate - 数据控制(DCL)
grant、revoke
SQL分类的详细介绍可观看:https://blog.csdn.net/mmake1994/article/details/85944438
标识符与保留字
标识符(用来标识某个实体的符号)
- 定界标识符(双引号"")
- 正规标识符(字母、_、$、#、数字、汉字)
保留字(系统定义的,且需要使用的字,故用户不能重新定义它们)
查看保留字
select keyword from v$reserved_words;
数据类型
字符(hello)
数值(123)
位串(01010)
日期时间(2020-02-02)
多媒体数据类型()
表达式
数值表达式
字符串表达式
时间表达式
简单查询
单表查询,且只有一个SELECT语句
用途:从一个或多个表检索信息
为了检索表数据,必须至少给出两条信息——想选择什么(列名),以及从什么地方选择(表名)
检索数据
- 检索单列
简单查询,从city表中检索city_name列的值
SELECT city_name FROM dmhr.city;
分行易于阅读
SELECT city_name
FROM dmhr.city;
- 检索多列
SELECT employee_name, hire_date
FROM dmhr.employee;
数据表示可能不好看(对不齐、数字显示成科学计数法等),这个问题由客户端处理,只要确保数据库里的数据是正确的就好。
- 检索所有列
SELECT *
FROM dmhr.city;
- 检索不同值(去除重复的行)
关键字:DISTINCT
作用:去除重复的行(SELECT检索出的结果集中,可能会有重复的行,可使用DISTINCT去除多余的行)
注意:DISTINCT作用于所有列,必须位于
SELECT department_name
FROM dmhr.department;
SELECT DISTINCT department_name
FROM dmhr.department;
- 限制结果(LIMIT)
对结果集进行筛选(返回结果集的子集),DM支持LIMIT子句和ROW_LIMIT子句
查询结果集中前2条记录
SELECT region_id, region_name
FROM dmhr.region LIMIT 2;
从第3条记录开始,筛选4条记录
SELECT region_id, region_name
FROM dmhr.region LIMIT 2, 4;
查询价格最便宜的50%的书籍
SELECT name, nowprice
FROM production.product
ORDER BY nowprice
FETCH FIRST 50 PERCENT ROW ONLY;
- 使用注释
SQL语句中的描述性语言,DBMS处理SQL时会跳过注释
可描述字段、SQL程序的作用,也可暂停要执行的SQL代码(注释这段SQL),以便测试注释掉的SQL的作用
单行注释
SELECT city_name --城市名
FROM dmhr.city;
多行注释
/* 表里有多少个城市呢?
查询一下看看吧。*/
SELECT city_name
FROM dmhr.city;
排序
对结果集进行排序(升序或降序)
- 单列排序
最低的5份工资
SELECT salary
FROM dmhr.employee
ORDER BY salary
LIMIT 5;
- 多列排序
工资最高的5位员工,名字和电话号码顺序(ASC)显示
SELECT employee_name, phone_num, salary
FROM dmhr.employee
ORDER BY salary DESC, employee_name ASC, phone_num ASC
LIMIT 5;
过滤数据
通常都不需要表的全部数据,需要对表的数据进行过滤
关键字:WHERE - 指定过滤条件通过
WHERE子句常用的过滤条件由谓语和逻辑运算符组成
逻辑运算符可将谓语组合起来,构成更为复杂的条件查询
谓语指明了一个条件(如salary > 30000),该条件求解后(对比当前记录的salary是否比30000大),结果为一个布尔值:真、假或未知(比3w大就为真,反之为假)
问题:什么时候结果会为未知?
谓语运算符
- AND (在谓语后面)
- OR (在谓语后面)
- NOT (在谓语前面)
谓语
- 比较谓语(= > < >= <= <>)
等于 | 大于 | 小于 | 大于等于 | 小于等于 | 不等于 |
---|---|---|---|---|---|
= | > | < | >= | <= | <> |
- BETWEEN
- IN
- LIKE
- NULL
- EXISTS
查询工资在1-3W之间的员工信息
SELECT employee_name, phone_num, salary
FROM dmhr.employee
WHERE salary < 30000 AND salary > 10000;
查询出版社为中华书局或人民文学出版社出版的图书名称与作者信息
SELECT name, author
FROM production.product
WHERE publisher IN ('中华书局', '人名文学出版社');
查看武昌区的相关信息
SELECT address1, city
FROM person.address
WHERE city LIKE '%武昌区%';
查询与刘青相关的评论
SELECT * FROM production.product_review
WHERE product_review.ROW LIKE '%刘青%';
查询没有邮箱的人(email列为NULL)
SELECT name, sex, phone
FROM person.person
WHERE email IS NULL;
注意:使用多个OR和AND时,最好添加括号,确保优先级正确
创建计算字段
存储在数据库表中的数据一般不是应用程序需要的格式
物品订单表存储的物品价格和数量,不存储每个物品的总价。
若应用需要获取商品总价,则需要将物品价格*数量,这个操作由数据库来执行,这样的字段就是计算字段。
我们需要直接从数据库中检索出转换、计算或格式化过的数据,而不是检索出数据,然后再在客户端应用程序中重新格式化
处理数据也是数据库的优势
计算字段并不实际存在于数据库表中
计算字段是运行时在SELECT语句内创建的
- 拼接字符串
SELECT street_address || '的邮政编码为' || postal_code
FROM dmhr.location;
- 执行算术计算
SELECT salary * 12
FROM dmhr.employee;
使用函数处理数据
函数带来的问题
- SQL函数不可移植(这意味着若需要迁移异构数据库,如把Oracle的数据迁移到DM,应用需要修改相关的SQL函数)
函数的作用:对列值进行加工(格式转换、代数运算等)
DM支持的函数分为
- 数值函数
- 字符串函数
- 日期时间函数
- 空值判断函数
- 类型转换函数
查找现价小于10或大于20的产品
SELECT productid, name
FROM production.product
WHERE ABS(nowprice - 15) > 5;
查询牛有几个bit
SELECT BIT_LENGTH('牛');
时间增加2个月
SELECT ADD_MONTHS(DATE '2021-11-08', 2);
查看16进制的abc
SELECT HEX('abc');
返回A
SELECT DECODE(1, 1, 'A', 2, 'B');
返回B
SELECT DECODE(2, 1, 'A', 2, 'B');
汇总数据
汇总出表中的数据,而不是查出数据本身
有时需要对列上的多个数据进行统计分析,而不是要列上某个具体的值
例如,需要统计所有员工的平均薪资时,需要对工资列进行统计分析
为了方便此类检索,便实现了SQL聚集函数
在DM中,聚集函数称为集函数,对行集作统计操作并返回单一统计值
集函数经常与SELECT语句的GROUP BY子句一同使用。集函数对于每个分组只返回一行数据。
要么对全表进行统计,要么(对列)进行分组再统计
计算全体员工的平均工资(对全表进行统计)
SELECT AVG(salary)
FROM dmhr.employee;
计算各个职位的平均工资(根据职位进行分组,再统计)
SELECT job_id, AVG(salary)
FROM dmhr.employee
GROUP BY job_id;
问题:
DM的集行数和分析函数有什么区别?
分组数据
汇总表内容的子集
先分组再统计
WHERE与HAVING的区别
- WHERE过滤行
- HAVING过滤分组
复杂查询
多表查询,或嵌套了多个SELECT语句
子查询
嵌套在其他查询中的查询
联结表
高级联结
组合查询
模式对象
索引
备份还原
概述
可以参考的手册:
- 物理备份还原《DM8 备份与还原》
- 逻辑备份还原《DM8_dexp 和 dimp 使用手册》
达梦云适配中心 - 产品手册
https://eco.dameng.com/docs/zh-cn/pm/index.html
备份还原实现策略有两种:
- dmap辅助进程方式
- 无辅助进程方式
控制备份是否启用辅助插件(dmap)的参数:
- bak_use_ap(dm.ini)
- use_ap(dmrman)
参数值 | 作用 |
---|---|
1 | 使用 AP(需要启动dmap服务) |
2 | 不使用 AP |
备份还原的种类:
- 物理备份还原
- 冷备(控制台工具、dmrman工具)
- 热备(manager、disql工具)
- 逻辑备份还原(dexp、dimp)
物理备份还原
能备份还原哪些内容?
- 全库
- 表空间
- 表
- 归档日志
冷备(脱机备份)
冷备步骤(脱机备份)
- 关闭数据库实例
- 启用 / 不启用AP >> Q:dmap插件如何提高备份还原效率?什么时候不该用它?
- 开始冷备(控制台工具 / dmrman工具)
冷备工具:
- 控制台工具(图形化)
- dmrman工具(命令行)
备份前的准备
关闭数据库实例
./DmServiceDMSERVER stop
启用或不启用dmap
./DmAPService start | stop
开始冷备 - 控制台工具(图形化)
/调用图形化界面 是不是必须得用root?使用dmdba有权限报错.../
# cd $DM_HOME/tool
# ./console
- 全备(全库备份)
- 增量备份
全备
增量备份
- dmrman工具(命令行)
- 全库备份
[dmdba@192 ~]$ dmrman use_ap=2
dmrman V8
RMAN> backup database '/dm8/dmdb1/dm.ini' backupset '/home/dmdba/bakfull';
backup database '/dm8/dmdb1/dm.ini' backupset '/home/dmdba/bakfull';
file dm.key not found, use default license!
[-137]:服务器正在运行或者存在其他进程正在操作同一个库
说明
- 出现此报错说明数据库未关闭,或者其他备份还原进程在操作该数据库
- dmrman使用时,可添加参数use_ap,这将覆盖dm.ini中bak_use_ap的参数值
- 增量备份
[dmdba@192 ~]$ dmrman
dmrman V8
RMAN> backup database '/dm8/dmdb1/dm.ini' increment backupset '/home/dmdba/incfull';
查看特定备份集信息
查看备份集的全部信息
RMAN> show backupset '/home/dmdba/bakfull'
查看备份集的特定信息
RMAN> show backupset '/home/dmdba/bakfull' info meta
热备(不停机备份)
热备步骤
- 开归档(若已开启,则跳过)
- 启动数据库实例(若已开启,则跳过)
- 启动或不启动DMAP服务
- 开始热备
开归档并启动数据库实例
- 使用管理工具实现(图形化)
- 使用disql工具实现(命令行)
使用管理工具实现(图形化)
# cd $DM_HOME/tool/
./manager
使用disql工具实现(命令行)
status$为4:数据库处于打开状态
arch_mode为N:归档为开启
SQL> select name,status$,arch_mode from v$database;
行号 name status$ arch_mode
---------- ----- ----------- ---------
1 dmdb1 4 N
SQL> alter database mount;
SQL> alter database add archivelog 'type=local, dest=/dm8/arch, file_size=64, space_limit=0';
SQL> alter database archivelog;
SQL> alter database open;
SQL> select name,status$,arch_mode from v$database;
行号 name status$ arch_mode
---------- ----- ----------- ---------
1 dmdb1 4 Y
归档相关补充:
- 手工切换归档
把新生成的,还未归档的联机日志都进行归档
alter system switch logfile;
alter database archivelog current;
alter system archivelog current;
Q:执行后查看哪个视图可以检查切换情况?
- 删除归档
/查看与归档相关的函数/
select * from v$ifun where name like '%ARCHIVE%';
/查看归档日志lsn/
select name,first_change#,next_change#
from v$archived_log order by first_change#;
/按lsn删除 - 删除lsn 42111之前归档,返回删除的归档个数,-1表示删除有异常/
select sf_archivelog_delete_before_lsn(42111);
/按时间戳删除 - 删除15天前的归档/
select sf_archivelog_delete_before_time(sysdate-15);
启动或不启动DMAP服务
略
开始热备
- 管理工具(全备、增量备份)
略,与冷备操作类似 - disql做热备(全备、增量备份)
全备
SQL> backup database to WEEKLY_FULL_BAK backupset '/home/dmdba/bakfull05';
增量备份
SQL> backup database increment to DAILY_INC_BAK backupset '/home/dmdba/bakinc05';
补充
- 使用disql备份其他级别上的数据(全库、表空间、表、归档日志)
表空间
SQL> backup tablespace MAIN to TS_MAIN_2021_11_07_07_39_59 backupset '/home/dmdba/tsfull9';
表
SQL> backup table tab1 to "TAB_TAB1.bak" backupset '/home/dmdba/tab_bak2';
归档日志
SQL> backup archivelog to "arch_2021_11_03_07_21_00" backupset 'ARCH_2021_11_03_07_21_00';
- 备份信息查看
/添加备份集目录,否则只显示默认备份路径下的备份集信息/
select SF_BAKSET_BACKUP_DIR_ADD('DISK','/home/dmdba/tsfull9');
/查看备份集的介质类型、备份路径、备份类型等基本信息/
SQL> SELECT DEVICE_TYPE,BACKUP_PATH, TYPE, RANGE# FROM V$BACKUPSET;
行号 DEVICE_TYPE BACKUP_PATH TYPE RANGE#
---------- ----------- --------------------------------------- ----------- -----------
1 DISK /home/dmdba/tsfull9 0 2
2 DISK /dm8/dmdb1/bak/ts_bak_01 0 2
3 DISK /dm8/dmdb1/bak/ARCH_2021_11_03_07_21_00 3 4
已用时间: 14.698(毫秒). 执行号:705.
练习
- 练习1:表空间备份与还原(模拟TBS1表空间损坏)
- 备份表空间
create tablespace TBS1
datafile '/dm8/dmdb1/TBS1.DBF' size 500;
SQL> backup tablespace TBS1 to TS_TBS1_2021_11_07_07_56_44
backupset '/home/dmdba/TS_TBS1_2021_11_07_07_56_44';
- 校验备份集
RMAN> check backupset '/home/dmdba/TS_TBS1_2021_11_07_07_56_44';
check backupset '/home/dmdba/TS_TBS1_2021_11_07_07_56_44';
check backupset successfully.
time used: 17.531(ms)
- 模拟表空间损坏
./DmServiceINST1 stop
mv /dm8/dmdb1/TBS1.DBF /dm8/dmdb1/TBS1.DBF.bak
/启动实例,此时处于mount状态/
./DmServiceINST1 start
- 还原表空间
./DmServiceINST1 stop
dmrman
restore database '/dm8/dmdb1/dm.ini' tablespace tbs1 from backupset '/home/dmdba/TS_TBS1_2021_11_07_07_56_44';
./DmServiceINST1 start
select name from v$tablespace;
- 练习2:全库备份与还原(模拟SYSTEM表空间损坏)
- 全备
SQL> backup database to WEEKLY_FULL_BAK backupset '/home/dmdba/bakfull05';
- 校验备份集
dmrman
RMAN> check backupset '/home/dmdba/bakfull05';
check backupset '/home/dmdba/bakfull05';
check backupset successfully.
time used: 100.549(ms)
- 模拟数据库损坏(模拟SYSTEM表空间损坏)
./DmServiceINST1 stop
mv SYSTEM.DBF SYSTEM.DBF.bak
DmServiceINST1 start
Starting DmServiceINST1: [ FAILED ]
file dm.key not found, use default license!
version info: develop
/dm8/dmdb1/SYSTEM.DBF not exist
- 全库还原
dmrman
restore database '/dm8/dmdb1/dm.ini' from backupset '/home/dmdba/bakfull05';
recover database '/dm8/dmdb1/dm.ini' from backupset '/home/dmdba/bakfull05';
recover database '/dm8/dmdb1/dm.ini' update db_magic;
./DmServiceINST1 start
SQL> select name,status$ from v$database;
行号 name status$
---------- ----- -----------
1 dmdb1 4
备份删除
- SF_BAKSET_BACKUP_DIR_REMOVE
- SF_BAKSET_BACKUP_DIR_REMOVE_ALL
/查看备份信息/
SQL> select DEVICE_TYPE,BACKUP_NAME,BACKUP_PATH from v$BACKUPSET;
行号 DEVICE_TYPE BACKUP_NAME BACKUP_PATH
---------- ----------- ------------------------------ ---------------------------------------
1 DISK TS_FULL_20211107_071623_500462 /dm8/dmdb1/bak/ts_bak_01
2 DISK arch_2021_11_03_07_21_00 /dm8/dmdb1/bak/ARCH_2021_11_03_07_21_00
已用时间: 13.065(毫秒). 执行号:304.
/删除备份目录/
SELECT SF_BAKSET_BACKUP_DIR_REMOVE('DISK','/dm8/dmdb1/bak/ts_bak_01');
/清理全部备份目录,默认备份目录除外/
SELECT SF_BAKSET_BACKUP_DIR_REMOVE_ALL();
逻辑备份还原
概述
数据库中的对象都是通过SQL创建的,既然SQL可转变为对象,那么对象应该也可以转换为SQL。逻辑备份,应该是把对象转换为SQL的过程;逻辑还原,应该是重新执行SQL的过程。
逻辑备份还原需要实例处于运行状态
能备份还原哪些内容?
- 全库
- 用户
- 模式
- 表
逻辑备份工具:dexp、dimp
逻辑备份(逻辑导出)
逻辑还原(逻辑导入)
练习
- 全库导出导入(FULL=y)
将全库导出5236数据库实例,并将其导入到5239实例中
新建数据库,实例端口为5239
dminit PATH=/dm8 DB_NAME=dmdb2 INSTANCE_NAME=inst2 PORT_NUM=5239
启动5239端口的数据库
$ dmserver path=/dm8/dmdb2/dm.ini
创建导出目录
mkdir -p /dm8/backup/dexp
dexp全库导出(5236端口)
./dexp USERID=SYSDBA/SYSDBA@localhost:5236 full=y directory=/dm8/backup/dexp file=dexp01.dmp log=dexp01.log
dimp全库导入(5239端口)
./dimp sysdba/SYSDBA@localhost:5239 full=y directory=/dm8/backup/dexp file=dexp01.dmp log=dimp01.log
- 用户导入导出(OWNER=用户名)
下面代码有问题,待处理。
导出用户USER1(5236端口)
./dexp SYSDBA/SYSDBA@localhost:5236 OWNER=USER1 file=OWNER_USER1.dmp log=OWNER_USER1.dmp directory=/dm8/backup
导入用户USER1(5239端口)
./dimp sysdba/SYSDBA@localhost:5239 OWNER=USER1 directory=/dm8/backup file=OWNER_USER1.dmp log=OWNER_USER1.dmp
-
模式导入导出
-
表导入导出
总结与对比
物理备份和逻辑备份的区别?
物理备份还原是对数据库的操作系统物理文件(如数据文件、控制文件和日志文件等)的备份还原
逻辑备份还原是对数据库逻辑组件(如表、视图和存储过程等数据库对象)的备份还原
物理备份:备份恢复数据页,当数据文件整个丢失时,逻辑备份无法还原此数据文件,但物理备份可以
确定吗?试验下
逻辑备份:
作业
概述
作业系统的设计目标:
自动化重复的工作(定时备份、定时生成数据统计报表等)
作业系统大致组成:
- 作业
- 警报
- 操作员
作业系统使用步骤
1 创建作业(配置步骤,要干哪些事,顺序如何)
2 调度作业(定时执行作业)
3 创建警报(发生警报时通知操作员)
作业系统相关概念解释
-
操作员
维护数据库服务器的人 -
作业
由DM代理程序按顺序执行的一系列指定操作
作业可以产生警报,也可以被一个或多个警报触发执行 -
警报
警报是系统中发生的某种事件,如发生了特定的数据库操作、出错信号、作业的启动、执行完毕等事件。
可定义警报产生条件,也可定义警报产生时系统采取的动作 -
调度
用户定义的时间表,在给定时刻到来时,系统会启动相关的作业,按作业的步骤依次执行。调度可以是一次性的,也可以是周期性的。(作业执行的时间窗口) -
作业权限
添加、配置、调度、删除作业权限,普通用户没有。
创建工作环境
操作员
作业
警报
监控作业
练习
- 每周的周天、周二、周四凌晨1:00更新统计信息
a. 新建作业
b. 新建作业步骤
c. 新建作业调度
d. 查看生成作业的DDL语句
- 每周的周天、周三凌晨2:00做数据库全备
a. 新建作业
b. 新建作业步骤
创建备份目录
mkdir -p /dm8/dmdb1/fullbak
c. 新建作业调度
d. 查看生成的DDL语句
典型示例
示例来源:https://eco.dameng.com/docs/zh-cn/pm/typical-example.html
示例可分为两部分
- 配置作业管理
- 查看监控结构
配置作业管理
可分为6步
1. 数据准备:一张表MYJOB,A列为主键
drop table MYJOB;
create table MYJOB(
A INT primary key,
B VARCHAR(8118)
);
2. 创建作业环境:新建与作业相关的系统表
SP_INIT_JOB_SYS(1);
SQL> select table_name from dba_tables where owner='SYSJOB';
行号 table_name
---------- ---------------------
1 SYSMAILINFO
2 SYSJOBHISTORIES
3 SYSJOBHISTORIES2
4 SYSSTEPHISTORIES2
5 SYSALERTHISTORIES
6 SYSOPERATORS
7 SYSJOBS
8 SYSJOBSTEPS
9 SYSJOBSCHEDULES
10 SYSALERTS
11 SYSALERTNOTIFICATIONS
11 rows got
已用时间: 55.459(毫秒). 执行号:5105.
3. 创建操作员TOM
SP_CREATE_OPERATOR('TOM', 1, 'TOM@dameng.shanghai', '192.168.0.38');
SQL> select * from SYSJOB.SYSOPERATORS;
行号 ID NAME ENABLE EMAILADDR NETSEND_IP
---------- ----------- ---- ----------- ------------------- ------------
1 1 TOM 1 TOM@dameng.shanghai 192.168.0.38
已用时间: 0.450(毫秒). 执行号:5108.
4. 配置作业
a. 创建作业TEST
SP_CREATE_JOB('TEST', 1, 1, 'TOM', 2, 1, 'TOM', 2, '一个测试作业');
select name,username,enable,valid,describe,SYS_FLAG,EP_SEQNO from SYSJOB.SYSJOBS;
行号 name username ENABLE valid describe SYS_FLAG EP_SEQNO
---------- ---- -------- ----------- ----- ------------------ ----------- -----------
1 TEST SYSDBA 1 N 一个测试作业 0 0
b. 配置作业TEST(开始)
SP_JOB_CONFIG_START('TEST');
c. 给作业TEST添加一个作业步骤
向表MYJOB中插入数据,因为A列是主键,故执行第三个插入语句时会报错,错误码-6602
SP_ADD_JOB_STEP('TEST','STEP',0,'insert into sysdba.myjob values(1000,''STEP 1000'');insert into sysdba.myjob values(1001, ''STEP 1001'');insert into sysdba.myjob values(1001, ''STEP 1001'');',0, 1, 1, 1,'', 0);
select jobs.name,steps.COMMAND from sysjob.sysjobs jobs, sysjob.sysjobsteps steps where jobs.name='TEST' and jobs.id=steps.jobid;
行号 name COMMAND
---------- ---- --------------------------------------------------------------------------------------------------------------------------------------------------------
1 TEST insert into sysdba.myjob values(1000,'STEP 1000');insert into sysdba.myjob values(1001, 'STEP 1001');insert into sysdba.myjob values(1001, 'STEP 1001');
d. 为作业增加一个调度
SP_ADD_JOB_SCHEDULE('TEST', 'SCHEDULE', 1, 1, 1, 0, 1, CURTIME, '23:59:59',CURDATE, NULL, '一个测试调度');
select * from sysjob.sysjobschedules;
e. 提交配置(commit)
SP_JOB_CONFIG_COMMIT('TEST');
5. 创建并关联警报
a. 创建警报ALERT1,指定错误码-6602
SP_CREATE_ALERT('ALERT1', 1, 0, 12, -6602, 1, 'DDL警报测试');
SQL> SELECT * FROM SYSJOB.SYSALERTS;
行号 ID NAME ENABLE TYPE DBNAME ERRTYPE ERRCODE DELAYTIME ADDITION_TXT
---------- ----------- ------ ----------- ----------- ------ ----------- ----------- ----------- ---------------
1 1 ALTER1 1 0 dmdb1 12 -6602 1 DDL警报测试
b. 关联警报
SP_ALERT_ADD_OPERATOR('ALERT1','TOM',1,1);
SELECT * FROM SYSJOB.SYSALERTNOTIFICATIONS;
6. 监控作业
a. 添加监控服务DMJMON管理员。可以通过表SYSMAILINFO查看监控服务器管理员信息。
SP_ADD_MAIL_INFO('SYSDBA','SYSDBA','192.168.0.212','admin@dameng.shanghai','admin@dameng.shanghai','888888');
select * from sysjob.sysmailinfo;
b. 开启监控服务
查看监控结果
- 查看作业执行情况
select * from sysjob.SYSJOBHISTORIES2;
行号 EXEC_ID NAME START_TIME END_TIME ERRCODE ERRINFO HAS_NOTIFIED EP_SEQNO
---------- ----------- ---- ------------------- ------------------- ----------- ------------------------------- ------------ -----------
1 2031329739 TEST 2021-11-07 14:26:25 2021-11-07 14:26:26 -6602 违反表[MYJOB]唯一性约束 0 0
- 查看警报发生的历史记录
SQL> insert into SYSDBA.MYJOB values(1000,'STEP 1000');
insert into SYSDBA.MYJOB values(1000,'STEP 1000');
[-6602]:违反表[MYJOB]唯一性约束.
已用时间: 0.603(毫秒). 执行号:0.
SQL> select * from sysjob.SYSALERTHISTORIES;
行号 ID ALERTNAME EVENT_TYPE SUB_TYPE USERNAME DB_NAME OPTIME OPUSER SCH_NAME OBJ_NAME OBJ_TYPE GRANTEE_NAME ERRCODE
---------- ----------- --------- ----------- ----------- -------- ------- ------------------- ------ -------- ------------------------------- -------- ------------ -----------
HAS_NOTIFIED
------------
1 1 ALTER1 0 0 SYSDBA dmdb1 2021-11-07 14:44:25 违反表[MYJOB]唯一性约束 -6602
0
配置ODBC
linux配置ODBC(root用户配置)
1. 检查gcc包
[root@192 ~]# rpm -qa|grep gcc
libgcc-7.3.0-20190804.35.p02.ky10.x86_64
gcc-7.3.0-20190804.35.p02.ky10.x86_64
2. 解压安装包
[root@192 soft]# tar -zxvf unixODBC-2.3.0.tar.gz
3. 配置
[root@192 soft]# cd unixODBC-2.3.0/
[root@192 unixODBC-2.3.0]# ./configure --enable-gui=no
4. 编译安装
[root@192 unixODBC-2.3.0]# make && make install
5. 查看odbc版本
[root@192 unixODBC-2.3.0]# odbc_config --version
2.3.0
6. 查看odbc配置文件路径
[root@192 unixODBC-2.3.0]# odbcinst -j
unixODBC 2.3.0
DRIVERS............: /usr/local/etc/odbcinst.ini
SYSTEM DATA SOURCES: /usr/local/etc/odbc.ini
FILE DATA SOURCES..: /usr/local/etc/ODBCDataSources
USER DATA SOURCES..: /root/.odbc.ini
SQLULEN Size.......: 8
SQLLEN Size........: 8
SQLSETPOSIROW Size.: 8
7. 配置驱动和数据源(DRIVERS、SYSTEM DATA SOURCES)
a. 检查驱动是否有缺失的依赖库(若有not found的需要补上)
[root@192 unixODBC-2.3.0]# ldd /home/dmdba/dmdbms/bin/libdodbc.so
linux-vdso.so.1 (0x00007ffc8f19e000)
libdmdpi.so => /home/dmdba/dmdbms/bin/libdmdpi.so (0x00007f1a276fd000)
libdmfldr.so => /home/dmdba/dmdbms/bin/libdmfldr.so (0x00007f1a26abf000)
libdmelog.so => /home/dmdba/dmdbms/bin/libdmelog.so (0x00007f1a268b8000)
libdmutl.so => /home/dmdba/dmdbms/bin/libdmutl.so (0x00007f1a266a6000)
libdmclientlex.so => /home/dmdba/dmdbms/bin/libdmclientlex.so (0x00007f1a26453000)
libdmos.so => /home/dmdba/dmdbms/bin/libdmos.so (0x00007f1a26227000)
libdmcvt.so => /home/dmdba/dmdbms/bin/libdmcvt.so (0x00007f1a25b46000)
libdmstrt.so => /home/dmdba/dmdbms/bin/libdmstrt.so (0x00007f1a25932000)
librt.so.1 => /usr/lib64/librt.so.1 (0x00007f1a2590c000)
libpthread.so.0 => /usr/lib64/libpthread.so.0 (0x00007f1a258eb000)
libdl.so.2 => /usr/lib64/libdl.so.2 (0x00007f1a258e6000)
libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00007f1a25733000)
libm.so.6 => /usr/lib64/libm.so.6 (0x00007f1a255ae000)
libc.so.6 => /usr/lib64/libc.so.6 (0x00007f1a253f6000)
libgcc_s.so.1 => /usr/lib64/libgcc_s.so.1 (0x00007f1a253dd000)
libdmmem.so => /home/dmdba/dmdbms/bin/libdmmem.so (0x00007f1a251d0000)
libdmcalc.so => /home/dmdba/dmdbms/bin/libdmcalc.so (0x00007f1a24f56000)
/lib64/ld-linux-x86-64.so.2 (0x00007f1a285a7000)
b. 修改配置文件odbcinst.ini(配置驱动)
vi /usr/local/etc/odbcinst.ini
[DM8 ODBC DRIVER]
Description = ODBC DRIVER FOR DM8
DRIVER = /home/dmdba/dmdbms/bin/libdodbc.so
c. 修改配置文件odbc.ini(配置数据源)
vi /usr/local/etc/odbc.ini
[dm8]
Description = DM ODBC DSND
Driver = DM8 ODBC DRIVER
SERVER = localhost
UID = SYSDBA
PWD = SYSDBA
TCP_PORT = 5236
8. 连接测试
[dmdba@192 ~]$ isql dm8
+---------------------------------------+
| Connected! |
| |
| sql-statement |
| help [tablename] |
| quit |
| |
+---------------------------------------+
SQL> select NAME,STATUS$ from v$database;
+---------------------------------------------------------------------------------------------------------------------------------+--------+
| NAME | STATUS$|
+---------------------------------------------------------------------------------------------------------------------------------+--------+
| dmdb1 | 4 |
+---------------------------------------------------------------------------------------------------------------------------------+--------+
SQLRowCount returns 1
1 rows fetched
达梦云适配中心:
https://eco.dameng.com