DCA培训笔记

DCA培训笔记

最近参与了达梦数据库DCA的培训,也就是达梦数据库认证管理员。
现将学习总结分享与此。

此次培训是基于Linux系统下的操作,所以Linux的基本操作还是需要了解。

 

  1. 数据库行业的发展趋势

1.1数据库分类

  1. 国产数据库现状

 

  1. 介绍达梦公司和达梦产品
  2. DM7安装

4.1收集软件信息

  • 操作系统

 

  • glibc rpm -aq|grep glibc(是丨线)

4.2硬件信息

  • 查看cpu

特别注意一下,国产的芯片。华为....

4.3规划安装路径

  • 磁盘信息:fdisk -l

 

  • 查看空间大小:df -h

 

  • 查看内存 free -m

 

  • 建安装目录  mkdir /dm7

4.4规划用户(不建议使用root)

  • 规划用户  id dmdba

 

 

4.5配置环境变量(可选项)

[root@dca01 ~]# cd /home/dmdba

[root@dca01 dmdba]# vi .bash_profile

 

 

4.6设置文件最大打开数目

方式一:[dmdba@dca01 ~]$ umlimit -n 65536

方式二:[root@dca01 dmdba]# vi /etc/security/limits.conf

4.7准备安装包

达梦数据库版本:

开发版:并发数和使用时间做了限制,功能和企业是一样的,但是不能做为商用。

标准版:适用于小型应用,不支持集群,对用户数和并发数有限制

企业版:适用于中大型应用,在生产环境中应用最多的一个版本,三权分立。

安全版:在企业版的基础上做了安全特性,增加了访问控制。四权分立。性能比企业版稍差。

根据服务器的软件硬件环境选择相应安装包。

.iso ,tar...

挂载安装盘:

[root@dca01 installdoc]# mount -o loop /installdoc/dm7_setup_rh6_64_ent_7.6.0.142_20190312.iso /mnt

 

4.8安装数据库软件

 

 

 

 

 

 

 

命令行安装:

[dmdba@dca01 mnt]$ ./DMInstall.bin -i

安装目录介绍:

BIN:达梦数据库命令和lib库

BIN2:uft8

Desktop: 桌面快捷键

DOC:用户手册和操作手册

Drivers:驱动

Include:c语言,头文件

Jar:jar包(导入导出,快速加载,日志挖掘)

Log: 日志文件

Jdk:java包

Tool:客户端

Web:dem

Script:脚本文件

4.9卸载软件

  1. 已经存在数据库,停止数据库,执行uninstall.sh
  2. 只安装了软件,可以直接执行unlinstall.sh

脚本uninstall.sh 在安装目录下。

4.10创建数据

  1. 图形化界面方式:dbca.sh

[dmdba@dca01 tool]$ dbca.sh

 

 

 

 

 

 

 

 

梦数据库常用说明

1.测试查询语句:select 1;

select top 2 from v$dm_ini;

select from v$dm_ini limit 2;

select * from v$dm_ini where rownum<2;

 

2.达梦大小写:

DM7.6之前版本默认密码是转为大写存储的,登录时要注意。比如用户设置test/test123456,那么登录的时候用test/TEST123456和TEST/TEST123456可以登录,用test1/test123456和TEST1/test123456就不能登录。如果设置密码时加引号,则存储实际的密码。

DM8版本后大小写默认通用,用户名密码默认统一都存储大写的,登录时用大小写都可以,都转为大写做匹配。如果设置密码时加引号,则存储实际的密码。

 

3.语句拼接用“||”,如:select username||user_id users from dba_users;

 

4.oracle支持不等于的写法,DM只支持<>和!=,如下语句

select from dba_users d where d.username <> 'SYS';

select from dba_users d where d.username != 'SYS';

select * from dba_users d where d.username ^= 'SYS';

 

5.达梦数据库创建表空间数据文件要求最小要32M。添加的数据文件大小最小为4096页大小,如页大小为8K,则可添加的文件最小值为40968k=32M。

 

6.查看执行计划:explain select ID from TAB1;

 

启停连接数据库

启停数据库

[root@dm1 dm]# service DmServiceDMSERVER start

[root@dm1 dm]# service DmServiceDMSERVER stop

[root@dm1 dm]# service DmServiceDMSERVER restart

[root@dm1 dm]# service DmServiceDMSERVER status

 

连接数据库

注:在连接前是已经启动了数据库服务和配置环境变量的

 

连接命令:

disql SYSDBA/SYSDBA

 

服务器[LOCALHOST:5236]:处于普通打开状态

登录使用时间: 30.904(毫秒)

disql V7.6.0.77-Build(2018.07.17-94714)ENT

Connected to: DM 7.1.6.77

SQL>

 

如果没有配置环境变量可直接到DM路径的bin目录下操作

[root@dm1 dm]# su - dmdba

[dmdba@dm1 dmdbms]$ cd /home/dmdba/dmdbms/bin

[dmdba@dm1 bin]$ ./disql SYSDBA/DAMENG123@localhost

  1. 命令行方式:./dminit  help

  1. 注册实例服务

(使用dminit 创建的实例需要注册服务)

  1. 图形化工具,dbca.sh

 

 

 

 

  1. 用脚本去注册

[dmdba@dca01 tool]$ dminit path=/dm7/data DB_NAME=DM02  instance_name=DM02 PORT_NUM=5239

[root@dca01 ~]# /dm7/script/root/dm_service_installer.sh -t dmserver -i /dm7/data/DM02/dm.ini -p DM02

 

  1. DM7 数据库实例的管理

5.1达梦数据库的模式:

  1. 普通模式(normal):用户可以正常访问数据库,操作没有限制。
  2. 主库模式(primary):用户正常访问数据库,所以对数据库对象的修改强制生成redo日志,在归档有效的时候,发送redo日志到备库。
  3. 备库模式(standby):接收主库发送过来的redo日志并重做日志,数据对用户只读。

5.2数据库的状态

  1. 配置状态(mount):不允许访问数据库对象,只能进行控制文件,参数文件的维护,归档配置,数据库模式的修改等操作。
  2. 打开状态(open):不能进行控制文件维护,归档配置等操作,可以访问数据库对象,对外提供正常的数据库服务
  3. 挂起状态(suspend):与open状态唯一的区别:限制磁盘写入功能。一旦修改数据页,触发redo日志,数据页刷盘,当前用户被挂起。
  4. 关闭状态:shutdown.

5.3状态切换

Shutdown ---mount

Shutdown---open

Open ----mount

Mount----open;

5.4启动过程

  1. shutdown---mount

     分配共享内,启动后台的进程或是线程,打开控制文件。

  1. mount----open

     根据控制文件,打开所有的数据文件和重做日志文件。

启动实例的方法:

1、服务查看器

达梦数据库DmAPService无法开启问题

达梦数据库DmAPService无法开启问题

我们在使用数据库中会用到备份功能,无论冷备份还是热备份,我们的DmAPService服务是必须开启的。那么有些人会发现自己的DmAPService服务是停止状态。并且手动开启也无法完成。

这里为了处理方便快捷看的清楚,使用可视化界面的方式处理。

 

1.首先我们看到服务停止,并且无法开启

 

2.报错信息中给了我们日志地址,要求我们查看日志。

从日志中可以发现,错误信息提示的是管道文件已存在,可以理解为,我们每次启动服务的时候,会自动生存管道文件,但或因为数据库异常或bug导致管道文件存在但服务缺异常的情况。这时候我们只要删除管道文件,让数据库重新生存即可。

 

 

3.现在我们到数据库的文件夹下,bin目录中,删除2个文件。

(数据库文件位置为安装数据库时所设置的位置)

如下图显示的地址,我的安装路径为dm7/bin

管道文件为:

DM_PIPE_DMAP_LSNR_RD

DM_PIPE_DMAP_LSNR_WR

我们将其删除。

 

4.删除后我们再启动服务,会发现服务已经可以正常开启了。

2、命令行启动:dmserver

当前session有效。关闭会话,连接就断了。

 

  1. 操作系统命令启服务:

Linux 6: sevice DmServiceDM02 start

Linux7:systemctl  start DmServiceDM02

判断DM数据库是不是启动的

  1. 端口: netstat -ntl|grep 523*

  1. DMSERVER

 

6、DM数据库工具的使用

6.1disql工具的使用

https://mp.weixin.qq.com/s/UKvdr8wHat_MP12KZCyDfQ

https://mp.weixin.qq.com/s/Nvx_oSPTidIeNqed7l1KTg

https://mp.weixin.qq.com/s/QGGOH1APIo2VpEhgn5YGkA

 

6.2数据库管理工具

 

6.3控制台工具

 

 

COMPATIBLE_MODE  是否兼容其他数据库模式。0:不兼容,1:兼容SQL92标准,2:兼容ORACLE,3:兼容MS SQL SERVER,4:兼容MYSQL

7、达梦数据库手册的使用

 

  1. DM7 的体系结构

8.1 达梦逻辑存储结构

数据库---表空间-----数据文件--段---簇----页

页是最小的逻辑单元,是数据库最小的分配单位。

数据库由一个或多个表空间组成。

每一个表空间由一个或多个数据文件组成

每一个数据文件由一个或多个簇组成

段是簇的上级逻辑单位,一段可以跨多个数据文件

簇是磁盘上连续的页组成。一个簇总一个数据文件中。

页:数据块,最小的数据IO单元。

页的大小可以设置为4K,8k,16k,32k  默认8k.

数据页包含4个部分:页头控制信息,数据,空闲空间,行偏移数组。

簇:是由16或32个连续的数据页组成。默认16.

比如:数据文件 大小为32m ,页大小是8k,则共有  32M/8K/16=256个簇。

每个簇的大小,8k*16=128k

段:由表空间中的一组簇组成,数据文件可以由不同的簇来组成。

8.2 达梦物理存储结构

8.2.1配置文件

以ini结尾的文件

8.2.2 控制文件

控制文件是一个二进制文件,以ctl结尾。

控制文件参数:[dmdba@dca01 DAMENG]$ cat dm.ini|grep ctl

查看控制文件内容:

[dmdba@dca01 DAMENG]$ dmctlcvt help

 

[dmdba@dca01 DAMENG]$ dmctlcvt type=1 src=/dm7/data/DAMENG/dm.ctl dest=/tmp/dmctl.txt

不要随便去修改控制文件

8.2.4数据文件

以dbf结尾的文件

数据文件的大小范围:4096*页大小  -------2147483647*页大小

达梦数据库页大小:4K 8K 16K 32K  默认8k

表空间中数据文件的总数不超过256个

8.2.5重做日志文件

以log结尾的文件

 

  • 1、查看日志信息 v$rlogfile;

  • 增加一个日志文件

SQL> alter database add logfile '/dm7/data/DAMENG/DAMENG04.log' size 128;

 

  • 修改日志文件的大小

重做日志不能删除,所有日志文件大小要求一致。

8.2.6备份文件

以bak为扩展名的文件,还一个.meta元数据文件。

8.2.7归档日志文件

利用归档日志,将系统恢复至故障发生的前一刻,也可以还原指定的时间点,如果没有归档日志,则只能利用备份来进行恢复。

归档参数文件: dmarch.ini

[dmdba@dca01 DAMENG]$ cat  dmarch.ini

8.2.8跟踪文件

跟踪日志文件记录了系统各会话执行的sql语句,错误信息,主要错误和性能问题。启动跟踪日志,对系统性能有较大的影响,默认情况下跟踪日志是关闭的。

Dm.ini  svr_log 参数改为1就打开中跟踪日志。

8.2.9事件日志文件

记录了数据库运行期间的关键事件,如启动,关闭,内存申请失败,io错误等一些致命的错误。DM_HOME/log目录下。命名格式:dm_实例名_日期。

8.3 达梦的内存结构

8.3.1共享内存

SQL> select distinct name,is_shared from v$mem_pool order by 2;

采用共享内存池可以一次性向操作系统申请一大片内存,即内存池在实例运行中需要内存时,可在共享内存池内进行申请或者释放。共享内存池可以在实例的配置文件(dm.ini)进行配置。

SQL> select para_name,para_value from v$dm_ini where para_name like '%MEMORY%';

 

 

MEMORY_TARGET 共享内存的总大小 。0:表示不限制。

Oracle: memory_target=sga+pga

公共池:Memory_pool  157 (减少系统调用)

8.3.2数据缓冲区

缓存使用的数据块,增加逻辑读的次数,提高修改和查询的性能。

参数:BUFFER

参考值:

Oltp:buffer  大小占整个物理内存的40%-60%

Olap:buffer  大小为整个物理内存的60%-80%

数据缓冲区保存的是数据页,包括用户更改的数据页,查询时从磁盘读取的数据页。

相关的视图:

V$bufferpool:用来记录页面缓冲区结构的信息。

V$buffer_lru_first:显示所有缓冲区LRU链首页信息。

V$buffer_lru_last:显示所有缓冲区LRU链末页信息。

V$buffer_upd_first:显示所有缓冲区update链首页信息。

V$buffer_upd_last:显示所有缓冲区update链末页信息。

数据缓冲区有5种类型:

Normal 、keep、 fast、 recycle 和roll;

ORACLE: RECYCLE和keep存的表。

DM:recycle和keep 存的是表空间。

修改参数值:

Oracle:alter system set  ....

DM:SP_SET_PARA_VALUE(scope,para_name,para_value);

通过视图v$parameter来查看类型

 

DM的参数类型:

Sys/session:动态参数,同时修改内存和配置文件

Read only:在数据库运行状态时,不能修改。

IN FILE:静态参数,修改配置文件,重启服务生效。

Scope:

1:动态参数

2:静态参数。

SQL> Select para_name,para_value from v$dm_ini where para_name='BUFFER';

 

SQL> sp_set_para_value(2,'BUFFER',1500);

重启生效

 

 

BUFFER_POOLS: 缓冲池个数

Max_buffer:缓冲区最大值

 

 

是否读取多页:MULTI_PAGE_NUM,默认是单页。

在数据库加密或是启用ssd缓冲区,则不支持多页读取。

8.3.3字典缓冲区

字典缓冲区主要存的一些数据字典信息,如模式信息,表信息,列信息,触发器信息等等。实例在启动的时候,会将部分的数据字典信息加载到字典缓冲区中,并采LRU算法进行字典信息的控制。

DICT_BUF_SIZE

 

V$DICT_CACHE_ITEM:字典缓冲区中字典对象的信息。

V$DICT_CAHCE:字典缓冲区的信息.

8.3.4 Sql缓冲区

SQL> Select para_name,para_value from v$dm_ini where para_name='DICT_BUF_SIZE';

A 语法分析

B 语义分析(读字典表)

C 权限判断

D 查找数据块是否在内存(在内存,产生逻辑读,不在内存,产生物理读)

E 是否有可用的执行计划 ,如有的话,按执行计划来,如果没有,就生成执行计划,运行sql ,将结果集发回客户端)

Sql缓冲区里存放的都是最近使用的执行计划和最近查询的结果集。

USE_PLN_POOL:是否重用执行计划。

1:启执行计划重用

0:禁止执行计划重用

2:对不包含显示参数的语句进行常量参数优化。

3:即包含显示参数语句,也进行常量参数优化。

Cache_pool_size:sql缓冲区的大小

RS_CAN_CACHE:控制结果集缓存

0:禁止重用结果集

1:强制模式:默认缓存所有的结果集

2:手动模式:默认不缓存结果集。

仅当参数RS_CAN_CACHE=1 且USE_PLN_POOL非0的时候,才会缓存结果集。

相关的视图:

V$sql_plan:缓冲区中的执行计划信息。

V$sql_history:sql执行历史信息

V$sql_text:sql执行信息。

V$cachesql:缓冲区中SQL语句的信息。

8.3.5重做日志缓冲区

用于存放重做日志的内存缓冲区,为了避免直接对磁盘的io进行读写,对数据库的性能产生影响。

Rlog_buf_size:日志缓冲区的大小 单位:page 大小设置为2的幂。

Rlog_pool_size:最大日志缓冲区的大小 :单位M

机制是:每3秒写一次,或者是当我们提交的时候,commit;

8.8.6排序区

提供数据排序所需要的内存空间,如果内存排序无法完成,把部分排序转到磁盘上,tmp

SORT_BUF_SIZE

8.3.7Hash区

为了哈希连接设定的缓冲区,该缓冲区是虚拟缓冲区

HJ_BUF_SIZE

 

8.3.8 SSD缓冲区

   将ssd文件用为内存缓存与普通磁盘之间的缓冲层,称为SSD缓存。默认SSD缓冲区是关闭 的,启用ssd缓冲,将SSD_BUF_SIZE设置为大于0,并指定SSD_FILE_PATH就可以了。

8.4 达梦线程的管理

本机ping不通虚拟机,但虚拟机可以ping通本机时怎么解决

在各自网络都连接的情况下,本机ping不通虚拟机,但虚拟机可以ping通本机时解决方案:

 

1、linux虚拟机中连接方式选择NAT模式

 

2、本地启动VMnet8,然后选择VMnet8的属性,手动输入和linux虚拟机ip在同一网段的ip即可

 

 

达梦数据库是单进程、多线程结构

数据库实例:内存结构+一系列的线程组成的。

相关视图:

V$LATCHES:在等待线程信息

V$threads:当前系统中所有活的线程的信息。

V$wthrd_history:记录自数据库启动以来,所有活动过的线程的相关历史信息。

V$process:查看当前数据进程信息。

 

 

监听线程 

IO线程

工作线程

调度线程

日志重做线程

日志归档线程

日志写线程 (把重做日志缓冲区的数据到重做日志中)

......

  1. 表空间管理

表空间是由一个或多个数据文件构成。

达梦数据库默认有哪些表空间和作用?

V$tablespace  dba_tablespaces; v$huge_tablespace  dba_data_files;

 

System:数据字典和全局的系统数据

Roll: 存放了数据库运行过程中产生的回滚记录。

TEMP:临时表空间

Main:数据库默认的表空间。创建数据对象的时候,如果不指定存放的位置,默认存放在该表空间。

HMAIN:HUGE表空间

相关参数:

Undo_retention :单位秒

9.1查询表空间

查询所有表空间

SQL> select name from v$tablespace union select name from v$huge_tablespace;

9.2规划表空间

案例1:SQL> create tablespace tbs1 datafile '/dm7/data/DAMENG/tbs1_01.dbf' size 31;

create tablespace tbs1 datafile '/dm7/data/DAMENG/tbs1_01.dbf' size 31;

 

SQL> create tablespace tbs1 datafile '/dm7/data/DAMENG/tbs1_01.dbf' size 32;

初始文件大小是页的4096倍。 4096*8K =32M

案例2:创建一个表空间,初始大小50M,最大100M

SQL> create tablespace tbs2 datafile '/dm7/data/DAMENG/tbs2_01.dbf' size 50 autoextend on maxsize 100;

 

案例3:创建一个表空间,初始大小50M,表空间由2个数据文件组成,分别存储在不同磁盘上,每次扩展1m,每个数据文件最大100M.

SQL> create tablespace tb3 datafile '/dm7/data/DAMENG/tbs3_01.dbf' size 50 autoextend on next 1 maxsize 100,'/dm7/data/DAMENG/tbs3_02.dbf' size 50 autoextend on next 1 maxsize 100;

 

9.3维护表空间

表空间不足,如何去维护表空间:

  1. 创建大表空间,数据导出,导入。
  2. Resize 数据文件大小。
  3. 增加数据文件。

SQL> alter tablespace tbs1 add datafile '/dm7/data/DAMENG/tbs1_02.dbf' size 32;

9.4更换存储位置

达梦表空间的状态:

0:---online

1:---offline

注意:system,roll. Temp不能offline;

案例4:更换TB3的存储位置。

  1. 表空间offine

SQL> alter tablespace tb3 offline;

  1. 修改存储位置

SQL> alter tablespace tb3 rename datafile '/dm7/data/DAMENG/tbs3_02.dbf' to '/dm7/data/tbs3_02.dbf';

  1. 表空间online;

 

SQL> alter tablespace tb3 online;

 

9.5删除表空间

SQL> drop tablespace tbs2;

  1. 用户管理

10.1相关概念

在DM数据库中用户管理主要涉及到三块,用户,权限,角色。

权限:执行特定类型sql或是访问其他模式对象的权利。

  系统权限:数据库对象的创建、删除、修改等等。

  对象权限:对数据库对象中的数据的操作权限。

角色:是将具有相同权限的用户组织在一起,这一组具有相同权限的用户称为角色。角色是一组权限的集合。一个权限可以赋予不同的角色。

数据库预定义角色三个:DBA,PUBLIC,RESOUCE

三权分立和四权分立

三权分立:数据库管理员,数据安全员,数据库审计员

四权分立:数据库管理员,数据库对象操作员,数据库安全员,数据库审计员。

默认的账号:

   数据库管理员:sysdba

   数据库对象操作员:sysdbo  :只有在安全版里面才会有

数据库安全员: syssso

     数据库审计员:sysauditor

所有账号的默认口令都与用户名一致大写。

10.2如何规划用户?

名字:字母开头,a-z,0-9,$#_

位置:对应的表空间

密码:口令策略

0:无策略

1:禁止与用户名相同

2:口令长度不小于9

4:至少包含一个大写字母

8:至少包含一个数字

16:至少包含一个标点符号(英文的状态下输入,除空格和“”)

口令可以单独使用,也可以组合使用,比如说需要策略1和2 则设置口令策略为3.

创建用户语句 password policy 子句来指定口令策略。用户密码最长为48个字节。

Faild_login_attemps  :密码尝试登录次数

Password_lock_time :密码失败后锁定时间

Password_life_time :密码过期时间。

用户视图:

Sysuser ,  all_user, dba_user

案例1:建立用户test,用户可以创建自己的表,有属于自己独立的表空间,用户密码要求每60天变更一次。

SQL> create tablespace test datafile '/dm7/data/DAMENG/test01.dbf' size 32;

 

SQL> create user test identified by dameng123 limit password_life_time 60 default tablespace test;

 

SQL> grant create table to test;

如何查看用户权限

SQL> select grantee,granted_role from dba_role_privs where grantee='TEST';

SQL> select grantee,privliege from dba_sys_privs where grantee='PUBLIC';

案例2:规划一个用户,用户每60天变更一次密码,密码尝试连接2次失败,账号锁定5分钟,用户能查询dmhr.employee表。

SQL> create user test1 identified by dameng123 limit password_life_time 60,failed_login_attemps 2,password_lock_time 5;

 

 

SQL> alter user test account unlock;

SQL> Grant select on dmhr.employee to test1;

SQL> revoke select on dmhr.employee from test1;

SQL> grant select(employee_name,hire_date) on dmhr.employee to test1;

SQL>select employee_name,hire_date from dmhr.employee;

案例3:企业招聘一批录入人员,权限固定,只能录入city表。

SQL> create user test2 identified by dameng123;

SQL> create role r1;

SQL> grant insert on dmhr.city to r1;

SQL> grant r1 to test2;

 

SQL> grant references any table to test2;

 

 

10.3用户维护

收回权限:revoke

SQL> revoke r1 from test2;

修改用户密码:

SQL> alter user test2 identified by 123456789;

锁定用户:

SQL> alter user test2 account lock;

解锁用户:

SQL> alter user test2 account unlock;

删除用户:

SQL> drop user test2;

SQL> drop user r1;

SQL> drop user test1 cascade;---慎重,最好备份

  1. 模式对象管理

模式是所有对象的集合(表、视图、索引,序列,同义词,自增列)。

DM在创建用户的时候,会默认的创建一个同名的模式。

11.1表的管理

11.1.1达梦支持那些表

默认的表是索引组织表,支持堆表,临时表,分区表,外部表等等。

11.1.2如何去规划表

  1. 命名:字母开头,a-z,0-9,$#_
  2. 数据类型:int char varchar date clob blob number等等。
  3. 存储位置:自已规划的表空间。
  4. 约束(5大约束)非空约束,唯一约束,主键,检查,外键
  5. 注释:comment;

遵循3范式。

案例1:规划一张学员信息表。

表名:STU

学号:id char(10)

姓名:sname varchar(20) not null

性别:sex char(1)

年龄:age int

电话:tel varchar(15) not null

家庭住址:address varchar(50)

表空间:STU

约束  主键列----学号,非空---姓名和电话。

备注:student info

CREATE TABLE "TEST"."STU"

(

"ID" CHAR(10) NOT NULL,

"SNME" VARCHAR(20) NOT NULL,

"SEX" CHAR(1),

"AGE" INT,

"TEL" VARCHAR(15) NOT NULL,

"ADDRESS" VARCHAR(50),

CLUSTER PRIMARY KEY("ID")) STORAGE(ON "STU", CLUSTERBTR) ;

COMMENT ON TABLE "TEST"."STU" IS 'STUDENT INFO';

 

创建表的时候指定约束

SQL> create table test.t2(id int);

SQL> alter table test.t2 modify id int not null;

唯一约束

SQL> create table test.t3(id int unique);

唯一约束遇到null,忽略,可录入多个。

主键约束(一张表只能有一个主键)

SQL> create table test.t4(id int primary key);

SQL> create table test.t5(id int);

SQL> alter table test.t5 add constraint t5_pri primary key(id);

检查约束

SQL> create table test.t6(id int check(id>=5));

 

 

外键约束(可以有多个外键,外键是另一张表的主键)

SQL> create table test.t7(sid int primary key,pid int);

SQL> create table test.t8(id int primary key,sid int foreign key references test.t7(sid));

对列加备注:

SQL> comment on column test.t7.sid is '编号';

 

导入数据到表中:

  1. insert into (...);
  2. 通过脚本把数据导入

Vi a.sql   写入insert into test.T1 valuse(1); 然后:wq  退出

 

 

  1. 利用数据迁移工具来导入

 

 

 

 

 

如何维护表:

  1. 重命名:

SQL> alter table test.t1 rename to TT;

  1. 增加删除列

删除列

启用和禁用约束

SQL> select table_name,constraint_name,constraint_type from dba_constraints where table_name='T6';

SQL> alter table test.t6 disable constraint CONS134218842;

SQL> alter table test.t6 enable constraint CONS134218842;

删除表:

SQL> drop table test.tt;

如何去查看表结构

Sp_tabledef(‘模式名’,‘表名’)

DBMS_METADATA.GET_DDL(类型,表名,模式名)

 

11.2视图

视图分类:简单视图,复杂视图,物化视图

注意:简单视图和复杂视图不占磁盘空间,物化视图占磁盘空间。

11.2.1 简单视图

创建create view() as select () from () where ()

SQL> grant select on dmhr.employee to test;

SQL> create view test.v1 as select * from dmhr.employee;

相关视图

Dba_views;

删除视图:

SQL> drop view test.v1;

11.3索引管理

索引的作用:加快表的查询,对数据库做DML操作的时候,数据会自动维护索引。

索引是一棵倒置的树,使用索引,就是对这棵树做遍历,

达梦支持的索引:二级索引,位图索引,唯一索引,复合索引,函数索引,分区索引等。

11.3.1建立索引的规则:

适合建索引的情况

  1. 经常查询的列
  2. 连接条件列
  3. 谓词经常出现的列(where)
  4. 查询是返回表的一小部分数据。

........

不适合建索引的情况

  1. 列上有大量的null
  2. 列上的数据有限(例如性别);

......

查看表的索引

 

创建索引:

规划索引表空间:

表的数据是无序的,索引的数据是有序的。

创建索引表空间:

SQL> create tablespace index1 datafile '/dm7/data/DAMENG/index101.dbf' size 32;

建索引:

SQL> create table test.emp as select * from dmhr.employee;

SQL> select  table_name,index_name from dba_indexes where table_name='EMP';

 

没有走索引,统计信息是旧的,需要重新收集

SP_CREATE_SYSTEM_PACKAGES(1);

 

 

注意,创建索引,删除,重建索引,收集统计信息的时候,不要在业务高峰去做。

11.3.2 维护索引

重建

SQL> alter index test.ind_emp rebuild;         

SQL> alter index test.ind_emp rebuild online;

删除索引:

SQL> drop index test.ind_emp;

11.4序列

预分配一组内存空间,可以将序列作为自增列。

创建:

CREATE SEQUENCE "TEST"."S1"

            INCREMENT BY 1  ----自增多少

            START WITH 1   ---起始值

            MAXVALUE 5    ---最大值

            MINVALUE 1   --最小值

            NOCYCLE   ----是否循环

            NOCACHE    ---是否缓存

            NOORDER     ---是否顺序

            ;

应用:

SQL> create table test.t10(id int primary key);

SQL> insert into test.t10 values(test.s1.nextval);

SQL> insert into test.t10 values(test.s1.nextval);

SQL> insert into test.t10 values(test.s1.nextval);

SQL> insert into test.t10 values(test.s1.nextval);

SQL> insert into test.t10 values(test.s1.nextval);

SQL> insert into test.t10 values(test.s1.nextval);

 

修改序列:

SQL> alter sequence test.s1 maxvalue 10;

SQL> select test.s1.nextval;

行号     NEXTVAL            

---------- --------------------

1          6

SQL> select sequence_name,max_value from dba_sequences where sequence_name='S1';

删除:

SQL> drop sequence test.s1;

11.5同义词管理

同义词是对象的别名,可以替换模式下的表、视图、序列、函数、存储过程等对象。

同义词公共同义词和普通同义词。

公共同义词:所有用户可以使用,使用时不需要加任何的模式限定。

普通同义词:引用的时候需要加上模式名。

创建:

普通同义词:

SQL> create synonym test.sy1 for dmhr.employee;

公共同义词:

SQL> create public synonym sy2 for dmhr.employee;

 

查同义词:

SQL> select table_name,synonym_name from dba_synonyms where synonym_name in ('SY1','SY2');

删除同义词:

SQL> drop synonym test.sy1;

SQL> drop public synonym sy2;

11.6自增列

一个表只能有一个自增列

语法:

Identity[(种子,增量)]

种子:装载到表中的第一个行所使用的值。

增量:增量值,被添加前一个已装载的行的标识值上。增量可以是正数或是负数,但不能为0;

CREATE TABLE "TEST"."TABLE_1"

(

"ID" INT IDENTITY(1, 1) NOT NULL,

CLUSTER PRIMARY KEY("ID")) STORAGE(ON "TEST", CLUSTERBTR) ;

  1. DMSQL

DMSQL 基于sql92,部分基于sql99

SQL:

DDL:定义 create drop alter truncate

DML:管理 select update delete insert

DCL:控制  grant revoke

TCL:事务控制 commit  rollback

Select

12.1简单查询

语法:select () from ()

第一个括号:*, column_name, alias,expr ||  distinct

第二个括号:table_name

Select * from dmhr.city

Select city_name cn from dmhr.city

SQL> select employee_name||'的工资是:'||salary as desc1  from dmhr.employee limit 10;

SQL> select distinct department_id from dmhr.employee;

12.2过滤查询

Where 子句常用的查询条件由谓词和逻辑运算符组成,谓词指一个条件,结果为一个布尔值,真,假或是未知。

逻辑运算符:and or  not

比较谓词:<  >  <=  >=  <>  =

BETWEEN IN LIKE NULL EXISTS

LIIKE %  _

SQL> select employee_name,salary from dmhr.employee where salary between 20000 and 30000;

SQL> select employee_name,salary from dmhr.employee where salary>=20000 and salary <=30000;

集函数:

  1. count(*);
  2. 相异集函数: AVG|MAX|MIN|SUM|COUNT(DISTINCT<列名>);
  3. 完全集函数:AVG|MAX|MIN|count|sum([ALL]<值表式>);
  4. 方差集函数:var_pop,var_samp,variance,stddev_pop
  5. 协方差集函数:covar_pop ,conver_samp,corr;
  6. 首行函数:first_vlaue
  7. 求区间范围内最大值:area_max
  8. 字符串集函数 listagg/listagg2 LOWER()  UPPER()  RTRIM()

求各个部门的最高工资:

SQL> select department_id,max(salary) from dmhr.employee group by department_id;

 

排序:desc 降序  asc升序

SQL> select department_id,max(salary) ss from dmhr.employee group by department_id order by ss desc;

SQL> select department_id,max(salary) ss from dmhr.employee group by department_id order by ss ;

按照部门分组,求各部门的平均工资,找出部门平均工资大于10000.

SQL> select department_id,avg(salary) from dmhr.employee group by department_id having avg(salary)>10000;

注意:having表示分组后的数据进行过滤,having不能单独使用,一定是和group by 一起使用的。

Select 后出现的列(聚合函数除外),一定要出现在group by 之后。

12.3多表联接查询

语法:select () from () join () on()

第三个括号:表名

第四括号:关联字段。

  1. 内连接:结果集显示全部满足连接条件的记录。

SQL> select employee_name,department_name from dmhr.employee e join dmhr.department d on e.department_id=d.department_id limit 10;

SQL> select employee_name,department_name from dmhr.employee e join dmhr.department d using(department_id) limit 10;

 

外连接:

左外连接:把写left join 左边的全部显示,右边的只显示满足条件的,不满足条件的用null代替。

SQL> select e.employee_name,d.department_name from dmhr.employee e left join dmhr.department d on e.department_id=d.department_id limit 10;

SQL> update dmhr.employee set department_id=null where employee_name='马学铭';

右外连接:

把写在right join右边的全部显示出来,左边的只显示满足条条件,不满足条件的用null代替。

SQL> select e.employee_name,d.department_name from dmhr.employee e right join dmhr.department d on e.department_id=d.department_id limit 10;

全外连接

返回所有的记录,包括不满足条件的。

SQL> select e.employee_name,d.department_name from dmhr.employee e full join dmhr.department d on e.department_id=d.department_id limit 10;

全外连接=左外连接  union  右外连接

总结:

  1. 查询两个表的关联列相关的数据用内连接。
  2. Col_1是col_r的子集的时候用右外连接
  3. Col_R 是col_L的子集的时候用左外连接
  4. Col_r 和col_L彼此有交集的时候,但是彼此不互为子集的时候用全外连接。

12.4子查询

子查询是一个查询sql,嵌套在主查询中,并且其结果做为主查询的条件。子查询行于主查询运行。

1、结果集返回值是唯一的:

Select () from () where()=(子查询结果)

SQL> select employee_name,department_id from dmhr.employee where department_id=(select department_id from dmhr.employee where employee_name='陈仙');

 

  1. 返回值是多行的

Select() from () where () >|any|all(子查询)

ALL:>ALL(MAX)  <ALL(MIN)

ANY:>ANY(MIN)  <ANY(MAX)

找出比104部门工资都高的人。

SQL> select employee_name,department_id,salary from dmhr.employee where salary >all(select salary from dmhr.employee where department_id=104);

找出比104部门任意一人工资都高的人。

SQL> select employee_name,department_id,salary from dmhr.employee where salary >any(select salary from dmhr.employee where department_id=104);

IN  EXISTS

SQL> select employee_name,salary from dmhr.employee where employee_name in('刘瑛','陈伟 婷','薛辉明','于倩文','陈珂');

 

SQL> select employee_name,salary from dmhr.employee where exists (select employee_name from dmhr.employee where department_id='104000');

 IN  :把子查询运行完,再运行主查询

Exists :先运行子查询,如果有满足条件,再运主查询。

  1. 备份还原

备份作用?

  1. 防止误操作。
  2. 软硬件故障,做恢复
  3. 防止天灾。

备份的方式:物理备份和逻辑备份

备份的介质:磁盘,磁带,光盘

集群:数据守护 ,dsc(rac)

也支持第三方的备份软件:上海爱数,鼎甲

13.1物理备份

冷备和热备

冷备:DMAP服务是打开的,数据库实例是关闭的);

方式:

利用控制台工具去备

  1. DMRMAN工具备份:

冷备份,要停止数据库,如果不停止造成数据丢失。

热备份(DMAP服务是打开的,数据库实例是打开的,数据库是归档模式

开归档:

  1. 命令方式:

SQL> alter database mount;

SQL> alter database add archivelog 'type=local,dest=/dm7/arch,file_size=64,space_limit=0';

SQL> alter database archivelog;

SQL> alter database open;

SQL> select name,status$,arch_mode from v$database;

  1. 利用管理工具去开归档

[dmdba@dca01 ~]$ disql sysdba/SYSDBA@localhost:5238

命令行方式下全备,增量备(考试的时候建议用热备)

全备:

SQL> backup database full backupset '/dm7/backup/full_bak';

增量备:

SQL> backup database increment backupset '/dm7/backup/incr_bak';

 

  1. 利用管理工具作热备

还原:

模拟表空间损坏:

[dmdba@dca01 DAMENG]$ mv tbs1_02.dbf tbs1_02.dbf.bak

重启服务

数据库处于mount状态,手动open

SQL> restore tablespace tbs1 from backupset '/dm7/backup/full_bak/';

SQL> alter database open;

SQL> alter tablespace tbs1 online;

13.2逻辑备份

导入导出(DIMP,DEXP)

分为四种级别:

数据库级别,用户级别,模式级别和表级别,四种级别独立互斥,不能同时存在,四种级别提供的功能:

  • 数据库级别:导出或导入整个数据库的访问对象。
  • 用户:导入或导出一个或多个用户所拥有的所有对象。
  • 模式:导入或导出一个或多个模式下的所有对象。
  • 表级:导出或导入一个或多个指定表或表分区。

 

  1. 逻辑导出

[dmdba@dca01 bin]$ ./dexp

sysdba/dameng123@localhost:5236 file=dexp01.dmp

log=dexp01.log directory=/dm7/backup/dexp full=y

  1. 导入:

[dmdba@dca01 bin]$ ./dimp sysdba/SYSDBA@localhost:5238 file=/dm7/backup/dexp/dexp01.dmp log=/dm7/backup/dexp/dimp02.log;

  1. 作业

定时去执行的一组任务

14.1定期去备份。

1、创建代理环境(达梦会创建一个sysjob模式)

 

2创建作业:

call SP_CREATE_JOB('JOB1',1,0,'',0,0,'',0,'');

 

call SP_JOB_CONFIG_START('JOB1');

 

call SP_ADD_JOB_STEP('JOB1', 'JOB1', 5, '01000/dm7/backup/JOB', 1, 2, 0, 0, NULL, 0);

 

call SP_ADD_JOB_SCHEDULE('JOB1', 'JOB1', 1, 2, 1, 64, 0, '22:00:00', NULL, '2020-02-19 14:48:01', NULL, '');

 

call SP_JOB_CONFIG_COMMIT('JOB1');

 

  1. 定时增量备份

call SP_CREATE_JOB('JOB2',1,0,'',0,0,'',0,'');

 

call SP_JOB_CONFIG_START('JOB2');

 

call SP_ADD_JOB_STEP('JOB2', 'JOB2', 5, '11000/dm7/backup/full_bak|/dm7/backup/JOB', 1, 2, 0, 0, NULL, 0);

 

call SP_ADD_JOB_SCHEDULE('JOB2', 'JOB2', 1, 2, 1, 63, 0, '22:00:00', NULL, '2020-02-19 14:53:32', NULL, '');

 

call SP_JOB_CONFIG_COMMIT('JOB2');

  1. DM开发

达梦支持那些语言做开发

C C++  JAVA  PYTHON  PHP PERL

定义一个DM JDBC的驱动串:

String jdbcString=”dm.jdbc.driver.DmDriver”

DM URL连接串:

String urlstring=”jdbc:dm://ip:5236”

  1. 配置ODBC
  • LINUX 环境中配置ODBC环境

检查: rpm -aq|grep gcc, 有没有gcc包,如果没有,配置yum源,用yum安装gcc.

[root@dca01 unixODBC-2.3.0]# tar -xzvf unixODBC-2.3.0.tar.gz

[root@dca01 unixODBC-2.3.0]# cd unixODBC-2.3.0

配置ODBC

[root@dca01 unixODBC-2.3.0]# ./configure --enable-gui=no

编译ODBC

[root@dca01 unixODBC-2.3.0]# make

[root@dca01 unixODBC-2.3.0]# make install

查看ODBC的版本

[root@dca01 unixODBC-2.3.0]# odbc_config --version

查看ODBC配置文件的路径:

[root@dca01 unixODBC-2.3.0]# odbc_config --odbcini

[root@dca01 unixODBC-2.3.0]# odbcinst -j

配置ODBC.INIodbcinst.ini

测试ODBC

  1. 存储过程

写匿名块

Declare (可选项)

Begin

   Body;

Exception

End;

SQL> set serveroutput on

SQL> begin

2   print('hello world');

3   end;

4   /

hello world

SQL> begin

2    for i in 1..5 loop

3        print(i);

4   end loop;

5   end;

6   /

1

2

3

4

5

//

案例1:根据员工的编号找出员工所在部门?

CREATE PROCEDURE "TEST"."SNO"("BH" IN INT)

AS

  DEPT INT;

BEGIN

  SELECT DEPARTMENT_ID INTO DEPT FROM DMHR.EMPLOYEE WHERE EMPLOYEE_ID=BH;

  PRINT(DEPT);

END;

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值