达梦数据库的安装与使用

在测试服务器上部署了一个达梦单点服务,做一下简要的记录

DM8 安装

安装前准备

配置安装目录

单独申请了一块盘/dev/vdf,分区格式化后将其挂载到 /dm

fdisk /dev/vdf
mkfs.ext4 /dev/vdf1
mkdir /dm
mount /dev/vdf1 /dm

设置永久挂载

vi /etc/fstab
/dev/vdf1	/dm	ext4	defaults	0	0
mount -a

操作系统设置

禁用 SELINUX

使用 setenforce 临时关闭

getenforce # 查看 SELINUX 状态,如果不是 disabled 状态使用 senenforce 设置
setenforce 0

也可以修改 config 文件禁用

vi /etc/selinux/config
# 如果不是 disabled 状态则修改为disabled
SELINUX=disabled
reboot
关闭防火墙
systemctl status firewalld # 查看防火墙状态
systemctl stop firewalld
systemctl disable firewalld
设置文件最大打开数目
ulimit -n 65536

修改 config 文件则永久生效

vi /etc/security/limits.conf
dmdba		soft	nofile	65536
dmdba		hard	nofile	65536
dmdba		soft	nproc	10240
dmdba		hard	nproc	10240
dmdba		soft	data	unlimited
dmdba		hard	data	unlimited
dmdba		soft	fsize	unlimited
dmdba		hard	fsize	unlimited
用户权限配置
groupadd dinstall
useradd -g dinstall dmdba
chown -R dmdba:dinstall /dm
其他设置

关闭 CUPS, Postfix, rpcbind 服务

上传安装包

一共有DMInstall.bindm.keyDmJdbcDriver16.jar三个文件

使用sftp上传到/dm/software

软件安装

切换到 dmdba执行安装

su - dmdba
cd /dm/software/
chmod 755 *
./DMInstall.bin -i

再此遇到了Bash script and /bin/bash^M: bad interpreter: No such file or directory的报错,可能是由于安装脚本在 Windows 下修改过导致,将换行符由 CRLF 转为 LF 可解决

sed -i -e 's/\r$//' DMInstall.bin

接着按提示导入 key,设置时区,设置目录为/dm/dmdba/dmdbms

再切回 root 用户执行脚本

su - root
/dm/dmdba/dmdbms/script/root/root_installer.sh

配置好环境变量

vi ~/.bash_profile
export DM_HOME="/dmsoft/dmdbms"
export PATH=$DM_HOME/bin:$PATH
source ~/.bash_profile

单点配置

初始化数据库

su - dmdba
cd /dm
mkdir dmdata dmarch dmbak
cd dmdba/dmdbms/bin

通过 dminit 来设置参数

./dminit help # 查看参数说明,按照要求设置参数

./dminit PATH=/dm/dmdata DB_NAME=DMDB INSTANCE_NAME=DBSERVER PORT_NUM=5238 LOG_SIZE=300 EXTENT_SIZE=16 SYSDBA_PWD=[password] SYSAUDITOR_PWD=[password]

启用 DM 数据库服务

切到 root 用户

将服务注册到操作系统

cd /dm/dmdba/dmdbms/script/root
./dm_service_installer.sh -t dmserver -dm_ini /dm/dmdata/DMDB/dm.ini -p DBSERVER

使用 systemctl 管理服务

systemctl enable DmServiceDBSERVER.service
systemctl start DmServiceDBSERVER.service

数据库维护与管理

表与用户创建

登录数据库

cd /dm/dmdba/dmdbms/bin
./disql SYSDBA/[password]@localhost:5238

创建表空间 DMTBS,文件存储在 /dm/dmdata中,分为两个数据文件 DMTBS01.DBF 和 DMTBS02.DBF,每个文件初始大小为 64M,每次自动扩展 2M,单个数据文件最大 10G

SQL> CREATE TABLESPCE "DMTBS" DATAFILE '/dm/dmdata/DMTBS01.DBF' SIZE 64 AUTOEXTEND ON NEXT 2 MAXSIZE 10240, '/dm/dmdata/DMTBS02.DBF' SIZE 64 AUTOEXTEND ON NEXT 2 MAXSIZE 10240 CACHE = NORMAL;

创建用户 DMTEST,密码 [password],默认表空间为 DMTBS

SQL> CREATE USER "DMTEST" IDENTIFIED BY [password] DEFAULT TABLESPACE "DMTBS"

创建角色 TESTROLE,具有创建表,创建视图,创建索引的权限

SQL> CREATE ROLE TESTROLE;
SQL> GRANT CREATE TABLE, CREATE VIEW, CREATE INDEX TO TESTROLE;

将角色 RESOURCE,TESTROLE 赋给 DMTEST 用户,并赋予 DMTEST 查询 DBA_TABLESPACES 的权限

SQL> GRANT RESOURCE, TESTROLE TO DMTEST;
SQL> GRANT SELECT ON DBA_TABLESPACES TO DMTEST;

在 DMTEST 用户下创建 EMP 表和 DEPT 表。

SQL> CREATE TABLE EMP (
    EMP_ID INT NOT NULL,
    EMP_NAME VARCHAR(20),
    EMAIL VARCHAR(50),
    PHONE_NUM VARCHAR(20),
    HIRE_DATE DATE,
    JOB_ID VARCHAR(10),
    MANAGER_ID INT,
    SALARY INT,
    DEPT_ID INT
);
SQL> CREATE TABLE DEPT (
    DEPT_ID INT NOT NULL,
    DEPT_NAME VARCHAR(30),
    LOCATION_ID INT,
    LOCATION_ADDR VARCHAR(30)
);

使用 sql 脚本

假设有脚本/dm/script1.sql

INSERT INTO EMP (EMP_ID, EMP_NAME) VALUES (1, 'NAME');
INSERT INTO EMP (EMP_ID, EMP_NAME, EMAIL) VALUES (2, 'NAME', 'a@b');
INSERT INTO DEPT (DEPT_ID, DEPT_NAME) VALUES (1, 'DEPTNAME');

连接到数据库后可直接调用该脚本

SQL> start /dm/script1.sql

创建视图

创建视图 VIEW_HIREDATE 存放 HIRE_DATE 为 2006-01-01 至 2009-01-01 的条目

SQL> CREATE VIEW VIEW_HIREDATE AS SELECT * FROM EMP WHERE HIRE_DATE BETWEEN '2006-01-01' AND '2009-01-01';

创建视图 VIEW_SALARY 查询平均 SALARY 大于 12000 的 DEPT

SQL> CREATE VIEW VIEW_SALARY AS SELECT * FROM DEPT WHERE DEPT_ID IN (
    SELECT DEPT_ID
    FROM EMP
    GROUP BY DEPT_ID
    HAVING AVG(SALARY) > 12000
);

创建索引

在列 EMP_NAME 添加索引 IND_EMP_NAME

-- 创建索引表空间
SQL> CREATE TABLESPACE INDEX1 DATAFILE '/dm/dmdata/DMDB/index1_01.dbf' size 64 autoextend on next 10 mamxsize 2000;
-- 创建索引
SQL> CREATE INDEX IND_EMP_NAME ON EMP(EMP_NAME) TABLESPACE INDEX1;

数据库备份

物理备份

冷备

使用 DMRMAN 进行冷备, DMAP 服务为打开状态, 并关闭数据库实例

默认备份方式为完全备份

# 关闭数据库实例
systemctl stop DmServiceDBSERVER.service
cd /dm/dmdba/dmdbms/bin
./dmrman
# 完全备份
RMAN> backup database '/dm/dmdata/DMDB/dm.ini' full backupset '/dm/dmbak/DMDB_bak'
# 增量备份
RMAN> backup database '/dm/dmdata/DMDB/dm.ini' increment with backupdir '/dm/dmbak' backupset '/dm/dmbak/DMDB_bak'
# 查看备份信息
RMAN> show backupset '/dm/dmbak/DMDB_bak'
RMAN> show backupset '/dm/dmbak/DMDB_bak' info meta
热备

使用 SQL 进行备份,DMAP 服务和数据库实例都是打开状态,为了保证备份数据的一致性,需要配置并开启本地归档

-- 打开归档
SQL> ALTER DATABASE MOUNT;
SQL> ALTER DATABASE ADD ARCHIVELOG 'type=local,dest=/dm/dmarch,file_size=64,space_limit=0';
-- 如果需要修改归档配置则可使用 ALTER DATABASE MODIFY ARCHIVELOG
SQL> ALTER DATABSE ARCHIVELOG;
SQL> ALTER DATABASE OPEN;
-- 检查归档状态
SQL> SELECT name, status$, arch_mode FROM v$database;

-- 完全备份
SQL> backup database full backupset '/dm/dmbak/DMDB_bak2';

-- 增量备份
SQL> backup database increment backupset '/dm/dmbak/incr_DMDB_bak2';
自动备份作业

首先启动代理

SQL> SP_INIT_JOB_SYS(1);

可借助管理工具直接在 GUI 上编辑生成作业

创建 JOB1,每周日晚 22:00 对数据库做完全备份

SQL> call SP_CREATE_JOB('JOB1',1,0,'',0,0,'',0,'周日全备');
SQL> call SP_JOB_CONFIG_START('JOB1');
SQL> call SP_ADD_JOB_STEP('JOB1', '全备', 5, '01000/dm/dmbak', 1, 2, 0, 0, NULL, 0);
SQL> call SP_ADD_JOB_SCHEDULE('JOB1', '周日执行', 1, 2, 1, 1, 0, '22:00:00', NULL, '2021-04-20 02:34:52', NULL, '');
SQL> call SP_JOB_CONFIG_COMMIT('JOB1');

创建 JOB2,每周一到周六 22:00 对数据库做增量备份

SQL> call SP_CREATE_JOB('JOB2',1,0,'',0,0,'',0,'平时增备');
SQL> call SP_JOB_CONFIG_START('JOB2');
SQL> call SP_ADD_JOB_STEP('JOB2', '增备', 5, '01000/dm/dmbak|/dm/dmbak', 1, 2, 0, 0, NULL, 0);
SQL> call SP_ADD_JOB_SCHEDULE('JOB1', '周一到周六执行', 1, 2, 1, 126, 0, '22:00:00', NULL, '2021-04-20 02:34:52', NULL, '');
SQL> call SP_JOB_CONFIG_COMMIT('JOB2');

逻辑备份

使用 dexp 对数据库执行逻辑导出

cd /dm/dmdba/dmdbms/bin
./dexp SYSDBA/[password]@localhost:5238 FILE=dmdb_full.dmp LOG=dmdb_full.log DIRECTORY=/dm/dmbak FULL=y

使用 dimp 导入

./dimp SYSDBA/[password]@localhost:5238 FILE=/dm/dmbak/dmdb_full.dmp LOG=/dm/dmbak/dimp.log

配置 ODBC

编译好 ODBC 后,配置 odbc.ini 和 odbcinst.ini

# odbc.ini
[dm8]
DESCRIPTION = DM ODBC DSND
DRIVER = DM8 ODBC DRIVER
SERVER = localhost
UID = SYSDA
PWD = [password]
TCP_PORT = 5238

# odbcinst.ini
[DM8 ODBC DRIVER]
DESCRIPTION = ODBC DRIVER FOR DM8
DRIVER = /dm/dmdba/dmdbms/bin/libdodbc.so

修改文件属性即可连接

chmod 777 odbc.ini
chmod 777 odbcinst.ini
su - dmdba
isql dm8