达梦DM8之使用dmmdf恢复误删除的undo/redo文件

误删除 undo/redo 日志怎么办?
分以下两种情况:
1.如果有备份文件
如果有备份文件,可以重新初始化一个新的数据库(初始化参数要和原库一样,比如页大小、大小写敏感、字符集等,这些可以在 DM 数据库安装路径,../data/DAMENG 目录下以 dminit+日期时间.log 命名的文件中查询),然后将备份文件和归档日志文件拷贝到新的环境,然后再进行备份+归档的还原操作。

2.如果没有备份文件
如果没有备份,可以通过修改永久魔术值db_magic的方式来恢复,但是这种情况下有可能丢失数据。

[dmdba@:/dm8/dmdbms/bin]$ ./dmmdf help
格式: ./dmmdf KEYWORD=value
例程: ./dmmdf TYPE=1 FILE=/opt/data/DAMENG/SYSTEM.DBF
关键字              说明
--------------------------------------------------------------------------------
TYPE                类型
                    1表示dbf
                    2表示rlog
                    3表示original bak
                    4表示bakset meta
                    5表示bakset bkp
                    6表示bakset
                    7表示数据库降级:
                      SCOPE=1,表示仅支持0x0007000A降级到0x00070009,FILE指定为dm.ctl路径
                      SCOPE=2,表示仅支持0x0007000B降级到0x0007000A,FILE指定为dm.ini路径
                      SCOPE=3,表示仅支持单节点由0x0007000C降级到0x0007000B,FILE指定为dm.ini路径
                    8表示联机日志降级(仅支持0x7006降级到0x7005)
                    9表示特定版本的数据库升级(仅支持执行码版本号在[V8.1.1.88(V7.1.7.88), V8.1.1.100(V7.1.7.100)]范围内的数据库升级)
FILE                文件路径
DCR_INI             dmdcr.ini路径
DFS_INI             dmdfs.ini路径
SCOPE               TYPE=7时使用,指定具体的降级范围
HELP                打印帮助信息
--------------------------------------------------
示例:    ./dmmdf TYPE=1 FILE=/opt/data/DAMENG/SYSTEM.dbf
         ./dmmdf TYPE=2 FILE=/opt/data/DAMENG/DAMENG01.log
         ./dmmdf TYPE=3 FILE=/opt/data/DAMENG/bak/dmdb.bak
         ./dmmdf TYPE=4 FILE=/opt/data/DAMENG/bak/bset/nbak.meta
         ./dmmdf TYPE=5 FILE=/opt/data/DAMENG/bak/bset/nbak.bak
         ./dmmdf TYPE=6 FILE=/opt/data/DAMENG/bak/bset
         ./dmmdf TYPE=7 SCOPE=1 FILE=/opt/data/DAMENG/dm.ctl
         ./dmmdf TYPE=7 SCOPE=2 FILE=/opt/data/DAMENG/dm.ini
         ./dmmdf TYPE=7 SCOPE=3 FILE=/opt/data/DAMENG/dm.ini
         ./dmmdf TYPE=8 FILE=/opt/data/DAMENG/dm.ini
         ./dmmdf TYPE=9 FILE=/opt/data/DAMENG/dm.ini
[dmdba@:/dm8/dmdbms/bin]$ 

3. 测试删除 redo 文件,使用dmmdf恢复
1)测试删除DMTEST02.log联机日志文件
--启动数据库实例
[dmdba@dmdb01 bin]$ ./dmserver /dm8/dmdbms/data/DMTEST/dm.ini 
file dm.key not found, use default license!
version info: develop
DM Database Server x64 V8 1-2-94-21.11.11-150650-10038-ENT  startup...
Normal of FAST
Normal of DEFAULT
Normal of RECYCLE
Normal of KEEP
Normal of ROLL
Database mode = 0, oguid = 0
License will expire on 2022-11-11
file lsn: 0
ndct db load finished
ndct second level fill fast pool finished
ndct third level fill fast pool finished
ndct fill fast pool finished
......
nsvr_process_before_open begin.
nsvr_process_before_open success.
total 0 active crash trx, pseg_crash_trx_rollback sys_only(0) begin ...
pseg_crash_trx_rollback end, total 0 active crash trx, include 0 empty_trxs, 0 empty_pages which only need to delete mgr recs.
pseg_crash_trx_rollback end
SYSTEM IS READY.
checkpoint requested, rlog free space[528128512], used space[8734208]
checkpoint generate by ckpt_interval
checkpoint begin, used_space[8734208], free_space[528128512]...
checkpoint end, 0 pages flushed, used_space[0], free_space[536862720].

-- 删除DMTEST02.log
[dmdba@dmdb01 DMTEST]$ ls -l *.log
-rw-r--r-- 1 dmdba dinstall       973 Jun 20 15:57 dminit20220620155743.log
-rw-r--r-- 1 dmdba dinstall 268435456 Jun 20 16:01 DMTEST01.log
-rw-r--r-- 1 dmdba dinstall 268435456 Jun 20 15:58 DMTEST02.log
-rw-r--r-- 1 dmdba dinstall        12 Jun 20 15:58 rep_conflict.log
[dmdba@dmdb01 DMTEST]$ rm -f DMTEST02.log
[dmdba@dmdb01 DMTEST]$ 

-- 关闭数据库实例
exit
Server is stopping...
listener closed  and all sessions disconnected
adjust undo_retention & wakeup purge thread...full check point starting...
generate force checkpoint, rlog free space[536862720], used space[0]
checkpoint begin, used_space[0], free_space[536862720]...
checkpoint end, 0 pages flushed, used_space[0], free_space[536862720].
full check point end.
......
shutdown dtype subsystem...OK
shutdown huge buffer and memory pools...OK
close lsnr socket
DM Database Server shutdown successfully.
[dmdba@dmdb01 bin]$ 

--启动数据库实例报错:
[dmdba@dmdb01 bin]$ ./dmserver /dm8/dmdbms/data/DMTEST/dm.ini 
file dm.key not found, use default license!
version info: develop
DM Database Server x64 V8 1-2-94-21.11.11-150650-10038-ENT  startup...
Normal of FAST
Normal of DEFAULT
Normal of RECYCLE
Normal of KEEP
Normal of ROLL
Database mode = 0, oguid = 0
/dm8/dmdbms/data/DMTEST/DMTEST02.log not exist, can not startup
[dmdba@dmdb01 bin]$ 

2)重新初始化一个新的数据库,(初始化参数要和原库一样,比如页大小、大小写敏感、字符集等,这些可以在 DM 数据库安装路径,../data/DAMENG 目录下以 dminit+日期时间.log 命名的文件中查询)。
/dm8/dmdbms/bin/dminit PATH=/dm8/dmdbms/data PORT_NUM=5238 PAGE_SIZE=32 EXTENT_SIZE=32 LOG_SIZE=256 CHARSET=0 DB_NAME=DMTEST

3)将步骤 (2) 中重新初始化的数据库中 DMTEST02.log 文件拷贝到当前丢失 REDO 日志的库目录下。
[dmdba@dmdb03:/dm8/dmdbms/data/DMTEST]$ scp DMTEST02.log dmdba@192.168.186.128:/dm8/dmdbms/data/DMTEST/
dmdba@192.168.186.128's password: 
DMTEST02.log                                                                100%  256MB 100.7MB/s   00:02    
[dmdba@dmdb03:/dm8/dmdbms/data/DMTEST]$ 

4)使用 dmmdf 工具获取源库中 SYSTEM.DBF 的 db_magic,并记录下来。(此时可以使用root用户,也可以使用dmdba用户)
[dmdba@dmdb01 bin]$ ./dmmdf TYPE=1 FILE=/dm8/dmdbms/data/DMTEST/SYSTEM.DBF
dmmdf V8
**********************************************************
1 db_magic=943643448
2 next_trxid=3007
3 pemnt_magic=1706932456
**********************************************************
Please input which parameter you want to change(1-3), q to quit: q
[dmdba@dmdb01 bin]$ 

5)使用 dmmdf 工具设置 DMTEST02.log 文件的 db_magic 和 pemnt_magic 值,设置为步骤 (4) 中记录的值。

[dmdba@dmdb01 bin]$ ./dmmdf TYPE=2 FILE=/dm8/dmdbms/data/DMTEST/DMTEST02.log
dmmdf V8
**********************************************************
1 sig = DMRLOG
2 ver = 7006
3 chksum = 1782075654
4 sta = 0
5 n_magic = 7
6 db_magic = 1136631966
7 len = 268435456
8 free = 4096
9 clsn = 0
10 clsn_fil = 0
11 clsn_off = 0
12 pemnt_magic = 1227258588
13 fil_id = 1
15 next_seq = 0
16 g_next_seq = 0
17 arch_lsn = 0
18 arch_seq = 0
19 dbversion = 0x7000c
20 min_exec_version = V8.1.1.1
21 min_dct_version  = 4
22 p_db_magic = 0
23 n_apply_ep = 0
24 apply_info_lsn = 0
   pkg_seq_arr: (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
   apply_lsn_arr: (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
25 recv_p_db_magic = 0
26 recv_n_apply_ep = 0
   recv_pkg_seq_arr: (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
   recv_apply_lsn_arr: (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
**********************************************************
You can only reset sta(4) or db_magic (6) or clsn (9) or clsn_fil(10) or clsn_off(11) or pemnt_magic(12) or fil_id(13) or next_seq(15) or g_next_seq(16) or p_db_magic(20) or n_apply_ep(21).
Please input the num which one you want to change, q to quit: 6
Input the new value: 943643448
**********************************************************
1 sig = DMRLOG
2 ver = 7006
3 chksum = 297347744
4 sta = 0
5 n_magic = 7
6 db_magic = 943643448
7 len = 268435456
8 free = 4096
9 clsn = 0
10 clsn_fil = 0
11 clsn_off = 0
12 pemnt_magic = 1227258588
13 fil_id = 1
15 next_seq = 0
16 g_next_seq = 0
17 arch_lsn = 0
18 arch_seq = 0
19 dbversion = 0x7000c
20 min_exec_version = V8.1.1.1
21 min_dct_version  = 4
22 p_db_magic = 0
23 n_apply_ep = 0
24 apply_info_lsn = 0
   pkg_seq_arr: (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
   apply_lsn_arr: (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
25 recv_p_db_magic = 0
26 recv_n_apply_ep = 0
   recv_pkg_seq_arr: (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
   recv_apply_lsn_arr: (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
**********************************************************
Do you want to quit and save the change to file (y/n): y     
Save to file success!
[dmdba@dmdb01 bin]$ ./dmmdf TYPE=2 FILE=/dm8/dmdbms/data/DMTEST/DMTEST02.log
dmmdf V8
**********************************************************
1 sig = DMRLOG
2 ver = 7006
3 chksum = 297347744
4 sta = 0
5 n_magic = 7
6 db_magic = 943643448
7 len = 268435456
8 free = 4096
9 clsn = 0
10 clsn_fil = 0
11 clsn_off = 0
12 pemnt_magic = 1227258588
13 fil_id = 1
15 next_seq = 0
16 g_next_seq = 0
17 arch_lsn = 0
18 arch_seq = 0
19 dbversion = 0x7000c
20 min_exec_version = V8.1.1.1
21 min_dct_version  = 4
22 p_db_magic = 0
23 n_apply_ep = 0
24 apply_info_lsn = 0
   pkg_seq_arr: (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
   apply_lsn_arr: (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
25 recv_p_db_magic = 0
26 recv_n_apply_ep = 0
   recv_pkg_seq_arr: (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
   recv_apply_lsn_arr: (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
**********************************************************
You can only reset sta(4) or db_magic (6) or clsn (9) or clsn_fil(10) or clsn_off(11) or pemnt_magic(12) or fil_id(13) or next_seq(15) or g_next_seq(16) or p_db_magic(20) or n_apply_ep(21).
Please input the num which one you want to change, q to quit: 12
Input the new value: 1706932456
**********************************************************
1 sig = DMRLOG
2 ver = 7006
3 chksum = 1025697940
4 sta = 0
5 n_magic = 7
6 db_magic = 943643448
7 len = 268435456
8 free = 4096
9 clsn = 0
10 clsn_fil = 0
11 clsn_off = 0
12 pemnt_magic = 1706932456
13 fil_id = 1
15 next_seq = 0
16 g_next_seq = 0
17 arch_lsn = 0
18 arch_seq = 0
19 dbversion = 0x7000c
20 min_exec_version = V8.1.1.1
21 min_dct_version  = 4
22 p_db_magic = 0
23 n_apply_ep = 0
24 apply_info_lsn = 0
   pkg_seq_arr: (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
   apply_lsn_arr: (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
25 recv_p_db_magic = 0
26 recv_n_apply_ep = 0
   recv_pkg_seq_arr: (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
   recv_apply_lsn_arr: (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
**********************************************************
Do you want to quit and save the change to file (y/n): y
Save to file success!
[dmdba@dmdb01 bin]$ 

6)使用 dmmdf 工具设置 DMTEST02.log 文件的 db_magic 和 pemnt_magic 值后,数据库启动成功

[dmdba@dmdb01 bin]$ ./dmserver /dm8/dmdbms/data/DMTEST/dm.ini 
file dm.key not found, use default license!
version info: develop
DM Database Server x64 V8 1-2-94-21.11.11-150650-10038-ENT  startup...
Normal of FAST
Normal of DEFAULT
Normal of RECYCLE
Normal of KEEP
Normal of ROLL
Database mode = 0, oguid = 0
License will expire on 2022-11-11
file lsn: 33072
......
aud sys init success.
aud rt sys init success.
systables desc init success.
ndct_db_load_info success.
nsvr_process_before_open begin.
nsvr_process_before_open success.
total 0 active crash trx, pseg_crash_trx_rollback sys_only(0) begin ...
pseg_crash_trx_rollback end, total 0 active crash trx, include 0 empty_trxs, 0 empty_pages which only need to delete mgr recs.
pseg_crash_trx_rollback end
SYSTEM IS READY.

4. 测试删除 undo 文件,使用dmmdf恢复
1)测试删除 ROLL.DBF 文件
-- 启动数据库实例
[dmdba@dmdb01 bin]$ ./dmserver /dm8/dmdbms/data/DMTEST/dm.ini 
file dm.key not found, use default license!
version info: develop
DM Database Server x64 V8 1-2-94-21.11.11-150650-10038-ENT  startup...
Normal of FAST
Normal of DEFAULT
Normal of RECYCLE
Normal of KEEP
Normal of ROLL
Database mode = 0, oguid = 0
License will expire on 2022-11-11
file lsn: 33072
......
aud sys init success.
aud rt sys init success.
systables desc init success.
ndct_db_load_info success.
nsvr_process_before_open begin.
nsvr_process_before_open success.
total 0 active crash trx, pseg_crash_trx_rollback sys_only(0) begin ...
pseg_crash_trx_rollback end, total 0 active crash trx, include 0 empty_trxs, 0 empty_pages which only need to delete mgr recs.
pseg_crash_trx_rollback end
SYSTEM IS READY.

-- 删除 ROLL.DBF 文件
[dmdba@dmdb01 DMTEST]$ ls -l ROLL.DBF 
-rw-r--r-- 1 dmdba dinstall 161480704 Jun 20 16:29 ROLL.DBF
[dmdba@dmdb01 DMTEST]$ rm -f ROLL.DBF 
[dmdba@dmdb01 DMTEST]$ ls -l ROLL.DBF 
ls: cannot access ROLL.DBF: No such file or directory

-- 关闭数据库
exit
Server is stopping...
listener closed  and all sessions disconnected
adjust undo_retention & wakeup purge thread...full check point starting...
generate force checkpoint, rlog free space[536572928], used space[289792]
checkpoint begin, used_space[289792], free_space[536572928]...
checkpoint end, 0 pages flushed, used_space[289792], free_space[536572928].
full check point end.
......
shutdown dtype subsystem...OK
shutdown huge buffer and memory pools...OK
close lsnr socket
DM Database Server shutdown successfully.
[dmdba@dmdb01 bin]$ 

-- 启动数据库报错
[dmdba@dmdb01 bin]$ ./dmserver /dm8/dmdbms/data/DMTEST/dm.ini 
file dm.key not found, use default license!
version info: develop
DM Database Server x64 V8 1-2-94-21.11.11-150650-10038-ENT  startup...
Normal of FAST
Normal of DEFAULT
Normal of RECYCLE
Normal of KEEP
Normal of ROLL
Database mode = 0, oguid = 0
/dm8/dmdbms/data/DMTEST/ROLL.DBF not exist, can not startup
[dmdba@dmdb01 bin]$ 

2)重新初始化一个新的数据库,(初始化参数要和原库一样,比如页大小、大小写敏感、字符集等,这些可以在 DM 数据库安装路径,../data/DAMENG 目录下以 dminit+日期时间.log 命名的文件中查询)。
/dm8/dmdbms/bin/dminit PATH=/dm8/dmdbms/data PORT_NUM=5238 PAGE_SIZE=32 EXTENT_SIZE=32 LOG_SIZE=256 CHARSET=0 DB_NAME=DMTEST

3)将步骤 (2) 中重新初始化的数据库中 ROLL.DBF 文件拷贝到当前丢失 UNDO 文件的库目录下。
[dmdba@dmdb03:/dm8/dmdbms/bin]$ cd /dm8/dmdbms/data/DMTEST/
[dmdba@dmdb03:/dm8/dmdbms/data/DMTEST]$ ls -l *.DBF
-rw-r--r-- 1 dmdba dinstall 134217728 Jun 20 15:57 MAIN.DBF
-rw-r--r-- 1 dmdba dinstall 161480704 Jun 20 15:58 ROLL.DBF
-rw-r--r-- 1 dmdba dinstall 180355072 Jun 20 15:58 SYSTEM.DBF
-rw-r--r-- 1 dmdba dinstall  77594624 Jun 20 15:58 TEMP.DBF
[dmdba@dmdb03:/dm8/dmdbms/data/DMTEST]$ scp ROLL.DBF dmdba@192.168.186.128:/dm8/dmdbms/data/DMTEST/
dmdba@192.168.186.128's password: 
ROLL.DBF                                                                     100%  154MB 122.3MB/s   00:01    
[dmdba@dmdb03:/dm8/dmdbms/data/DMTEST]$ 

4)使用 dmmdf 工具获取源库中 SYSTEM.DBF 的 db_magic,并记录下来。(此时可以使用root用户,也可以使用dmdba用户)
[dmdba@dmdb01 bin]$ ./dmmdf TYPE=1 FILE=/dm8/dmdbms/data/DMTEST/SYSTEM.DBF
dmmdf V8
**********************************************************
1 db_magic=943643448
2 next_trxid=4009
3 pemnt_magic=1706932456
**********************************************************
Please input which parameter you want to change(1-3), q to quit: q

5)使用 dmmdf 工具设置 ROLL.DBF 文件的 db_magic 和 pemnt_magic 值,设置为步骤 (4) 中记录的值。

[dmdba@dmdb01 bin]$ ./dmmdf TYPE=1 FILE=/dm8/dmdbms/data/DMTEST/ROLL.DBF
dmmdf V8
group_id, file_id, page_no error, file /dm8/dmdbms/data/DMTEST/ROLL.DBF is not system dbf.
[dmdba@dmdb01 bin]$
说明:看来dmmdf命令只能修改dbf文件中的SYSTEM.DBF

6)测试启动数据库实例成功,看来undo表空间可以通过直接"异库拷贝"的方式就能恢复
[dmdba@dmdb01 bin]$ ./dmserver /dm8/dmdbms/data/DMTEST/dm.ini 
file dm.key not found, use default license!
version info: develop
DM Database Server x64 V8 1-2-94-21.11.11-150650-10038-ENT  startup...
Normal of FAST
Normal of DEFAULT
Normal of RECYCLE
Normal of KEEP
Normal of ROLL
Database mode = 0, oguid = 0
License will expire on 2022-11-11
file lsn: 35647
......
aud sys init success.
aud rt sys init success.
systables desc init success.
ndct_db_load_info success.
nsvr_process_before_open begin.
nsvr_process_before_open success.
total 0 active crash trx, pseg_crash_trx_rollback sys_only(0) begin ...
pseg_crash_trx_rollback end, total 0 active crash trx, include 0 empty_trxs, 0 empty_pages which only need to delete mgr recs.
pseg_crash_trx_rollback end
SYSTEM IS READY.

达梦在线服务平台:https://eco.dameng.com

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Eclipse 中,可以使用 `org.eclipse.ui.actions.ActionFactory.UNDO` 和 `org.eclipse.ui.actions.ActionFactory.REDO` 来创建 UndoRedo 动作。然后,将这些动作关联到菜单栏 Edit 中的 UndoRedo 菜单项。 要在 `ViewPart` 中实现 Undo/Redo,您需要遵循以下步骤: 1. 在 `ViewPart` 类中添加以下字段: ```java private IUndoContext undoContext; private IUndoableOperation undoOperation; private IAction undoAction; private IAction redoAction; ``` 2. 在 `createPartControl` 方法中初始化这些字段: ```java public void createPartControl(Composite parent) { // 创建 Undo/Redo 上下文 undoContext = new ObjectUndoContext(new Object()); // 创建 Undo/Redo 动作 undoAction = ActionFactory.UNDO.create(getSite().getWorkbenchWindow()); undoAction.setText("Undo"); undoAction.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages() .getImageDescriptor(ISharedImages.IMG_TOOL_UNDO)); undoAction.setEnabled(false); redoAction = ActionFactory.REDO.create(getSite().getWorkbenchWindow()); redoAction.setText("Redo"); redoAction.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages() .getImageDescriptor(ISharedImages.IMG_TOOL_REDO)); redoAction.setEnabled(false); // 将 Undo/Redo 动作添加到菜单栏 Edit 中 IMenuManager menuMgr = getViewSite().getActionBars().getMenuManager(); menuMgr.add(new Separator()); menuMgr.add(undoAction); menuMgr.add(redoAction); } ``` 3. 在 `createPartControl` 方法中为 Undo/Redo 动作添加处理程序: ```java public void createPartControl(Composite parent) { // ... // 为 Undo/Redo 动作添加处理程序 undoAction.setHandler(new UndoActionHandler(getViewSite(), undoContext)); redoAction.setHandler(new RedoActionHandler(getViewSite(), undoContext)); } ``` 4. 在 `createPartControl` 方法中为 `parent` 控件创建上下文菜单,并将 Undo/Redo 动作添加到上下文菜单中: ```java public void createPartControl(Composite parent) { // ... // 为 parent 控件创建上下文菜单,并将 Undo/Redo 动作添加到上下文菜单中 MenuManager menuMgr = new MenuManager(); menuMgr.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS)); getSite().registerContextMenu(menuMgr, getSite().getSelectionProvider()); parent.setMenu(menuMgr.createContextMenu(parent)); menuMgr.addMenuListener(new IMenuListener() { public void menuAboutToShow(IMenuManager manager) { manager.add(new Separator()); manager.add(undoAction); manager.add(redoAction); } }); } ``` 5. 在 `ViewPart` 类中添加以下方法: ```java public void executeCommand(final IUndoableOperation operation) { // 如果操作不可撤销,则返回 if (!operation.canUndo()) { return; } // 如果当前有未完成的撤消操作,则合并操作 if (undoOperation != null) { undoOperation.addContext(operation.getContext()); undoOperation.add(operation); } else { // 否则,开始新的撤消操作 undoOperation = operation; } // 注册撤消操作 IOperationHistory operationHistory = OperationHistoryFactory.getOperationHistory(); operationHistory.add(undoOperation); // 更新 Undo/Redo 动作的状态 undoAction.setEnabled(undoOperation.canUndo()); redoAction.setEnabled(undoOperation.canRedo()); // 将操作添加到 Undo/Redo 上下文中 undoContext.addMatch(undoOperation); } public void undo() { // 撤消上一个操作 IOperationHistory operationHistory = OperationHistoryFactory.getOperationHistory(); operationHistory.undo(undoContext, null, null); } public void redo() { // 重做上一个操作 IOperationHistory operationHistory = OperationHistoryFactory.getOperationHistory(); operationHistory.redo(undoContext, null, null); } ``` 6. 在 `ViewPart` 类中添加以下代码,以便在视图关闭时清除 Undo/Redo 上下文中的操作: ```java public void dispose() { // 清除 Undo/Redo 上下文中的操作 IOperationHistory operationHistory = OperationHistoryFactory.getOperationHistory(); operationHistory.dispose(undoContext, true, true, true); super.dispose(); } ``` 现在,您可以在 `executeCommand` 方法中执行所有需要撤消/恢复支持的操作,并且在菜单栏 Edit 中的 Undo/Redo 菜单项中使用 Undo/Redo 动作来撤消/恢复操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值