在开始备份前,我们需要确保有足够的磁盘空间和内存,否则备份可能失败。
检查磁盘空间:
df -h /
输出示例:
Filesystem Size Used Avail Use% Mounted on
/dev/vda3 47G 41G 3.7G 92% /
此时根分区使用率 92%,可用 3.7G。创建数据库实例需要一定空间,我们决定清理部分文件。
清理临时文件和缓存:
sudo rm -rf /tmp/* sudo yum clean all
清理后再次检查:
df -h /
可用空间增加到 5.2G,满足要求。
检查内存(可选):
free -h
内存充足(13G total,可用 8G+),无需调整。
为了避免影响现有业务,我们新建一个独立实例,端口 5239。
su - dmdba
mkdir -p /home/dmdba/dmdata/test
cd /home/dmdba/dmdata/test
dminit path=/home/dmdba/dmdata/test db_name=TESTDB instance_name=TESTDB port_num=5239 SYSDBA_PWD=Dameng123 SYSAUDITOR_PWD=Audit123
初始化输出(节选):
create dm database success. 2026-07-28 11:18:18
启动实例:
nohup /home/dmdba/dmdbms/bin/dmserver /home/dmdba/dmdata/test/TESTDB/dm.ini > /home/dmdba/dmdata/test/dm.log 2>&1 &
检查端口监听:
ss -tlnp | grep 5239
输出:
LISTEN 0 128 [::]:5239 [::]:* users:(("dmserver",pid=8845,fd=3))
连接实例,创建 TEST 模式和 EMPLOYEE 表,插入三条记录。
disql SYSDBA/Dameng123@localhost:5239
SQL 语句:
CREATE SCHEMA TEST;
CREATE TABLE TEST.EMPLOYEE (ID INT PRIMARY KEY, NAME VARCHAR(50), AGE INT, DEPT VARCHAR(50));
INSERT INTO TEST.EMPLOYEE VALUES (1, '张三', 30, '研发部');
INSERT INTO TEST.EMPLOYEE VALUES (2, '李四', 25, '市场部');
INSERT INTO TEST.EMPLOYEE VALUES (3, '王五', 35, '财务部');
COMMIT;
SELECT * FROM TEST.EMPLOYEE;
输出:
ID NAME AGE DEPT
----------- ------ ----------- ---------
1 张三 30 研发部
2 李四 25 市场部
3 王五 35 财务部
物理备份需在数据库关闭状态下进行。
disql SYSDBA/Dameng123@localhost:5239 -e "SHUTDOWN IMMEDIATE;"
确认实例已停止:
ps -ef | grep dmserver | grep -v grep
无输出表示已关闭。
使用 dmrman 工具:
dmrman
在 RMAN> 提示符下执行:
RMAN> backup database '/home/dmdba/dmdata/test/TESTDB/dm.ini' full backupset '/tmp/backup/full_bak';
遇到的第一个问题:备份目录创建失败,报错:
SBT[-136]:[错误码:-136]备份集目录[/home/dmdba/backup/full_bak]创建失败
原因:/home/dmdba/backup 目录权限不足或空间不够。
解决:改用 /tmp 目录,并确保权限:
mkdir -p /tmp/backup chown dmdba:dinstall /tmp/backup
重新执行备份,成功:
[Percent:100.00%][Speed:0.00M/s][Cost:00:00:04][Remaining:00:00:00]
backup successfully!
增量备份基于全量备份,记录全量之后的数据变化。
nohup dmserver /home/dmdba/dmdata/test/TESTDB/dm.ini > /home/dmdba/dmdata/test/dm.log 2>&1 &
连接并插入第4条记录:
disql SYSDBA/Dameng123@localhost:5239 -e "INSERT INTO TEST.EMPLOYEE VALUES (4, '赵六', 28, '人事部'); COMMIT;"
disql SYSDBA/Dameng123@localhost:5239 -e "SHUTDOWN IMMEDIATE;"
dmrman
RMAN> backup database '/home/dmdba/dmdata/test/TESTDB/dm.ini' increment backupset '/tmp/backup/inc_bak';
输出:
[Percent:100.00%][Speed:0.00M/s][Cost:00:00:04][Remaining:00:00:00]
backup successfully!
为了演示还原过程,我们模拟磁盘损坏或误删除,删除 MAIN.DBF 文件(该文件存储用户数据)。
rm -f /home/dmdba/dmdata/test/TESTDB/MAIN.DBF
为什么要删除 MAIN.DBF?
MAIN.DBF 是达梦数据库的主数据文件,存储所有用户表数据。删除它会导致数据库无法访问,相当于“故障”场景。删除后,数据库无法正常启动。
删除后的后果:启动实例会报错,提示找不到数据文件。
dmrman
RMAN> restore database '/home/dmdba/dmdata/test/TESTDB/dm.ini' from backupset '/tmp/backup/full_bak';
输出:
restore successfully.
RMAN> recover database '/home/dmdba/dmdata/test/TESTDB/dm.ini' from backupset '/tmp/backup/full_bak';
注意:此步骤报错 备份过程中未产生日志,但 recover successfully! 仍出现,说明恢复成功。
RMAN> restore database '/home/dmdba/dmdata/test/TESTDB/dm.ini' from backupset '/tmp/backup/inc_bak';
成功。
RMAN> recover database '/home/dmdba/dmdata/test/TESTDB/dm.ini' from backupset '/tmp/backup/inc_bak';
成功。
nohup dmserver /home/dmdba/dmdata/test/TESTDB/dm.ini > /home/dmdba/dmdata/test/dm.log 2>&1 &
检查启动日志,看到 SYSTEM IS READY 表示成功。
disql SYSDBA/Dameng123@localhost:5239 -e "SELECT * FROM TEST.EMPLOYEE;"
输出:
ID NAME AGE DEPT
----------- ------ ----------- ---------
1 张三 30 研发部
2 李四 25 市场部
3 王五 35 财务部
4 赵六 28 人事部
数据完整,第四条记录(赵六)已恢复,证明增量备份生效。
No space left on device/tmp、/var/tmp、yum 缓存,或更换备份路径。SBT[-136]:备份集目录创建失败chown dmdba:dinstall 并确保父目录可写。nohup dmserver ... 返回 127,端口未监听。DM_HOME 和 LD_LIBRARY_PATH 未设置,或 dmserver 找不到依赖库。export DM_HOME=/home/dmdba/dmdbms
export PATH=$DM_HOME/bin:$PATH
export LD_LIBRARY_PATH=$DM_HOME/bin:$LD_LIBRARY_PATH
ps -ef | grep dmserver | grep 5239 无输出ss -tlnp | grep 5239 显示端口在监听。ps -ef 按进程命令行过滤,而 5239 是端口号,通常不出现在进程命令行中(dmserver 命令不显式指定端口)。正确检查进程应使用:而ps -ef | grep dmserver | grep -v grep
ss 直接查看端口监听,能准确反映实例是否在运行。通过本次实践,我们完成了:
关键点:
dmrman 要求脱机)。recover)应用归档日志,使数据库达到最新状态。dm.log)和环境变量是有效手段。文章
阅读量
获赞
