DM8误删除操作恢复方案

news2024/12/27 13:31:57

达梦数据库三种在误删除操作后的回退方案

一、闪回表

    当用户操作不慎导致错误的删改数据时,闪回方式可以恢复数据。闪回技术,就是为了用户可以迅速处理这种 数据逻辑损坏的情况而产生的。 闪回技术主要是通过回滚段存储的 UNDO 记录来完成历史记录的还原。
    设置 ENABLE_FLASHBACK 为 1 后,开启闪回功能。DM 会保留回滚段一段时间,回滚段保留的时间代表着可以闪回的时间长度。 由 UNDO_RETENTION 参数指定。 开启闪回功能后,DM 会在内存中记录下每个事务的起始时间和提交时间。即通过用户指定的时刻,查询到该时刻的事务号,结合当前记录和回滚段中的 UNDO 记录,就可以还原出特定事务号的记录。即指定时刻的记录状态。从而完成闪回查询。
   DM8 闪回查询功能完全依赖于回滚段管理,对于闪回查询的支持较好,与oracle的使用方法类似。但MPP架构对于闪回查询功能不支持,同时由于达梦没有回收站功能,无法对drop的表进行闪回,对于 DROP 等误操作不能恢复,无法像Oracle进行flashback table XXX to before drop。在生产环境中,当表被DROP 删除或者数据库没有开启闪回功能时,则无法使用闪回来获取原有的表数据;此时需要使用基于归档日志的时间点的恢复(不完全恢复)来达到恢复数据或恢复表的目的。
        闪回特性可应用在以下方面:

(1) 自我维护过程中的修复:当一些重要的记录被意外删除,用户 可以向后移动到一个 时间点,查看丢失的行并把它们重新插入现在的表内恢复;
(2)用于分析数据变化:可以对同一张表的不同闪回时刻进行链接 查询,以此查看变化的数据。

1.1. 闪回表定义

--语法格式
FLASHBACK TABLE	[<模式名>.]<表名> {,[<模式名>.]<表名>} TO <SCN | LSN | TIMESTAMP> <expr> [ <ENABLE|DISABLE> TRIGGERS ] ;

--参数说明:
< 模式名 > 指明该表属于哪个模式,缺省为当前模式;
< 表名 > 指明被创建的基表名,基表名最大长度 128 字节;
<expr> 指明闪回到的 LSN 值或 TIMESTAMP 值;
<ENABLE|DISABLE> TRIGGERS 指定是否开启触发器,ENABLE 为开启触发器,DISABLE 为关闭触发器,不指定则默认为关闭。

image.png

1.2.使用说明

  1. 使用闪回功能需要打开 dm.ini 中的 ENABLE_FLASHBACK 参数;
  2. 当前闪回表功能支持:批量闪回多个表、触发器的禁用与启用、DMDPC 环境(除使用 LOCAL 登录外)、DMDSC 环境;
  3. 当前闪回表功能不支持在 DM MPP 环境下使用;
  4. 闪回表利用的是 UNDO 表空间里记录的数据被改变前的值,只能闪回到 UNDO_RETENTION 指定值范围内的时间点;
  5. 用户必须具有 FLASHBACK ANY TABLE 系统权限或 FLASHBACK 对象权限
  6. 闪回表语句是作为单个事务处理来执行。同时闪回多个表时,必须成功闪回所有表,否则会回退整个事务。闪回作为 DDL 语句,开启自动提交时,闪回成功后会自动提交;
  7. 必须对要执行闪回操作的表启动行移动(分区表具有 MOVEMENT 功能的不能关闭,否则闪回可能会报错);
  8. 不会闪回受影响对象的统计信息;
  9. 闪回会保留所有现有的索引;
  10. 闪回中会正常检查约束条件,如果在闪回执行期间违反了任何约束条件,则会回滚闪回操作;
  11. 闪回不能跨越修改了表结构的 DDL。比如,在闪回数据之前,做过删除一个字段的操作,那么是无法闪回的;
  12. 不能对系统表、临时表、HUGE 表、内部辅助表、动态表等执行闪回表操作;
  13. DMDPC 环境下由于各节点的 SCN/LSN 不同,只支持闪回到时间点 TIMESTAMP;
  14. 限制重复闪回。闪回作为 DDL,对于同一个表,不允许再次闪回到上一次闪回之前的 LSN/TIMESTAMP。

注意:不开启闪回不能用flashback database,只能用flashback table和闪回查询,但是作用比较有限。启用闪回必须开启归档

1.3.闪回前环境准备

1.3.1.开启闪回功能

默认是闪回功能为关闭状态,更改参数后重启生效,必须重启不然报错:[-9801]:flashback version has been out of date。

--开启闪回功能
select name,type,value from v$parameter where name='ENABLE_FLASHBACK';
或
select para_value from v$dm_ini where para_name='ENABLE_FLASHBACK';  # 0未开启 1开启 

alter system set 'ENABLE_FLASHBACK'=1 both; 
或
sf_set_system_para_value('ENABLE_FLASHBACK',1,0,1);
或
或者修改参数文件dm.ini中ENABLE_FLASHBACK值为1

--修改UNDO_RETENTION
SQL> select name,type,value from v$parameter where name = 'UNDO_RETENTION';

LINEID     NAME           TYPE VALUE    
---------- -------------- ---- ---------
1          UNDO_RETENTION SYS  90.000000  
SQL> alter system set 'UNDO_RETENTION'=3600 both;

SQL> select name,type,value from v$parameter where name = 'UNDO_RETENTION';

LINEID     NAME           TYPE VALUE      
---------- -------------- ---- -----------
1          UNDO_RETENTION SYS  3600.000000

--重启永久生效
[dmdba@localhost ~]$ /dmdb8/dmdbms/bin/DmServicefuwa stop
Stopping DmServicefuwa:                                    [ OK ]
[dmdba@localhost ~]$ /dmdb8/dmdbms/bin/DmServicefuwa start
Starting DmServicefuwa: 
                                                           [ OK ]

1.3.2.构建测试数据

--创建 PERSON_TYPE
create table PERSON_TYPE(PERSON_TYPEID int,NAME varchar2(100));

--PERSON_TYPE中插入数据
insert into PERSON_TYPE values (1,'采购经理');
insert into PERSON_TYPE values (2,'采购代表');
insert into PERSON_TYPE values (3,'销售经理');
insert into PERSON_TYPE values (4,'销售代表');
commit;

--查询PERSON_TYPE
select * from PERSON_TYPE;  --4条数据

1.4 闪回查询

1.4.1 闪回查询子句_支持insert或delete场景

闪回查询子句语法

闪回查询子句的语法,是在数据查询语句的基础上,为 FROM 子句增加了闪回查询子句。

--语法格式
<闪回查询子句>::=
  WHEN <TIMESTAMP time_exp> | 
  AS OF <TIMESTAMP time_exp> |
  AS OF <SCN|LSN lsn>

--参数说明
time_exp:一个日期表达式,一般用字符串方式表示
lsn:LSN 值

image.png

语句功能

用户通过闪回查询子句,可以得到指定表过去某时刻的结果集。指定条件可以为时刻或 LSN。

使用说明
  1. 闪回查询只支持普通表(包括加密表与压缩表)、水平分区表和堆表,不支持临时表、列存储表、外部表与视图;
  2. 闪回查询中 lsn 的值,可以通过查询动态视图V R L O G 或 V RLOG或V RLOGVVLSN_TIME 来确定,也可以通过闪回版本查询的伪列来确定;
  3. 由于视图 V$LSN_TIME 每三秒收集一次 LSN/TIME 映射关系,因此基于时间进行闪回查询时可能存在三秒的误差,如果需要进行精确度更高的闪回查询,建议基于 LSN 进行闪回查询。
SQL> SELECT CUR_LSN FROM V$RLOG;
SQL> select * from v$lsn_time;
  1. 当闪回表作为 DDL 时,对于同一个表,不允许基于对上一次闪回表的 LSN 或 TIMESTAMP 进行闪回查询。
示例
闪回查询子句_insert_指定TIMESTAMP
--查询当前时间
SQL> select sysdate from dual;

LINEID     sysdate            
---------- -------------------
1          2023-11-23 20:49:43

--插入数据
INSERT INTO PERSON_TYPE(PERSON_TYPEID,NAME) VALUES(5,'防损员');
INSERT INTO PERSON_TYPE(PERSON_TYPEID,NAME) VALUES(6,'保洁员');
COMMIT;

--查询
SELECT * FROM PERSON_TYPE;  --6条数据

--使用闪回查询取得2023-11-23 20:49:43时刻的数据
SELECT * FROM PERSON_TYPE WHEN TIMESTAMP '2023-11-23 20:49:43';  --4条数据
或
SELECT * FROM PERSON_TYPE AS OF TIMESTAMP '2023-11-23 20:49:43';  --4条数据
闪回查询子句_delete_指定TIMESTAMP
--查询当前时间
SQL> select sysdate from dual;

LINEID     sysdate            
---------- -------------------
1          2023-11-23 21:34:26

--删除
DELETE FROM PERSON_TYPE WHERE PERSON_TYPEID > 5; 
COMMIT;
SELECT * FROM PERSON_TYPE;  --5条数据

--使用闪回查询得到删除前的数据
SELECT * FROM PERSON_TYPE WHEN TIMESTAMP '2023-11-23 21:34:26';
或
SELECT * FROM PERSON_TYPE AS OF TIMESTAMP '2023-11-23 21:34:26';

闪回查询子句_delete_指定 LSN
--查询 PERSON_TYPE 表
SELECT * FROM PERSON_TYPE;   --5条数据

--查询 V$RLOG 视图的 CUR_LSN 字段来获取当前 LSN 值
SQL> SELECT CUR_LSN FROM V$RLOG;

LINEID     CUR_LSN             
---------- --------------------
1          42097

--删除 PERSON_TYPE 表中的一行数据,并提交
DELETE FROM PERSON_TYPE WHERE PERSON_TYPEID=4;
COMMIT;
SELECT * FROM PERSON_TYPE;  --4条数据

--通过删除操作之前的 LSN 值进行闪回查询得到删除前的数据
SELECT * FROM PERSON_TYPE AS OF SCN 42097;   --5条数据

1.4.2 闪回版本查询_支持update场景

INI 参数 UNDO_RETENTION 设置了事务提交后回滚页保持时间,缺省为 90 秒。因此,超出 UNDO_RETENTION 时间之外的过期闪回版本,无法被闪回查询到。

闪回版本查询_语法格式
--语法格式
<闪回版本查询子句>::=VERSIONS BETWEEN <闪回版本查询条件>
<闪回版本查询条件>::=TIMESTAMP <time_exp1> AND <time_exp2> | 
                     SCN|LSN <lsn1> AND <lsn2>

--参数说明
1.time_exp:日期表达式,一般用字符串方式表示。<time_exp1> 表示起始时间,<time_exp2> 表示结束时间
2.lsn:LSN 值。<lsn1> 表示起始 LSN,<lsn2> 表示结束 LSN                     
使用说明
  1. 闪回版本查询支持普通表(包括加密表与压缩表)、水平分区表和堆表,不支持临时表、列存储表、外部表与视图;
  2. 支持将表 17.2.1 中的伪列作为闪回版本查询的查询项,辅助获取精准的闪回查询信息。

表17.2.1 闪回版本查询支持的伪列

伪列说明
VERSIONS_STARTTIME、VERSIONS_STARTSCN、VERSIONS_STARTTRXID起始时间戳、起始 LSN、起始 TRXID
VERSIONS_ENDTIME、VERSIONS_ENDSCN、VERSIONS_ENDTRXID提交时间戳、提交 LSN、提交 TRXID。如果该值为 NULL,表示行版本仍然是当前版本
VERSIONS_OPERATION在行上的操作。I 表示 Insert、D 表示 Delete、U 表示 Update

image.png

语句功能

用户通过闪回版本查询子句,可以得到指定表过去某个时间段内,事务导致记录变化的全部记录。指定条件可以为时刻或 LSN。

示例
语法:
SELECT 参数,column_name,
FROM table_name VERSIONS BETWEEN TIMESTAMP '2023-11-23 22:55:12' AND SYSDATE;
示例:
SELECT VERSIONS_STARTSCN, VERSIONS_ENDSCN, NAME FROM PERSON_TYPE VERSIONS BETWEEN TIMESTAMP '2023-11-23 22:55:56' AND SYSDATE;
SELECT VERSIONS_STARTTIME,VERSIONS_STARTSCN,VERSIONS_STARTTRXID,VERSIONS_ENDTIME,VERSIONS_ENDSCN,VERSIONS_ENDTRXID,VERSIONS_OPERATION,NAME FROM PERSON_TYPE VERSIONS BETWEEN TIMESTAMP '2023-11-23 22:55:12' AND SYSDATE;
name即column_name,可以多个

--查询PERSON_TYPE  5条数据
SQL> SELECT * FROM PERSON_TYPE;

LINEID     PERSON_TYPEID NAME        
---------- ------------- ------------
1          1             采购经理
2          2             采购代表
3          3             销售经理
4          4             销售代表
5          5             防损员

--查询当前时间
SQL> select sysdate from dual;

LINEID     sysdate            
---------- -------------------
1          2023-11-23 22:55:56

--修改数据,并提交
UPDATE PERSON_TYPE SET NAME='保安员' WHERE PERSON_TYPEID=5;
COMMIT;
UPDATE PERSON_TYPE SET NAME='收银员' WHERE PERSON_TYPEID=5;
COMMIT;

--查询修改后的表
SQL> SELECT * FROM PERSON_TYPE;

LINEID     PERSON_TYPEID NAME        
---------- ------------- ------------
1          1             采购经理
2          2             采购代表
3          3             销售经理
4          4             销售代表
5          5             收银员

--进行闪回版本查询,获得指定时间段内变化的记录
SQL> SELECT VERSIONS_STARTSCN, VERSIONS_ENDSCN, NAME FROM PERSON_TYPE VERSIONS BETWEEN TIMESTAMP '2023-11-23 22:55:56' AND SYSDATE;
LINEID     VERSIONS_STARTSCN    VERSIONS_ENDSCN      NAME        
---------- -------------------- -------------------- ------------
1          NULL                 NULL                 采购经理
2          NULL                 NULL                 采购代表
3          NULL                 NULL                 销售经理
4          NULL                 NULL                 销售代表
5          54525                NULL                 收银员
6          54522                54525                保安员
7          54519                54522                防损员

--利用伪列 VERSION_STARTSCN 进行闪回查询得到修改前的数据
SQL> SELECT * FROM PERSON_TYPE AS OF SCN 54519;

LINEID     PERSON_TYPEID NAME        
---------- ------------- ------------
1          1             采购经理
2          2             采购代表
3          3             销售经理
4          4             销售代表
5          5             防损员

SQL> SELECT * FROM PERSON_TYPE AS OF SCN 54522;
LINEID     PERSON_TYPEID NAME        
---------- ------------- ------------
1          1             采购经理
2          2             采购代表
3          3             销售经理
4          4             销售代表
5          5             保安员

SQL> SELECT * FROM PERSON_TYPE AS OF SCN 54525;

LINEID     PERSON_TYPEID NAME        
---------- ------------- ------------
1          1             采购经理
2          2             采购代表
3          3             销售经理
4          4             销售代表
5          5             收银员

1.4.3 闪回事务查询

闪回事务查询提供系统视图 V$FLASHBACK_TRX_INFO 供用户查看在事务级对数据库所做的更改。根据视图信息,可以确定如何还原指定事务或指定时间段内的修改。

使用说明

系统视图名为 V F L A S H B A C K T R X I N F O ,定义如表 17.3.1 所示。表 17.3.1 系统视图 V FLASHBACK_TRX_INFO,定义如表 17.3.1 所示。 表17.3.1 系统视图V FLASHBACKTRXINFO,定义如表17.3.1所示。表17.3.1系统视图VFLASHBACK_TRX_INFO定义

列名数据类型说明
START_TRXIDBIGINT事务中第一个 DML 的 TRXID
START_TIMESTAMPTIMESTAMP事务中第一个 DML 的时间戳
COMMIT_TRXIDBIGINT提交事务的 TRXID
COMMIT_TIMESTAMPTIMESTAMP提交事务时的时间戳
LOGON_USERVARCHAR(256)拥有事务的用户
UNDO_CHANGE#INT记录修改顺序序号
OPERATIONCHAR(1)DML 操作类型。
D:删除;U:修改;I:插入;N:更新插入(专门针对 CLUSTER PRIMARY KEY 的插入); C:事务提交;P:预提交记录;O:default
TABLE_NAMEVARCHAR(256)DML 修改的表
TABLE_OWNERVARCHAR(256)DML 修改表的拥有者
ROW_IDROWIDDML 修改行的 ROWID
UNDO_SQLVARCHAR(3900)撤销 DML 操作的 SQL 语句
COMMIT_LSNBIGINT事务提交时的 LSN
示例

例 查询指定时间之后的事务信息,可为闪回查询操作提供参考。

SELECT * FROM V$FLASHBACK_TRX_INFO WHERE COMMIT_TIMESTAMP > '2023-11-23 22:55:56';

示例 2 :闪回查询指定 TRXID
闪回查询指定 TRXID的 PERSON_TYPE 表要获得 TRXID 信息, 需要通过闪回版本查询的伪列 VERSIONS_ENDTRXID。注意只针对update 有效,如果是insert,则没有效果。

--查询当前时间
SQL> select sysdate from dual;

LINEID     sysdate            
---------- -------------------
1          2023-11-23 19:12:55

--更新数据
UPDATE PERSON_TYPE SET role='保安员' WHERE role='安保'; 
UPDATE PERSON_TYPE SET role='收银员' WHERE role='会计员'; 
INSERT INTO PERSON_TYPE(role) VALUES('防损员');
INSERT INTO PERSON_TYPE(role) VALUES('保洁员');
COMMIT; 

SELECT * FROM PERSON_TYPE;

--进行闪回版本查询,确定 TRXID
SQL> SELECT VERSIONS_ENDTRXID, ROLE FROM PERSON_TYPE VERSIONS BETWEEN TIMESTAMP '2023-11-23 19:12:55' AND SYSDATE;

LINEID     VERSIONS_ENDTRXID    ROLE        
---------- -------------------- ------------
1          NULL                 采购经理
2          NULL                 财务经理
3          NULL                 经销商
4          NULL                 收银员
5          NULL                 保安员
6          NULL                 司机
7          NULL                 防损员
8          NULL                 保洁员
9          22105                会计员
10         22105                安保

--根据 TRXID 确定版本(只针对update 有效,如果是insert,则没有效果)
SELECT * FROM PERSON_TYPE WHEN TRXID 22105;

1
2
3
4
5
结果集如下所示:

进行闪回版本查询,确定 TRXID:

SELECT VERSIONS_ENDTRXID, NAME FROM PERSON_TYPE VERSIONS BETWEEN TIMESTAMP ‘2012-01-01 12:24:00’ AND SYSDATE;
1
得到结果集如下所示:

根据 TRXID 确定版本:

SELECT * FROM PERSON_TYPE WHEN TRXID 322;
1
结果集如下所示:

2.2 闪回版本查询
语法格式:

<闪回版本查询子句>::=VERSIONS BETWEEN |
1
参数:
(1)time_exp 日期表达式,一般用字符串方式表示。time_exp1 表 示起始时间,time_exp2 表示结束时间 。
(2)trxid 指定事务 ID 号,整数表示。trxid1 表示起始 trxid, trxid2 表示结束 trxid 。
使用说明 :
(1)闪回版本查询支持普通表(包括加密表与压缩表)、临时表和 堆表,不支持水平分区表、列存储表、外部表与视图;
(2)支持如下图所示伪列,作为闪回版本查询的辅助信息。
如下图所示: 闪回版本查询支持的伪列

语句功能:
用户通过闪回版本查询子句,可以得到指定表过去某个时间段内,事务导致记录变化的全部记录。指定条件可以为时刻,或事务号。
举例说明:
例 1 :
闪回版本查询指定时间段内,PERSON_TYPE 表的记录变化。
在 2012-01-01 12:24:05 时刻修改数据,并提交。

UPDATE PERSON_TYPE SET NAME=‘保安员’ WHERE PERSON_TYPEID=5;
COMMIT;
UPDATE PERSON_TYPE SET NAME=‘收银员’ WHERE PERSON_TYPEID=5;
COMMIT;
SELECT * FROM PERSON_TYPE;
1
2
3
4
5
结果集如下图所示:

进行闪回版本查询,获得指定时间段内变化的记录:

SELECT VERSIONS_ENDTRXID, NAME FROM PERSON_TYPE VERSIONS BETWEEN TIMESTAMP ‘2012-01-01 12:24:00’ AND SYSDATE;
1
得到结果集如下图所示:

2.3 闪回事务查询
闪回事务查询提供系统视图 V F L A S H B A C K T R X I N F O 供用户查看在事务级对数据库所做的更改。根据视图信息,可以确定如何还原指定事务或指定时间段内的修改。使用说明:系统视图名为 V FLASHBACK_TRX_INFO 供用户查看在事务级对数据库所做的更改。根据视图信息,可以确定如何还原指定事务或指定时间段内的修改。 使用说明: 系统视图名为 V FLASHBACKTRXINFO供用户查看在事务级对数据库所做的更改。根据视图信息,可以确定如何还原指定事务或指定时间段内的修改。使用说明:系统视图名为VFLASHBACK_TRX_INFO,定义如下图所示:

举例说明:
例 1 :
查询指定时间之后的事务信息,可为闪回查询操作提供参考。

SELECT * FROM V$FLASHBACK_TRX_INFO WHERE COMMIT_TIMESTAMP > ‘2012-01-01 12:00:00’;
1
二、日志挖掘
1.什么是达梦数据库日志挖掘?
用户可以使用 DBMS_LOGMNR 包对归档日志进行挖掘,重构出 DDL 和 DML 等操作,并通过获取的信息进行更深入的分析。
DM MPP 环境下不支持 DBMS_LOGMNR 包。
2.操作过程
2.1 配置归档与参数
(1)开启归档,在 dm.ini 中修改参数 ARCH_INI=1;
(2)修改参数 RLOG_APPEND_LOGIC(动态,系统级)为 1 或 2;

sf_set_system_para_value(‘RLOG_APPEND_LOGIC’,1,0,1);
1
2.2 创建系统包

SP_CREATE_SYSTEM_PACKAGES(1,‘DBMS_LOGMNR’);
1
2.3 查询数据库当前归档日志

SELECT NAME,FIRST_TIME,NEXT_TIME,FIRST_CHANGE#,NEXT_CHANGE# FROM V$ARCHIVED_LOG;
1
2.4 添加需要分析的归档日志文件

DBMS_LOGMNR.ADD_LOGFILE(‘/data/dmdata/DAMENG/arch/ARCHIVE_LOCAL1_0x6B E5BB4B[0]_2021-01-06_09-40-28.log’);
1
注:对于不在数据库默认归档路径下的归档日志,可以直接指定归档日志的绝对路径添加进分析列表。
2.5 查询通过 ADD_LOGFILE 添加的归档日志文件

SELECT LOW_SCN, NEXT_SCN, LOW_TIME, HIGH_TIME, LOG_ID, FILENAME FROM V$LOGMNR_LOGS;
1
2.6 启动归档日志文件分析

DBMS_LOGMNR.START_LOGMNR(OPTIONS=>2128,STARTTIME=>TO_DATE(‘2021-1-6 15:01:12’,‘YYYY-MM-DD HH24:MI:SS’),ENDTIME=>TO_DATE(‘2021-1-6 16:01:12’,‘YYYY-MM-DD HH24:MI:SS’));
1
OPTIONS:
提供如下表所列的可选模式,各模式可以通过 + 或者按位或来进行组合。其它位的值如 1、4、8 等目前不支持,配置后不会报错,但是没有效果。例如,组合全部模式,则取值计算方法为 2+16+64+2048=2130,那么 OPTIONS 值取就是 2130。

2.7 查看归档日志文件的分析结果

select TIMESTAMP,START_TIMESTAMP,COMMIT_TIMESTAMP,OPERATION,OPERATION_CODE,R OLL_BACK,TABLE_NAME,ROW_ID,USERNAME,DATA_OBJ#,DATA_OBJV#,SQL_REDO,RED O_VALUE,UNDO_VALUE
from V$LOGMNR_CONTENTS
where table_name=‘TEST_INSERT’;
1
2
3
2.8 终止归档日志文件分析
2.8.1 结束分析

DBMS_LOGMNR.END_LOGMNR();
1
2.8.2 删除系统包

SP_CREATE_SYSTEM_PACKAGES(0,‘DBMS_LOGMNR’);
1
三、数据库备份恢复
通过备份与归档日志将数据库恢复数据库到指定时间点/LSN;
1.备份与恢复
还原与恢复是备份的逆过程。
还原是将备份集中的有效数据页重新写入目标数据文件的过程。
恢复则是指通过重做归档日志,将数据库状态恢复到备份结束时的状态;也可以恢复到指定时间点和指定 LSN。恢复结束以后,数据库中可能存在处于未提交状态的活动事务, 这些活动事务在恢复结束后的第一次数据库系统启动时,会由 DM 数 据库自动进行回滚。
2.操作步骤
2.1 记录时间或者 LSN

SELECT SYSDATE;–当前时间
SELECT FILE_LSN FROM V$RLOG;–此时的 LSN
1
2
2.2 关闭数据库

./DmServiceDM stop
1
2.3 打开 dmrman 并还原数据库

./dmrman RMAN> RESTORE DATABASE ‘/data/dmdata/DAMENG/dm.ini’ FROM BACKUPSET ‘/data/dmdata/DAMENG/bak/DB_DAMENG_FULL_20210106_165522_978586’;
1
2.4 恢复数据库到指定时间点/LSN

RMAN> RECOVER DATABASE ‘/data/dmdata/DAMENG/dm.ini’ WITH ARCHIVEDIR’/data/dmdata/DAMENG/arch’ UNTIL TIME ‘2021-1-6 10:56:40.624931’; 或者RMAN> RECOVER DATABASE ‘/data/dmdata/DAMENG/dm.ini’ WITH ARCHIVEDIR’/data/dmdata/DAMENG/arch’ UNTIL LSN 1191826;
1
2.5 数据库更新

RMAN> RECOVER DATABASE ‘/data/dmdata/DAMENG/dm.ini’ UPDATE DB_MAGIC;
1
2.6 重启数据库

./DmServiceDM start
1
以上三种方式仅供大家参考~~~
————————————————
版权声明:本文为CSDN博主「chen丨yu」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/chenyu940415/article/details/117354407

1.5.问题处理

flashback version has been out of date

问题描述

误操作后,闪回查询到某一时间点提示:“[-9801]:flashback version has been out of date.”

SQL> SELECT * FROM PERSON_TYPE WHEN TIMESTAMP '2023-11-23 18:51:41';
SELECT * FROM PERSON_TYPE WHEN TIMESTAMP '2023-11-23 18:51:41';
[-9801]:flashback version has been out of date.
used time: 0.548(ms). Execute id is 0.
问题排查

可能引起该报错的原因有:

UNDO_RETENTION参数
--查询UNDO_RETENTION参数
select name,type,value from v$parameter where name = 'UNDO_RETENTION';

LINEID     name           TYPE VALUE    
---------- -------------- ---- ---------
1          UNDO_RETENTION SYS  90.000000

有博主写的默认900秒,15分钟,但是官方文档写的是90秒。如果显示的是90说明没有更改参数过了UNDO_RETENTION则无法进行闪回查询。不重启也验证了可以闪回查询。

解决办法
--更改UNDO_RETENTION参数
alter system set 'UNDO_RETENTION'=3600 both;
select name,type,value from v$parameter where name = 'UNDO_RETENTION';

--重启生效(可选)
[dmdba@localhost ~]$ /dmdb8/dmdbms/bin/DmServicefuwa stop
Stopping DmServicefuwa:                                    [ OK ]
[dmdba@localhost ~]$ /dmdb8/dmdbms/bin/DmServicefuwa start
Starting DmServicefuwa: 

--更改参数后未重启查看参数文件dm.ini
发现ENABLE_FLASHBACK=0
    UNDO_RETENTION=90

--重启查看参数文件dm.ini
发现ENABLE_FLASHBACK=1
    UNDO_RETENTION=3600

flashback function is disable

--问题描述:闪回版本查询报错flashback function is disable
SQL> SELECT VERSIONS_STARTSCN, VERSIONS_ENDSCN, NAME FROM PERSON_TYPE VERSIONS BETWEEN TIMESTAMP '2023-11-23 22:48:33' AND SYSDATE;
SELECT VERSIONS_STARTSCN, VERSIONS_ENDSCN, NAME FROM PERSON_TYPE VERSIONS BETWEEN TIMESTAMP '2023-11-23 22:48:33' AND SYSDATE;
[-9803]:Error in line: 1
flashback function is disable.
used time: 0.499(ms). Execute id is 0.

--解决办法
--开启闪回功能
select name,type,value from v$parameter where name='ENABLE_FLASHBACK';
或
select para_value from v$dm_ini where para_name='ENABLE_FLASHBACK';  # 0未开启 1开启

alter system set 'ENABLE_FLASHBACK'=1 both; 
或
sf_set_system_para_value('ENABLE_FLASHBACK',1,0,1);
或
或者修改参数文件dm.ini中ENABLE_FLASHBACK值为1

--重启永久生效(可选)
[dmdba@localhost ~]$ /dmdb8/dmdbms/bin/DmServicefuwa stop
Stopping DmServicefuwa:                                    [ OK ]
[dmdba@localhost ~]$ /dmdb8/dmdbms/bin/DmServicefuwa start
Starting DmServicefuwa: 
                                                           [ OK ]

DM8_DSC场景下启动闪回失败

--问题描述
DSC场景下开启闪回失败提示不支持
[dmdba@localhost ~]$ /dmdb8/dmdbms/bin/disql SYSDBA/SYSDBA:5236

Server[LOCALHOST:5236]:mode is primary, state is open
login used time : 10.660(ms)
disql V8
SQL> sf_set_system_para_value('ENABLE_FLASHBACK',1,0,1);
sf_set_system_para_value('ENABLE_FLASHBACK',1,0,1);
[-2020]:Don't support this operation in DSC.
used time: 41.153(ms). Execute id is 0.

--问题原因
03134284058-20230614-193125-20046版本开始DSC开始支持闪回功能

查达梦数据库版本
SQL> select * from v$version;

LINEID     BANNER                           
---------- ---------------------------------
1          DM Database Server 64 V8
2          DB Version: 0x7000c
3          03134284044-20230417-187846-20040

--解决办法
更改版本或升级版本

参考链接:http://blog.itpub.net/69985512/viewspace-2727220/#:~:text=%23%23%E6%88%96%E8%80%85%E4%BF%AE%E6%94%B9%E5%8F%82%E6%95%B0,%E4%B8%BA1%EF%BC%8C%E9%87%8D%E5%90%AF%E7%94%9F%E6%95%88%E3%80%82

https://eco.dameng.com/document/dm/zh-cn/pm/flashback-query#17.2.3%20%E9%97%AA%E5%9B%9E%E4%BA%8B%E5%8A%A1%E6%9F%A5%E8%AF%A2

二、日志挖掘

什么是达梦数据库日志挖掘

用户可以使用 DBMS_LOGMNR 包对归档日志进行挖掘,重构出 DDL 和 DML 等操作,并通过获取的信息进行更深入的分析。
达梦DBMS_LOGMNR包用于分析归档日志所记载的DML、DDL、DCL等事务操作。通过DBMS_LOGMNR提供的日志挖掘功能,可以确定数据库误操作时间点或SCN,对数据库基于时间点或者SCN的不完全恢复。通过DBMS_LOGMNR可以跟踪达梦数据库的所有DML、DDL、DCL操作,从而取得执行这些操作的时间顺序、执行这些操作的用户等信息,在系统没有打开审计功能时,对数据库进行审计或者对数据库审计结果进行进一步深入分析。
目前 DBMS_LOGMNR 只支持对归档日志进行分析,配置归档后,还需要将 dm.ini 中的RLOG_APPEND_LOGIC 选项置为 1 或 2。
DM MPP 环境下不支持 DBMS_LOGMNR 包。

操作过程

配置归档与参数

(1)开启归档

在 dm.ini 中修改参数 ARCH_INI=1或进行以下参数修改;

#查看归档模式
su - dmdba
/dmdb8/dmdbms/bin/disql sysdba/sysdba:5237
select name,status$,arch_mode from v$database;

#主动刷新检查点
checkpoint(100);
alter database mount;
alter database archivelog;

#设置归档位置  文件大小  上限(视情况更改值)
alter database add archivelog 'dest=/dmdb8/dmarch,type=local,file_size=2048,space_limit=3072';
alter database open;

##手动切归档,执行任意一条sql即可
alter database archivelog current;
alter system archive log current;
alter system switch logfile;

##查询下归档日志文件信息
select t.status,t.path,t.arch_lsn,t.clsn from v$arch_file t;

输出如下信息
LINEID     status   PATH                                                                arch_lsn             clsn                
---------- -------- ------------------------------------------------------------------- -------------------- --------------------
1          INACTIVE /dmdb8/dmarch/ARCHIVE_LOCAL1_0x482D9BC8_EP0_2023-10-18_08-37-26.log 1045456              1045629
ACTIVE 活跃状态,说明是此文件为正在使用的归档日志文件
(2)启用记录逻辑操作功能

修改参数 RLOG_APPEND_LOGIC(动态,系统级)为 1 或 2,默认0;

select name,type,value from v$parameter where name='RLOG_APPEND_LOGIC';

alter system set 'RLOG_APPEND_LOGIC'=1 both; 
或
sf_set_system_para_value('RLOG_APPEND_LOGIC',1,0,1);

构建测试数据

--创建 PERSON_TYPE
create table PERSON_TYPE(PERSON_TYPEID int,NAME varchar2(100));

--PERSON_TYPE中插入数据
insert into PERSON_TYPE values (1,'采购经理');
insert into PERSON_TYPE values (2,'采购代表');
insert into PERSON_TYPE values (3,'销售经理');
insert into PERSON_TYPE values (4,'销售代表');
commit;

--查询PERSON_TYPE
select * from PERSON_TYPE;  --4条数据

--delete删除
delete from PERSON_TYPE where PERSON_TYPEID>2;
commit;
select * from PERSON_TYPE;
commit;

--归档
checkpoint(100);
alter system switch logfile;

创建系统包

SP_CREATE_SYSTEM_PACKAGES(1,'DBMS_LOGMNR');

查询数据库当前归档日志

SELECT NAME,FIRST_TIME,NEXT_TIME,FIRST_CHANGE#,NEXT_CHANGE# FROM V$ARCHIVED_LOG;
select t.STATUS, t.PATH, t.ARCH_LSN, t.CLSN from "V$ARCH_FILE"t;

添加需要分析的归档日志文件

通过调用DBMS_LOGMNR.ADD_LOGFILE过程来添加一个或多个归档日志文件。

DBMS_LOGMNR.ADD_LOGFILE('/dmdb8/dmarch/ARCHIVE_LOCAL1_0x482D9BC8_EP0_2023-11-28_11-30-53.log');
DBMS_LOGMNR.ADD_LOGFILE('/dmdb8/dmarch/ARCHIVE_LOCAL1_0x482D9BC8_EP0_2023-11-28_16-45-54.log');
DBMS_LOGMNR.ADD_LOGFILE('/dmdb8/dmarch/ARCHIVE_LOCAL1_0x482D9BC8_EP0_2023-11-28_17-02-18.log');
DBMS_LOGMNR.ADD_LOGFILE('/dmdb8/dmarch/ARCHIVE_LOCAL1_0x482D9BC8_EP0_2023-11-28_17-08-52.log');
DBMS_LOGMNR.ADD_LOGFILE('/dmdb8/dmarch/ARCHIVE_LOCAL1_0x482D9BC8_EP0_2023-11-28_17-12-54.log');

注:对于不在数据库默认归档路径下的归档日志,可以直接指定归档日志的绝对路径添加进分析列表。

查询通过 ADD_LOGFILE 添加的归档日志文件

SELECT LOW_SCN , NEXT_SCN , LOW_TIME , HIGH_TIME, LOG_ID , FILENAME FROM V$LOGMNR_LOGS;

启动归档日志文件分析

DBMS_LOGMNR.START_LOGMNR();
DBMS_LOGMNR.START_LOGMNR(OPTIONS=>2130, STARTTIME=>TO_DATE('2022-05-14 11:30:00', 'YYYY-MM-DD HH24:MI:SS'), 
ENDTIME=>TO_DATE('2022-05-14 12:30:00', 'YYYY-MM-DD HH24:MI:SS'));

OPTIONS:
提供如下表所列的可选模式,各模式可以通过 + 或者按位或来进行组合。其它位的值如 1、4、8 等目前不支持,配置后不会报错,但是没有效果。例如,组合全部模式,则取值计算方法为 2+16+64+2048=2130,那么 OPTIONS 值取就是 2130。
image.png

查看归档日志文件的分析结果

select
 TIMESTAMP , START_TIMESTAMP ,
 COMMIT_TIMESTAMP, OPERATION ,
 OPERATION_CODE , ROLL_BACK ,
 TABLE_NAME , ROW_ID , USERNAME , DATA_OBJ# ,
 DATA_OBJV# , SQL_REDO , REDO_VALUE , UNDO_VALUE
from V$LOGMNR_CONTENTS where table_name = 'xxx';

终止归档日志文件分析

结束分析
DBMS_LOGMNR.END_LOGMNR();
删除系统包
SP_CREATE_SYSTEM_PACKAGES(0,'DBMS_LOGMNR');

问题处理

v$logmnr_contents查询报错
--问题描述
数据库连接工具查询日志挖掘视图提示如下报错
SQL 错误 [22000]: dbms_logmnr.start_logmnr() must be invoked before selecting from v$logmnr_contents

--问题处理

三、DM8基于时间点的恢复

在生产环境中,当误操作删除了重要数据时,可以使用闪回查询来找回原来的数据,但当表被删除或者数据库没有开启闪回功能时,则无法使用闪回来获取原有的表数据;此时可以使用基于归档日志的时间点的恢复(不完全恢复)来达到恢复数据或恢复表的目的。
本章介绍DM8数据库如何使用归档日志文件将数据库恢复到指定时间点的状态。

备份数据库

数据库故障还原的前提是要有备份文件,这里创建一个原始的数据库备份文件,可以使用DMRMAN脱机备份文件,也可以是联机备份文件。这里以联机备份为例(在联机备份之前,需要保证数据库已开启并配置归档)。使用SYSDBA用户登录数据库,执行如下语句备份数据库:

/dmdb8/dmdbms/bin/disql sysdba/sysdba:5237
SQL> backup database full backupset 'DMfuwaFULL_ONLINE1127';

默认备份目录:/dmdb8/dmdata/fuwa/bak

制造数据,生成归档日志

创建test用户,并在test用户下创建表t_table并插入数据,此过程生成归档日志。

SQL> create user test IDENTIFIED by dameng123 DEFAULT TABLESPACE main;
SQL> create table test.t_table as select * from SYSOBJECTS;

模拟故障,删除表

模拟故障,删除test用户下表t_table。并记录下删除表时的系统时间。

SQL> drop table test.t_table;
select sysdate;executed successfully
used time: 26.477(ms). Execute id is 705.
SQL> 

LINEID     sysdate            
---------- -------------------
1          2023-11-27 19:41:58

使用备份和归档日志将数据库恢复到指定时间点

t_table表被删除,要想找回此表的数据,只能将数据库恢复到表删除的前一刻。恢复步骤参考如下:

使用备份文件还原数据库

注意:如果是异机还原,异机上需安装数据库软件并初始化和原实例名一样的实例(参数文件和控制文件不用管用初始化的就成会覆盖)
执行如下命令停止数据库:

[dmDBA@localhost bin]$ DmServiceDMTESTSERVER stop

使用步骤1的备份文件将数据库还原到备份时状态:

RMAN> restore database '/dmdb8/dmdata/fuwa/dm.ini' from backupset '/home/dmdba/DMfuwaFULL_ONLINE1127';

使用归档日志将数据库恢复到指定时间点

执行如下命令,指定with archivedir参数使用归档恢复,并指定until time参数将数据库还原到删除表之前的时间,由步骤3得知,我们大概在2020-07-23 10:48:53之前的时间删除了表数据,这里将数据库恢复到2020-07-23 10:48:40的时间(时间越精确越好,无法精确的情况下预估)。

RMAN> recover database '/dmdb8/dmdata/fuwa/dm.ini' with archivedir '/home/dmdba/dmarch' until time '2023-11-27 19:41:58';

从下面的截图可以看出,归档的恢复并不是100%(因为是不完全恢复,并没有完全重做所有归档日志),只是恢复到93%。

更新数据库魔数

执行如下命令更新数据库魔数db_magic信息。

RMAN> recover database 'dmdb8/dmdata/fuwa/dm.ini' update db_magic;

此时,数据库恢复完成。
执行DmServiceDMTESTSERVER start启动数据库,连接数据库查询test用户下t_table表数据,可以看到t_test表已恢复。

总结

使用RECOVER命令恢复数据库时,可以是基于备份集的恢复,也可以是使用本地归档日志的恢复。基于时间点的恢复是使用本地归档日志恢复的方式之一。
除了指定时间点,还可以通过指定LSN进行恢复。DM中每条REDO日志记录都对应一个唯一的LSN值,指定LSN值以后,数据库将会精准的恢复到产生这个LSN时间点的状态。基于LSN的恢复是使用UNTIL LSN 参数恢复到指定的LSN时间点的状态。
基于时间点或LSN的恢复都是不完全恢复,基于归档日志恢复到最新状态为完全恢复。
在实际生产环境中,如果只是删除某张表或数据,建议将数据库还原到另一台机器(目标数据库)上,然后拷贝生产环境归档日志将目标数据库恢复到指定的时间点,以在不影响生成环境的情况下找回表数据,降低对生成环境的影响。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1263166.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【傻瓜级JS-DLL-WINCC-PLC交互】4.DLL读取WINCC内部变量

思路 JS-DLL-WINCC-PLC之间进行交互&#xff0c;思路&#xff0c;先用Visual Studio创建一个C#的DLL控件&#xff0c;然后这个控件里面嵌入浏览器组件&#xff0c;实现JS与DLL通信&#xff0c;然后DLL放入到WINCC里面的图形编辑器中&#xff0c;实现DLL与WINCC的通信。然后PLC与…

OpenHarmonyMeetup2023北京站圆满举办

“OpenHarmony正当时”OpenHarmonyMeetup2023城市巡回活动,旨在通过meetup线下交流形式,解读OpenHarmony作为下一代智能终端操作系统的新版本及成果转化,提升开发者对OpenHarmony的关注度,普及OpenHarmony开发技能,加速开发者对OpenHarmony的掌握,从而吸引更多企业和技术爱好者…

在 The Sandbox 设置总部,SCB 10X 和 T-POP 为 4EVE 元宇宙音乐会揭幕

协作学习为全球粉丝提供了无限的可能性&#xff0c;让他们通过革命性的元宇宙体验沉浸在泰国流行文化中。 作为 SCBX 集团背后的创新力量&#xff0c;SCB 10X 很高兴宣布与 T-POP Incorporation 展开开创性合作&#xff0c;T-POP Incorporation 是泰国流行文化在全球舞台上的领…

Phpstudy v8.0/8.1添加 php-7.4.9

1、官网下载最新的php版本 打开Windows版的官网下载&#xff0c;地址&#xff1a;PHP For Windows: Binaries and sources Releases 页面上有不同的PHP版本&#xff0c;这里我们下载的是64位nts版的PHP7.4.9&#xff0c;php-7.4.9-nts-Win32-vc15-x64.zip。 2、解压下载的文…

苹果mac屏幕投屏镜像工具AirServer2024

airserver 是什么软件&#xff1f;AirServer 是一款 Airplay Mac屏幕镜像应用&#xff0c;AirServer可以通过 mac 实时接收iPhone、iPad以及Android设备的实时屏幕画面。AirServer 可以将一个简单的大屏幕或投影仪变成一个通用的屏幕镜像接收器。在您的大屏幕上启用 AirServer …

量子力学:科技前沿的探索与挑战

量子力学:科技前沿的探索与挑战 一、量子力学的魅力与挑战 量子力学是研究微观粒子如电子、光子等行为的物理学分支。与经典力学不同,量子力学描述了一个充满不确定性和概率性的世界。在这个世界里,粒子可以同时处于多个状态,只有当我们对其进行测量时,它才会“选择”一个…

【Python深度学习第二版】学习笔记之——什么是深度学习

机器学习是将输入&#xff08;比如图像&#xff09;映射到目标&#xff08;比如标签“猫”&#xff09;的过程。 这一过程是通过观察许多输入和目标的示例来完成的。 深度神经网络通过一系列简单的数据变换&#xff08;层&#xff09;来实现这种输入到目标的映射&#xff0c;这…

入侵redis之准备---Linux关于定时任务crontab相关知识了解配合理解shell反弹远程控制

入侵redis之准备—Linux关于定时任务crontab相关知识了解配合理解shell反弹远程控制 几点需要知道的信息 【1】crontab一般来说服务器都是有的&#xff0c;依赖crond服务&#xff0c;这个服务也是必须安装的服务&#xff0c;并且也是开机自启动的服务&#xff0c;也就是说&…

国内高速下载huggingface上的模型

前提 Python版本至少是3.8 安装 安装hugging face官方提供的下载工具 pip install -U huggingface_hub hf-transfer Windows设置环境变量 在当前窗口设置临时环境变量&#xff08;cmd.exe&#xff09; set HF_HUB_ENABLE_HF_TRANSFER 1 你也可以设置永久的环境变量&am…

鸿蒙开发ArkUI -常用布局

线性布局(Row/Column) 间距/主轴排列方式/交叉轴对齐方式 Column({}) {Column() {}.width(80%).height(50).backgroundColor(0xF5DEB3)Column() {}.width(80%).height(50).backgroundColor(0xD2B48C)Column() {}.width(80%).height(50).backgroundColor(0xF5DEB3) } .width(1…

【图像分割】【深度学习】PFNet官方Pytorch代码-PFNet网络损失函数模块解析

【图像分割】【深度学习】PFNet官方Pytorch代码-PFNet网络损失函数模块解析 文章目录 【图像分割】【深度学习】PFNet官方Pytorch代码-PFNet网络损失函数模块解析前言PM定位模块损失函数FM聚焦模块损失函数总结 前言 在详细解析PFNet代码之前&#xff0c;首要任务是成功运行PF…

面试篇spark(spark core,spark sql,spark 优化)

一&#xff1a;为什么学习spark&#xff1f; 相比较map-reduce框架&#xff0c;spark的框架执行效率更加高效。 mapreduce的执行框架示意图。 spark执行框架示意图 spark的执行中间结果是存储在内存当中的&#xff0c;而hdfs的执行中间结果是存储在hdfs中的。所以在运算的时…

深入理解强化学习——马尔可夫决策过程:贝尔曼期望方程-[举例与代码实现]

分类目录&#xff1a;《深入理解强化学习》总目录 在文章《深入理解强化学习——马尔可夫决策过程&#xff1a;贝尔曼期望方程-[基础知识]》中我们讲到了贝尔曼期望方程&#xff0c;本文就举一个贝尔曼期望方程的具体例子&#xff0c;并给出相应代码实现。 下图是一个马尔可夫…

Harmony OS4开发入门

代码地址&#xff1a; https://gitee.com/BruceLeeAdmin/harmonyos/tree/master 项目目录介绍 ArkTS介绍 简单案例&#xff1a; State times: number 0/*数据类型&#xff1a;stringnumberany: 不确定类型&#xff0c;可以是任意类型*/State msg: string "hello"…

正点原子linux应用编程——提高篇1

在之前的入门篇学习中&#xff0c;都是直接在Ubuntu中进行验证的&#xff0c;对于嵌入式Linux系统来说&#xff0c;也是可以直接移植的&#xff0c;只需要使用嵌入式硬件平台对应的交叉编译工具编译应用程序即可运行。 在嵌入式Linux系统中&#xff0c;编写的应用程序通常需要…

uniapp使用vue3和ts开发小程序获取用户城市定位

这个组件的功能&#xff1a;可以重新定位获取到用户的具体位置&#xff0c;这个是通过getLocation这个api和高德地图的api获取到的&#xff0c;getLocation这个api需要在微信公众平台后台>开发管理> 接口管理里面申请才能使用的&#xff0c;不然无法使用哦&#xff0c;这…

数学老师怎么和家长沟通

作为一名数学老师&#xff0c;与家长建立良好的沟通关系是非常重要的。以下是我个人认为可以帮助与家长有效沟通的建议&#xff1a; 建立良好的第一印象 第一次与家长接触时&#xff0c;要尽可能展现出你的专业素养和热情。在交流中&#xff0c;要表达出你对孩子的关心和重视&…

Android 编译的配置文件:android.mk 和android.bp

Android.bp文件首先是Android系统的一种编译配置文件&#xff0c;是用来代替原来的Android.mk文件的。在Android7.0以前&#xff0c;Android都是使用make来组织各模块的编译&#xff0c;对应的编译配置文件就是Android.mk。在Android7.0开始&#xff0c;Google引入了ninja和kat…

接口文档自动生成工具:详细教程和实用技巧

本篇文章详细教你如何使用 Apifox 的 IDEA 插件实现自动生成接口代码。好处简单总结有以下几点&#xff1a; 自动生成接口文档&#xff1a; 不用手写&#xff0c;一键点击就可以自动 生成文档&#xff0c;当有更新时&#xff0c;点击一下就可以自动同步接口文档&#xff1b;代…

小程序静默授权获取unionid

文章目录 导文文章重点 导文 小程序静默授权获取unionid 文章重点 用wx.login(Object object)放到app.js里面 wx.login({success (res) {console.log(123);if (res.code) {//发起网络请求// wx.request({// url: https://example.com/onLogin,// data: {// code: res.…