达梦数据库 | 教程 | 6.备份:DISQL
说明
在达梦数据库中,使用DISQL工具,可以对数据库实施备份操作。
备份 – 操作:1
最简单的备份是:在DISQL中直接执行BACKUP DATABASE语句
如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
[dmdba@node1 ~]$ ps -ef | grep dmserver dmdba 84286 1 0 17:04 ? 00:00:02 /opt/dmdbms/bin/dmserver /data/dameng/DAMENG/dm.ini -noconsole dmdba 86380 86026 0 18:28 pts/5 00:00:00 grep --color=auto dmserver [dmdba@node1 ~]$ [dmdba@node1 ~]$ netstat -tupln | grep 5236 (Not all processes could be identified, non-owned process info will not be shown, you would have to be root to see it all.) tcp6 0 0 :::5236 :::* LISTEN 84286/dmserver [dmdba@node1 ~]$ [dmdba@node1 ~]$ disql disql V8 username:sysdba password: Server[LOCALHOST:5236]:mode is normal, state is open login used time : 7.799(ms) SQL> SQL> backup database backupset 'db_backup_20210719_0928'; executed successfully used time: 881.887(ms). Execute id is 204. SQL> SQL> exit [dmdba@node1 ~]$ |
可以看到,上面的备份成功执行完成了;
那么备份被存放在哪里了呢?
默认情况下备份的路径是在配置文件dm.ini中定义的,通过参数BAK_PATH指定;
如果没有设置,则默认使用配置文件dm.ini中的SYSTEM_PATH路径,默认的备份路径为SYSTEM_PATH指定的路径下的子目录bak。
先查看下备份所在的路径:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
[dmdba@node1 ~]$ cd /data/dameng/DAMENG/ [dmdba@node1 DAMENG]$ [dmdba@node1 DAMENG]$ ls -ltr total 335260 -rw-r--r-- 1 dmdba dinstall 479 Jul 14 20:04 sqllog.ini -rw-r--r-- 1 dmdba dinstall 633 Jul 14 20:04 dm_service.prikey drwxr-xr-x 2 dmdba dinstall 6 Jul 14 20:04 HMAIN -rw-r--r-- 1 dmdba dinstall 853 Jul 14 20:04 dminit20210714200402.log drwxr-xr-x 2 dmdba dinstall 6 Jul 14 20:07 trace -rw-r--r-- 1 dmdba dinstall 12 Jul 14 20:07 rep_conflict.log -rw-r--r-- 1 dmdba dinstall 134217728 Jul 14 20:08 DMHR.DBF -rw-r--r-- 1 dmdba dinstall 157286400 Jul 14 20:08 BOOKSHOP.DBF -rw-r--r-- 1 dmdba dinstall 134217728 Jul 14 20:12 MAIN.DBF -rw-r--r-- 1 dmdba dinstall 701 Jul 15 01:30 dmarch.ini_old_20210715 -rw-r--r-- 1 dmdba dinstall 10485760 Jul 15 01:52 TEMP.DBF -rw-r--r-- 1 dmdba dinstall 268435456 Jul 15 01:52 DAMENG02.log -rw-r--r-- 1 dmdba dinstall 6144 Jul 15 01:52 dm.ctl drwxr-xr-x 2 dmdba dinstall 4096 Jul 15 01:52 ctl_bak -rw-r--r-- 1 dmdba dinstall 243 Jul 15 02:01 dmarch.ini -rw-r--r-- 1 dmdba dinstall 49831 Jul 15 02:01 dm.ini drwxr-xr-x 3 dmdba dinstall 37 Jul 18 18:28 bak -rw-r--r-- 1 dmdba dinstall 24117248 Jul 18 18:29 SYSTEM.DBF -rw-r--r-- 1 dmdba dinstall 134217728 Jul 18 18:29 ROLL.DBF -rw-r--r-- 1 dmdba dinstall 268435456 Jul 18 18:29 DAMENG01.log [dmdba@node1 DAMENG]$ [dmdba@node1 DAMENG]$ cat dm.ini | grep -E 'BAK_PATH|SYSTEM_PATH' CTL_BAK_PATH = /data/dameng/DAMENG/ctl_bak #dm.ctl backup path SYSTEM_PATH = /data/dameng/DAMENG #system path BAK_PATH = /data/dameng/DAMENG/bak #backup file path [dmdba@node1 DAMENG]$ |
让我们去文件系统上看看刚刚的备份集:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
[dmdba@node1 DAMENG]$ cd /data/dameng/DAMENG/bak/ [dmdba@node1 bak]$ [dmdba@node1 bak]$ ls -ltr total 0 drwxr-xr-x 2 dmdba dinstall 114 Jul 18 18:28 db_backup_20210719_0928 [dmdba@node1 bak]$ [dmdba@node1 bak]$ du -sh db_backup_20210719_0928/ 17M db_backup_20210719_0928/ [dmdba@node1 bak]$ [dmdba@node1 bak]$ cd db_backup_20210719_0928/ [dmdba@node1 db_backup_20210719_0928]$ [dmdba@node1 db_backup_20210719_0928]$ ls -ltr total 16612 -rw-r--r-- 1 dmdba dinstall 16906752 Jul 18 18:28 db_backup_20210719_0928.bak -rw-r--r-- 1 dmdba dinstall 6656 Jul 18 18:28 db_backup_20210719_0928_1.bak -rw-r--r-- 1 dmdba dinstall 90624 Jul 18 18:28 db_backup_20210719_0928.meta [dmdba@node1 db_backup_20210719_0928]$ [dmdba@node1 db_backup_20210719_0928]$ file * db_backup_20210719_0928_1.bak: data db_backup_20210719_0928.bak: data db_backup_20210719_0928.meta: data [dmdba@node1 db_backup_20210719_0928]$ |
可以看到备份数据了。
备份成功后:
- 会生成一个备份元数据文件:*.meta
- 一个或者多个备份片文件:*.bak
- 当备份数据超过限制大小的时候,会生成新的备份文件,新的备份文件名是初始文件名后面加文件编号
备份:语法详解
BACKUP DATABASE 的语法详解如下:
1 2 3 4 5 6 7 8 9 |
BACKUP DATABASE [[[FULL] [DDL_CLONE]]| INCREMENT [CUMULATIVE][WITH BACKUPDIR '< 基备份搜索目录>'{,'<基备份搜索目录>'} |[BASE ON <BACKUPSET '<基备份目录>']][TO <备份 名>][BACKUPSET '<备份集路径>'] [DEVICE TYPE <介质类型> [PARMS '<介质参数>']] [BACKUPINFO '<备份描述>'] [MAXPIECESIZE <备份片限制大小>] [IDENTIFIED BY <密码>[WITH ENCRYPTION<TYPE>][ENCRYPT WITH <加密算法>]] [COMPRESSED [LEVEL <压缩级别>]] [WITHOUT LOG] [TRACE FILE '< TRACE 文件名>'] [TRACE LEVEL < TRACE 日志级别>] [TASK THREAD <线程数>][PARALLEL [<并行数>] [READ SIZE <拆分块大小>]]; |
下面来具体的解读一下上述的每一个选项:
选项 | 说明 | 备注 |
FULL | 完全备份,可以不指定,因为默认就是完全备份 | |
DDL_CLONE | 数据库克隆: 该参数只能在完全备份的时候使用,表示仅备份所有的元数据,而不备份数据; 例如: 只备份表的定义,而不备份表中的数据 限制: 表空间与表备份不支持该参数 | |
INCREMENT | 增量备份,如果需要执行增量备份,则必须指定该参数 | |
CUMULATIVE | 用于增量备份中,表示累积增量备份类型,如果不指定,则默认为差异备份类型 | |
WITH BACKUPDIR | 用于增量备份中,表示基备份的搜索目录 最大长度为:256个字节 如果不指定,则默认在备份目录下搜索基备份 如果基备份不在默认的备份目录下,则增量备份的时候必须指定该参数 | |
BASE ON | 用于增量备份中,指定基备份集目录 | |
TO | 指定生成备份的名称 如果不指定,则系统随机生成,默认备份名称的格式为:DB_库名_备份类型_备份时间 其中,备份时间为开始备份的时候,系统的时间 | |
BACKUPSET | 指定当前备份集生成路径 如果指定为相对路径,则在默认备份路径中生成备份集 如果不指定,则在默认备份路径中按照约定规则生成备份集目录。 库级备份默认备份目录生成规则:DB_库名_备份类型_备份时间 备份时间部分:年月日_时分秒_毫秒 如果库名超长,使得最终生成的备份目录名称大于128字节,那么,则会去掉库名字段,调整为:DB_备份类型_备份时间 | |
DEVICE TYPE | 指定存储备份集的介质类型 支持:DISK(磁盘) 与 TAPE(磁带) 默认:DISK | |
PARAMS | 只有介质类型为TAPE的时候才有效 | |
BACKUPINFO | 备份的描述信息,最大不能超过256个字节 | |
MAXPIECESIZE | 最大备份片文件大小的上限 单位:M 最小:32M 最大: 32bit – 2G 64bit – 128G | |
IDENTIFIED BY | 指定备份的时候的加密密码 密码应该用双引号包起来,避免一些特殊字符通不过语法检测 密码的设置规则,遵循ini文件中的PWD_POLICY指定的口令策略 | 究竟是哪个INI配置文件呢? |
WITH ENCRYPTION | 指定加密类型 0 – 不加密,不对备份文件进行加密处理 1 – 简单加密,对备份文件设置口令,但文件内容仍然以明文保存 2 – 完全数据加密,对备份文件进行完全的加密,备份文件以密文方式存储 默认:简单加密 | |
ENCRYPT WITH | 加密算法 当不指定ENCRYPT WITH子句的时候,使用AES256_CFB加密算法 | |
COMPRESSED | 取值范围:0 – 9 0 不压缩 1 1级压缩 9 9级压缩 压缩级别越高,压缩越慢,压缩比率越高 默认: 如果指定COMPRESSED,则默认1 如果没有指定,则默认0 | |
WITHOUT LOG | 联机数据库备份是否备份日志 如果不使用,表示备份 如果使用,表示不备份 如果使用了该参数,则后面使用DMRMAN工具还原的时候,必须指定WITH ARCHIVEDIR参数 | |
TRACE FILE | 指定生成的TRACE文件 启用TRACE但是不指定TRACE FILE的时候,默认会在DM数据库系统的log目录下生成TRACE FILE文件,格式为:DM_SBTTRACE_年月.log 如果使用的是相对路径,则会生成在执行的时候的同级目录下 不能指定为已存在的文件 不能指定为ASM文件 | |
TRACE LEVEL | 取值:1 2 默认:1 1 表示不启用TRACE,这时候如果指定了TRACE FILE,会生成TRACE文件,但是不会写入TRACE信息 2 表示启用TRACE,并且写入TRACE相关内容 | |
TASK THREAD | 备份过程中数据处理过程线程的个数 取值:0 – 64 默认:4 如果指定为0,则会调整为1 如果指定的数字超过了当前系统的主机的核数,则会调整为主机核数 线程数(TASK TRHEAD)*并行数(PARALLEL)不能超过512 | |
PARALLEL | 指定并行备份的并行数和READ SIZE(拆分块大小) 并行数取值范围:0 – 128,默认:4,指定0或1都被认为是非并行备份;如果没有指定PARALLEL,则为非并行备份 并行备份不支持备份介质TAPE 拆分快大小,用户指定对于大数据量的数据文件并行备份的时候拆分快的大小,默认1GB,最小不能小于512M,当指定的拆分快大小小鱼512M的时候,系统会自动调整为512M 如果执行并行备份,但是没有指定拆分快大小,则会使用默认的拆分快大小进行拆分 当数据文件的大小小于拆分块的大小的时候,不执行拆分 如果数据文件的大小大于拆分快大小的时候,执行拆分 并行数不能大于拆分之后的总块数。 |
其他需要注意的:
只有在数据库处于归档模式的时候,才允许进行数据库的联机备份
如果备份库是DSC库,并且没有指定WITHOUT LOG,那么也需要配置REMOTE归档
当数据库位于MOUNT阶段,不允许执行数据库的备份
以DDL_CLONE的方式备份的备份集是不能够作为增量备份的基备份的,只能作为库级还原
在执行联机备份的过程中,如果报错归档不完整,则需要先执行生成检查点操作,才可以正常备份。
备份:生成备份语句的脚本
常见的备份选项包括以下:
- 设置联机数据库备份集路径
- 设置备份名
- 增量备份指定基备份目录
- 指定备份介质类型
- 添加备份描述
- 限制备份片大小
- 加密备份
- 备份压缩
BACKUP DATABASE语句的完整语法很长,为了方便的定义常用的选项,我写了一个Python脚本,可以自动的生成达梦的BACKUP DATABASE语句。
代码可以去我的Gitee上面查看:
https://gitee.com/leviathan-litan/Python-Database-Backup_and_Recovery-dameng
其中,用于描述备份行为的文件为:*.yml文件
如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
dameng: backup: # ====================== # 基础 / 通用 base: # --------------- # 备份名称 backup_name: 'db_backup_20210719' # --------------- # 备份说明 / 描述 backup_info: '完全备份' # 备份类型 # --- FULL # --- FULL DDL_CLONE # --- INCREMENT backup_type: 'FULL' # --------------- # 加密备份 - 口令 # --- 密码强度有要求 security_password: 'udX#!efIOF' # --------------- # 备份压缩 # 取值:0 - 9 compress: '5' # --------------- # 并行备份 parallel: '8' # --------------- # 介质类型 # --- DISK 磁盘 # --- TAPE 磁带 media_type: 'DISK' # --------------- # 只对介质类型为TAPE的时候才有效 media_type_param: '' # --------------- # 备份集路径 backupset_path: '/data/dameng/backup/{{ dameng.backup.base.backup_name }}' # --------------- # 备份片大小 - 上限 # 单位:MB backup_piece_size: '300' # 拆分快大小 backup_read_size: '512' # ====================== # 完全备份 # ====================== # 增量备份 increment: # --------------- # 增量备份的时候,需要指定基备份的目录 # --- BASE ON main_backupset_path: "" # 基目录 - 搜索目录 # --- WITH BACKUPDIR main_backupset_search_path: "" |
来看看这个Python脚本的运行效果:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
C:\Users\adamhuan\.virtualenvs\pythonDameng-bZdxVb86\Scripts\python.exe G:/PyCharm_data/pythonDameng/pyDamengDBBackup.py YAML / 变量 =============================== 备份名 : db_backup_20210719 备份类型 : FULL 备份说明 : 完全备份 加密备份 - 口令 : udX#!efIOF 备份压缩 : 5 并行备份 : 8 介质类型 : DISK 介质参数 : 备份集路径 : /data/dameng/backup/db_backup_20210719 备份片大小 : 300 拆分块大小 : 512 增量备份 - 基备份目录 : 增量备份 - 基备份搜索目录 : =============================== 备份命令 - 最终 ------------------ BACKUP DATABASE FULL TO db_backup_20210719 BACKUPSET '/data/dameng/backup/db_backup_20210719' DEVICE TYPE DISK BACKUPINFO '完全备份' MAXPIECESIZE 300 IDENTIFIED BY "udX#!efIOF" COMPRESSED LEVEL 5 PARALLEL 8 READ SIZE 512; 进程已结束,退出代码为 0 |
然后,再在Python代码中添加os.popen,就可以做成定时执行数据库备份的脚本了。