当前位置: 首页 > news >正文

Oracle-rolling upgrade升级19c

前言:

        本文主要描述Oracle11g升19c rolling upgrade升级测试,通过逻辑DG+autoupgrade方式实现rolling upgrade,从而达到在较少停机时间内完成Oracle11g升级到19c的目标

升级介绍:

        升级技术:

        rolling upgrade轮询升级,通过采用跨版本主备数据库同步方式(11g逻辑备库方式同步到19c),在不影响业务的情况下,提前升级备环境的数据库以作为升级测试环境或者待迁移环境,减少停机升级数据库版本的操作时间,从而在停机窗口正式迁移中花费较少的停机时间就可以将数据库切换到新环境,大大缩短了数据库升级的时间以及风险,适合同平台或是官方支持的DG异构平台的Oracle 11.1及以上跨版本升级

升级过程:

        1 部署ADG主备物理同步环境:

        2 ADG主备物理同步转为逻辑备库同步:

        3 逻辑备库取消同步,使用autoupgrade工具将备库升级为19c:

        4 逻辑备库重新恢复与主库的同步,此时主库为11g,逻辑备库为19c:

        5 正式迁移,应用停机,将主库切换为逻辑备库,新环境切换为主库,应用连接新环境

        6 迁移之后,对于旧环境的升级可以有三种方式

        a.旧环境不再使用,直接使用新环境作为主库,没有容灾

        b.旧环境也同样使用autoupgrade的方式升级为19c,然后作为逻辑备库与主库进行同步,后面也可以重新switchover到旧环境

        c.旧环境恢复到物理备库(需要使用闪回点),然后作为物理备库与主库进行同步,通过应用新环境的redo日志升级到19c,后面也可以重新switchover到旧环境

升级步骤:

        1 升级环境信息:

        2 部署物理ADG:

        按照部署物理ADG的方式部署即可,这里省略

        3 安装19c软件,并准备好环境变量配置文件:

        安装19c软件安装即可,这里省略

        4 转化逻辑备库准备

        检查逻辑复制不支持的表字段类型:

        不支持的字段类型:

  • ROWID

  • UROWID

  • Nested tables

  • Objects with nested tables

  • Identity columns(Oracle 12c)

        查询不支持的字段类型,对应不支持的字段表,需要再迁移后,单独导入

select DISTINCT OWNER, TABLE_NAME,COLUMN_NAME,DATA_TYPE
FROM DBA_LOGSTDBY_UNSUPPORTED;

        检查逻辑复制不支持的表:

  • 表包只包含LOB (CLOB, NCLOB, BLOB),LONG,LONG RAW,OBJECT TYPE,COLLECTIONS,XML,VARCHAR2 (with a declared column length > 4000 bytes),NVARCHAR2 (with a declared column length > 4000 bytes),RAW (with a declared column length > 4000 bytes)列的表

  • 分区包含系统分区以及关联子分区

        检查询不支持的表,对于不支持的字段表,需要再迁移后,单独导入

select owner,table_name from DBA_LOGSTDBY_UNSUPPORTED_TABLE;

        检查逻辑复制不支持的PL/SQL包:

        不支持的PL/SQL包,会对系统元数据进行修改的

  • DBMS_JAVA

  • DBMS_REGISTRY

  • DBMS_ALERT,DBMS_SPACE_ADMIN

  • DBMS_REFRESH

  • DBMS_AQ,DBMS_RESOURCE_MANAGER

        检查逻辑复制没有主键的表:

        逻辑复制需要主键或非null唯一键,如果没有主键以及唯一键,则默认用非clob,blob字段的全部列作为主键

        检查没有主键的表包含无长度限定范围的列,如clob,blob

SELECT OWNER, TABLE_NAME FROM DBA_LOGSTDBY_NOT_UNIQUEWHERE (OWNER, TABLE_NAME) NOT IN (SELECT DISTINCT OWNER, TABLE_NAME FROM DBA_LOGSTDBY_UNSUPPORTED) AND BAD_COLUMN = 'Y';

        对于应用可以确保数据唯一,但实际没有创建主键的,可以通过创建RELY DISABLE告诉数据库数据是符合唯一要求的,但是实际上约束并没有起作用。比如在创建逻辑standby的时候,oracle建议对那些没有主键或者唯一索引,且检查发现DBA_LOGSTDBY_NOT_UNIQUE.BAD_COLUMN=Y的表创建rely disable的主键。

ALTER TABLE mytab ADD PRIMARY KEY (id, name) RELY DISABLE;

        检查逻辑复制不支持的同步用户:

SELECT OWNER FROM DBA_LOGSTDBY_SKIP -
WHERE STATEMENT_OPT = 'INTERNAL SCHEMA';
​
OWNER
------------------------------
SYS
SYSTEM
MDSYS
ORDSYS
EXFSYS
DBSNMP
WMSYS
ORACLE_OCM
APPQOSSYS
XS$NULL
APEX_030200
ORDDATA
CTXSYS
ANONYMOUS
OUTLN
DIP
SYSMAN
XDB
ORDPLUGINS
OWBSYS
MGMT_VIEW
SI_INFORMTN_SCHEMA
OLAPSYS

        逻辑复制的DDL事务:

  • 对于CTAS操作的,在备库应用会变成create+insert

  • 对于在同一时间发生DDL,DML事务在同一个对象上的,逻辑备库应用会丢弃DML操作

  • 如表执行DDL操作触发了表的DML操作,那这一部分DML操作会被逻辑备库丢掉

  • 主库执行的DDL操作,会在逻辑备库重新执行,所以对应DDL里面包含确定的非文本值,如sysdate(),会导致主备之间两边的数据不一致

    如:ALTER TABLE hr.employees ADD (start_date date default sysdate);

        逻辑复制包含数据字典的语句:

        升级之后,备库应用主库涉及数据字典的语句可能会操作失败,因为主备两端的数据字典已经不一致

        比如:create table test.test1 as select * from dba_objects,dba_objects在11g是15列,而在19c已经是26列了,表早已发生变化,这时候只能通过备库skip 问题表

        5 主库创建闪回点(可选)

        对于切换之后,主库计划作为物理备库的,需要先在主库创建闪回点,备库转为为逻辑备库之前,确保时间点是在逻辑备库新的incarnation之前

        主库创建闪回点需要确保闪回区的空间足够,归档日志空间足够

create restore point pre_standby guarantee flashback database;

        6 物理备库转化为逻辑备库        

        备库关闭日志应用

ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;

        主库初始化日志数据字典

--执行会等待数据库事务结束
EXECUTE DBMS_LOGSTDBY.BUILD
--会自动开启补充日志
SQL> select
SUPPLEMENTAL_LOG_DATA_FK,SUPPLEMENTAL_LOG_DATA_ALL,SUPPLEMENTAL_LOG_DATA_MIN
from gv$database;
SUP SUP SUPPLEME
--- --- --------
NONO  IMPLICIT

        将备库启动为mount

--单机关闭启动到mount
SHUTDOWN immediate;
STARTUP MOUNT ;
--如果是RAC,需要启动为独占模式
SQL> ALTER SYSTEM SET CLUSTER_DATABASE=FALSE SCOPE=SPFILE;
SQL> SHUTDOWN immediate;
SQL> STARTUP MOUNT EXCLUSIVE;

        将备库转化为逻辑DG角色

        方式一:指定新的db_name

        对于db_name,请指定与主数据库不同的数据库名称以标识新的逻辑备用数据库。如果使用的是服务器参数文件(spfile) 在您发出此语句时,数据库将更新该文件有关新逻辑备用数据库的相应信息。如果您没使用spfile文件,然后数据库发出一条消息,提醒您设置关闭数据库后DB_NAME参数

ALTER DATABASE RECOVER TO LOGICAL STANDBY db_name;

        方式二:保留相同的db_name(rolling upgrade使用这种方式)

ALTER DATABASE RECOVER TO LOGICAL STANDBY KEEP IDENTITY;
--语句会等待读取到从主库发送过来的日志里面包含LogMiner dictionary

        确认备库角色转为为逻辑备库

select database_role,NAME,controlfile_type
from v$database
DATABASE_ROLE    NAME      CONTROL
---------------- --------- -------
LOGICAL STANDBY  DB        CURRENT

        调整逻辑备库的日志路径,因为逻辑备库日志有4种类型online log(archive log),standby log(Foreign Archived Logs)需要将日志归档分开

--归档online log 
alter system set LOG_ARCHIVE_DEST_1='LOCATION=/u01/app/oracle/arch/onlinelog/newdb VALID_FOR=(ONLINE_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=newdb';
--primary role的链路
alter system set LOG_ARCHIVE_DEST_2='service=db LGWR ASYNC NOAFFIRM delay=0 optional compression=disable max_failure=0 max_connections=1 reopen=30 net_timeout=300 valid_for=(ONLINE_LOGFILES,PRIMARY_ROLE) db_unique_name=db';
--归档standby log ,也叫Foreign Archived Logs,逻辑备库接收到主库的日志,由于日志的DBID可能不一样,所以叫做外部归档日志,日志无法通过RMAN进行备份删除,
--如果设置了闪回区,则日志会存放在闪回区里面
alter system set LOG_ARCHIVE_DEST_3='LOCATION=/u01/app/oracle/arch/standbylog/newdb VALID_FOR=(STANDBY_LOGFILES,STANDBY_ROLE) DB_UNIQUE_NAME=newdb';

        打开逻辑备库

--如果使用KEEP IDENTITY,则不需要使用RESETLOGS,使用RECOVER TO LOGICAL STANDBY db_name的方式需要open resetlogs
shutdown immediate;
startup mount;
ALTER DATABASE OPEN;

        逻辑备库开启event记录,记录不支持的操作,这样可以在切换之前,确认更新的数据库的事务是否存在没有应用的情况

EXEC DBMS_LOGSTDBY.APPLY_SET('MAX_EVENTS_RECORDED',DBMS_LOGSTDBY.MAX_EVENTS);
EXEC DBMS_LOGSTDBY.APPLY_SET('RECORD_UNSUPPORTED_OPERATIONS', 'TRUE');

        逻辑备库开启日志同步

ALTER DATABASE START LOGICAL STANDBY APPLY IMMEDIATE;

        7 检查逻辑备库同步

        检查进程状态

SELECT SESSION_ID, STATE FROM V$LOGSTDBY_STATE;
SELECT SID, SERIAL#, SPID, TYPE FROM V$LOGSTDBY_PROCESS;
SELECT STATUS FROM V$LOGSTDBY_PROCESS WHERE TYPE = 'READER';

        检查日志应用进度

ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MON-YYYY HH24:MI:SS';
SELECT SYSDATE,APPLIED_TIME, APPLIED_SCN, MINING_TIME, MINING_SCN 
FROM V$LOGSTDBY_PROGRESS;

        查看不支持事务

SET LONG 1000
SET PAGESIZE 180
SET LINESIZE 79
SELECT EVENT_TIMESTAMP, EVENT, STATUS FROM DBA_LOGSTDBY_EVENTS
ORDER BY EVENT_TIMESTAMP;

        8 逻辑备库升级19c

        禁用自动删除foreign archive log,避免升级完之后,日志被删除

EXECUTE DBMS_LOGSTDBY.APPLY_SET('LOG_AUTO_DELETE', 'FALSE');

        关闭日志应用

ALTER DATABASE stop LOGICAL STANDBY APPLY

        关闭逻辑备库安全访问保护

ALTER DATABASE GUARD NONE;

        使用autoupgrade将逻辑备库升级到19c

        这里省略具体的autoupgrade执行步骤,具体参考:

Oracle-Autoupgrade方式升级19chttp://mp.weixin.qq.com/s?__biz=MzkxODM0MzgwOA==&mid=2247484478&idx=1&sn=d046be5961b59a65183a5f060806c9ad&chksm=c1b39dd1f6c414c7b3004860e357ba8e20a006d23a20136c4b4e49082d97fdacabb7bad5c820&scene=21#wechat_redirect

java -jar /tmp/autoupgrade.jar -config /tmp/config.txt -mode analyze 
java -jar /tmp/autoupgrade.jar -config /tmp/config.txt -mode  fixups
java -jar /tmp/autoupgrade.jar -config /tmp/config.txt -mode  deploy

        查看升级后的组件

--升级之后,注意环境变量使用19c的环境以及监听都要使用19c
set linesize 400
set pagesize 400
Col Comp_name Format a60
Col Status Format a12
Select Comp_name, status, Version
From Dba_Registry
Order by Comp_name;
COMP_NAME                                                    STATUS       VERSION
------------------------------------------------------------ ------------ ------------------------------
JServer JAVA Virtual Machine                                 VALID        19.0.0.0.0
OLAP Analytic Workspace                                      VALID        19.0.0.0.0
Oracle Application Express                                   VALID        3.2.1.00.12
Oracle Database Catalog Views                                VALID        19.0.0.0.0
Oracle Database Java Packages                                VALID        19.0.0.0.0
Oracle Database Packages and Types                           VALID        19.0.0.0.0
Oracle Multimedia                                            VALID        19.0.0.0.0
Oracle OLAP API                                              VALID        19.0.0.0.0
Oracle Real Application Clusters                             OPTION OFF   19.0.0.0.0
Oracle Text                                                  VALID        19.0.0.0.0
Oracle Workspace Manager                                     VALID        19.0.0.0.0
Oracle XDK                                                   VALID        19.0.0.0.0
Oracle XML Database                                          VALID        19.0.0.0.0
Spatial                                                      VALID        19.0.0.0.0

        新环境19c的新逻辑备库开启复制

ALTER DATABASE START LOGICAL STANDBY APPLY IMMEDIATE;

        9 正式迁移(应用停机)

        主库切换为逻辑备库

--主库切换为逻辑备库,由于主备的版本已经不一致,不能采用正常逻辑备库的二阶段切换方式prepare+convert
ALTER DATABASE COMMIT TO SWITCHOVER TO LOGICAL STANDBY;

        新环境备库关闭应用

ALTER DATABASE stop LOGICAL STANDBY APPLY ;

        新环境通过impdp dblink导入逻辑备库不支持复制的表

--创建dblink
create public database link old_prd
connect to system
identified by "oracle"
using 'db';
--查看不支持的表
SQL> select owner,table_name from DBA_LOGSTDBY_UNSUPPORTED_TABLE;
OWNER                          TABLE_NAME
------------------------------ ------------------------------
TEST                           TESTCLOB
--新环境备库导入不支持的表
impdp SYSTEM/oracle directory=DATA_PUMP_DIR NETWORK_LINK=old_prd TABLES=TEST.TESTCLOB TABLE_EXISTS_ACTION=TRUNCATE

        新环境备库正式切换为主库,升级完成,应用可以直接访问新环境

SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE;
SWITCHOVER_STATUS
--------------------
TO PRIMARYSQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY;

        10 旧环境升级

        方式一:旧环境不再需要

        新环境清空主备的配置信息以及链路信息

alter system set LOG_ARCHIVE_DEST_2='' scope=both;
alter system set fal_server='' scope=both;
alter system set fal_client='' scope=both;
alter system set log_archive_config=NODG_CONFIG scope=both;

        方式二:旧环境作为逻辑备库升级为19c

        禁用自动删除foreign archive log,避免升级完之后,日志被删除

EXECUTE DBMS_LOGSTDBY.APPLY_SET('LOG_AUTO_DELETE', 'FALSE');

        关闭日志应用

ALTER DATABASE stop LOGICAL STANDBY APPLY

        关闭逻辑备库安全访问保护

ALTER DATABASE GUARD NONE;

        使用autoupgrade将逻辑备库升级到19c

java -jar /tmp/autoupgrade.jar -config /tmp/config.txt -mode analyze 
java -jar /tmp/autoupgrade.jar -config /tmp/config.txt -mode  fixups
java -jar /tmp/autoupgrade.jar -config /tmp/config.txt -mode  deploy

        查看升级后的组件

--升级之后,注意环境变量使用19c的环境以及监听都要使用19c
set linesize 400
set pagesize 400
Col Comp_name Format a60
Col Status Format a12
Select Comp_name, status, Version
From Dba_Registry
Order by Comp_name;
​
COMP_NAME                                                    STATUS       VERSION
------------------------------------------------------------ ------------ ------------------------------
JServer JAVA Virtual Machine                                 VALID        19.0.0.0.0
OLAP Analytic Workspace                                      VALID        19.0.0.0.0
Oracle Application Express                                   VALID        3.2.1.00.12
Oracle Database Catalog Views                                VALID        19.0.0.0.0
Oracle Database Java Packages                                VALID        19.0.0.0.0
Oracle Database Packages and Types                           VALID        19.0.0.0.0
Oracle Multimedia                                            VALID        19.0.0.0.0
Oracle OLAP API                                              VALID        19.0.0.0.0
Oracle Real Application Clusters                             OPTION OFF   19.0.0.0.0
Oracle Text                                                  VALID        19.0.0.0.0
Oracle Workspace Manager                                     VALID        19.0.0.0.0
Oracle XDK                                                   VALID        19.0.0.0.0
Oracle XML Database                                          VALID        19.0.0.0.0
Spatial                                                      VALID        19.0.0.0.0

        调整日志的路径

--归档online log 
alter system set LOG_ARCHIVE_DEST_1='LOCATION=/u01/app/oracle/arch/onlinelog/db VALID_FOR=(ONLINE_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=db';
--primary log 的链路
alter system set LOG_ARCHIVE_DEST_2='service=newdb LGWR ASYNC NOAFFIRM delay=0 optional compression=disable max_failure=0 max_connections=1 reopen=30 net_timeout=300 valid_for=(ONLINE_LOGFILES,PRIMARY_ROLE) db_unique_name=newdb';
--归档standby log ,也叫Foreign Archived Logs,逻辑备库接收到主库的日志,由于日志的DBID可能不一样,所以叫做外部归档日志,日志无法通过RMAN进行备份删除,
alter system set LOG_ARCHIVE_DEST_3='LOCATION=/u01/app/oracle/arch/standbylog/db VALID_FOR=(STANDBY_LOGFILES,STANDBY_ROLE) DB_UNIQUE_NAME=db';

        第一次开启复制

注意:由于之前的切换没有使用二阶段的方式,所以数据字典没有初始化,第一次开启需要使用NEW PRIMARY db_link_to_b的方式
---创建dblink,需要system用户级别的权限
create public database link new_prd
connect to system
identified by "oracle"
using 'newdb';
---开启同步
ALTER DATABASE START LOGICAL STANDBY APPLY IMMEDIATE NEW PRIMARY new_prd;

        如果想回切数据库到新环境,可以进行switchover回切到原环境(可选)

主库检查切换状态
--需要为TO STANDBY或者SESSIONS ACTIVE
SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE;
SWITCHOVER_STATUS
-----------------
TO STANDBY
主库执行切换逻辑备库前的准备prepare,表示当前主库即将切换为逻辑备库,准备接收LogMiner dictionary
SQL> ALTER DATABASE PREPARE TO SWITCHOVER TO LOGICAL STANDBY;
在备库(即将切换为主库)上执行prepare,初始化LogMiner dictionary,同时会启动日志传输,将日志发送到当前的主库以及其他备库,主库以及其他备库只接收,但不应用
SQL> ALTER DATABASE PREPARE TO SWITCHOVER TO PRIMARY; 
在备库(即将切换为主库)检查SWITCHOVER_STATUS的状态
--需要为PREPARING SWITCHOVER
SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE;
--逻辑备库V$DATABASE.SWITCHOVER_STATUS的状态为PREPARING DICTIONARY表示LogMiner dictionary正在redo strem准备
--逻辑备库V$DATABASE.SWITCHOVER_STATUS的状态为PREPARING SWITCHOVER表示LogMiner dictionary已经初始化完成
注意:如果prepare阶段出现问题,可以取消切换
a. 在主库执行取消prepare:
SQL> ALTER DATABASE PREPARE TO SWITCHOVER CANCEL;
b. 在备库执行取消prepare:
SQL> ALTER DATABASE PREPARE TO SWITCHOVER CANCEL;
验证主数据库是否接收了LogMiner dictionary,在没有LogMiner dictionary的情况下,切换无法继续,因为当前主数据库必须能够解析切换后新主数据库发送的redo记录。
--检查SWITCHOVER_STATUS,如果为TO LOGICAL STANDBY,表示已经接收完成,可以切换
SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE;
SWITCHOVER_STATUS
-----------------
TO LOGICAL STANDBY
主库切换为逻辑备库角色,会等待当前全部事务执行完成,并阻止其他会话的新生成事务
SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO LOGICAL STANDBY; 
在备库(即将切换为主库)检查是否为to primary 
SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE;SWITCHOVER_STATUS-----------------TO PRIMARY
在备库(即将切换为主库)正式切换为主库
SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY;
在新备库上执行日志应用:
SQL> ALTER DATABASE START LOGICAL STANDBY APPLY IMMEDIATE;

        方式三:旧环境作为物理备库升级为19c

        使用19c版本软件启动数据库到mount

​​startup mount

        恢复到闪回点pre_standby

flashback database to restore point  pre_standby;

        转化为物理备库角色

--当前还是逻辑备库角色
SQL> select database_role,open_Mode from v$database;
​
DATABASE_ROLE    OPEN_MODE
---------------- --------------------
LOGICAL STANDBY  MOUNTED
---转成物理standby ROLE
ALTER DATABASE CONVERT TO PHYSICAL STANDBY;

        执行日志应用操作

ALTER DATABASE RECOVER MANAGED STANDBY DATABASE  DISCONNECT FROM SESSION;
---会自动应用完日志,然后跳到下个incarnation日志
---此时如果出现这个报错
Managed Standby Recovery starting Real Time Apply
MRP0: Background Media Recovery waiting for new incarnation during transient logical upgrade procedure
要确认闪回点是否在备库convert to 逻辑备库之前,转化逻辑备库会生成一个新的incarnation,并在主库标致KCCDI2HMRP flag,这样在备库media recovery的时候,会主动
进行incarnation 切换,以应用新的incarnation日志

        打开物理备库

Alter database recover managed standby database cancel;
Alter database open read only;
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE  DISCONNECT FROM SESSION;

        如果想回切数据库到新环境,可以进行switchover回切到原环境(可选)

在主库执行切换检查,命令需要写明要切换的备库standby  
ALTER DATABASE SWITCHOVER TO standby_unique_name VERIFY;
--验证如果出现warning或者失败(ORA-16475: succeeded with warnings, check alert log for more details),需要通过后台alert日志确认检查不通过的原因,需要进行修复后重新执行检查
验证通过后,主库执行主备一键切换命令
ALTER DATABASE SWITCHOVER TO standby_unique_name;

        11 COMPATIBLE参数修改

        修改COMPATIBLE为19c,注意修改为19c之后无法再进行回退

ALTER SYSTEM SET COMPATIBLE = '19.0.0' SCOPE=SPFILE;
--重启数据库生效

相关文章:

Oracle-rolling upgrade升级19c

前言: 本文主要描述Oracle11g升19c rolling upgrade升级测试,通过逻辑DGautoupgrade方式实现rolling upgrade,从而达到在较少停机时间内完成Oracle11g升级到19c的目标 升级介绍: 升级技术: rolling upgrade轮询升级,通过采用跨版…...

Spring IOC详解

Spring 笔记 官网:https://spring.io/ 核心功能:当你的项目启动的时候,自动的将当前项目的各种 Bean 都自动的注册到 Spring 容器中,然后在项目的其他地方,如果需要用到这些 Bean,直接去 Spring 容器中查…...

Unity——DOTween插件使用方法简介

缓动动画既是一种编程技术,也是一种动画的设计思路。从设计角度来看,可以有以下描述 事先设计很多基本的动画样式,如移动、缩放、旋转、变色和弹跳等。但这些动画都以抽象方式表示,一般封装为程序函数动画的参数可以在使用时指定&…...

数据库——Redis 单线程模型详解

文章目录 Redis 基于 Reactor 模式来设计开发了自己的一套高效的事件处理模型 (Netty 的线程模型也基于 Reactor 模式,Reactor 模式不愧是高性能 IO 的基石),这套事件处理模型对应的是 Redis 中的文件事件处理器(file …...

leetcode 567. 字符串的排列(滑动窗口-java)

滑动窗口 字符串的排列滑动窗口代码演示进阶优化版 上期经典 字符串的排列 难度 -中等 leetcode567. 字符串的排列 给你两个字符串 s1 和 s2 ,写一个函数来判断 s2 是否包含 s1 的排列。如果是,返回 true ;否则,返回 false 。 换句…...

Git —— 分支重命名操作

在开发中,对某个分支进行重命名的操作: 1、本地分支重命名 本地分支是指:你当前这个分支还没有推送到远程的情况,这种情况修改分支名称就要方便很多 git branch -m 原始名称 新名称 //示例: 修改 test 为 newTest g…...

JavaIO流

JavaIO流 一、概念二、File类三、File类的使用1、File文件/文件夹类的创建2、File类的获取操作3、File类判断操作 - boolean4、File类对文件/文件夹的增删改5、File类的获取子文件夹以及子文件的方法 四、Java中IO流多种维度的维度1、按照流向 - Java程序2、按照流的大小分类3、…...

FlinkSql 如何实现数据去重?

摘要 很多时候flink消费上游kafka的数据是有重复的,因此有时候我们想数据在落盘之前进行去重,这在实际开发中具有广泛的应用场景,此处不说详细代码,只粘贴相应的flinksql 代码 --********************************************…...

机器学习概念

目录 一、人工智能、机器学习、深度学习的关系 二、什么是深度学习? 2.1 深度学习常用算法 一、人工智能、机器学习、深度学习的关系 人工智能、机器学习和深度学习的关系如下所示。 二、什么是深度学习? 深度学习( DL, Deep Learning) 是机器学习 …...

【数据结构】排序(插入、选择、交换、归并) -- 详解

一、排序的概念及其运用 1、排序的概念 排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。 稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记…...

游戏中的图片打包流程,免费的png打包plist工具,一款把若干资源图片拼接为一张大图的免费工具

手机游戏开发中,为了提高图片渲染性能,经常需要将小图片合并成一张大图进行渲染。如果手工来做的话就非常耗时。TexturePacker就是一款非常不错方便的处理工具。TexturePacker虽然非常优秀,但不是免费的。 对于打包流程,做游戏的…...

Springboot实现ENC加密

Springboot实现ENC加密 1、导入依赖2、配置加密秘钥&#xff08;盐&#xff09;3、获取并配置密文4、重启项目测试5、自定义前缀、后缀6、自定义加密方式 1、导入依赖 关于版本&#xff0c;需要根据spring-boot版本&#xff0c;自行修改 <dependency><groupId>co…...

nginx 托管vue项目配置

server {listen 80;server_name your_domain.com;location / {root /path/to/your/vue/project;index index.html;try_files $uri $uri/ /index.html;} }奇怪的现象,在vue路由中/会跳转到/abc/def&#xff0c;但如果直接输入/abc/def会显示404&#xff0c;添加 try_files $uri…...

Vue3中如何进行封装?—组件之间的传值

用了很久一段时间Vue3Ts了&#xff0c;工作中对一些常用的组件也进行了一些封装&#xff0c;这里对封装的一些方法进行一些简单的总结。 1.props传递 首先在主组件进行定义传值 <template><div>这里是主组件<common :first"first"></common&…...

实训笔记8.25

实训笔记8.25 8.25笔记一、Flume数据采集技术1.1 Flume实现数据采集主要借助Flume的组成架构1.2 Flume采集数据的时候&#xff0c;核心是编写Flume的采集脚本xxx.conf1.2.1 脚本文件主要由五部分组成 二、Flume案例实操2.1 采集一个网络端口的数据到控制台2.1.1 分析案例的组件…...

vue自定义监听元素宽高指令

在 main.js 中添加 // 自定义监听元素高度变化指令 const resizerMap new WeakMap() const resizeObserver new ResizeObserver((entries) > {for (const entry of entries) {const handle resizerMap.get(entry.target)if (handle) {handle({width: entry.borderBoxSiz…...

网络爬虫到底是个啥?

网络爬虫到底是个啥&#xff1f; 当涉及到网络爬虫技术时&#xff0c;需要考虑多个方面&#xff0c;从网页获取到最终的数据处理和分析&#xff0c;每个阶段都有不同的算法和策略。以下是这些方面的详细解释&#xff1a; 网页获取&#xff08;Web Crawling&#xff09;&#x…...

前端行级元素和块级元素的基本区别

块级元素和行内元素的基本区别是&#xff0c; 行内元素可以与其他行内元素并排&#xff1b;块级元素独占一行&#xff0c;不能与其他任何元素并列&#xff1b; 下面看一下&#xff1b; <!DOCTYPE html> <html> <head> <meta charset"utf-8"&…...

CentOS 7用二进制安装MySQL5.7

[rootlocalhost ~]# [rootlocalhost ~]# ll 总用量 662116 -rw-------. 1 root root 1401 8月 29 19:29 anaconda-ks.cfg -rw-r--r--. 1 root root 678001736 8月 29 19:44 mysql-5.7.40-linux-glibc2.12-x86_64.tar.gz [rootlocalhost ~]# tar xf mysql-5.7.40-linux-…...

华为加速回归Mate 60发布, 7nm全自研工艺芯片

华为于今天12:08推出“HUAWEI Mate 60 Pro先锋计划”&#xff0c;让部分消费者提前体验。在华为商城看到&#xff0c;华为Mate 60 pro手机已上架&#xff0c;售价6999元&#xff0c;提供雅川青、白沙银、南糯紫、雅丹黑四种配色供选择。 据介绍&#xff0c;华为在卫星通信领域…...

Linux系列讲解 —— 【systemd】下载及编译记录

Ubuntu18.04的init程序合并到了systemd中&#xff0c;本篇文章记录一下systemd的下载和编译。 1. 下载systemd源码 (1) 查看systemd版本号&#xff0c;用来确定需要下载的分支 sunsun-pc:~$ systemd --version systemd 237 PAM AUDIT SELINUX IMA APPARMOR SMACK SYSVINIT UT…...

u-view 的u-calendar 组件设置默认日期后,多次点击后,就不滚动到默认日期的位置

场景&#xff1a;uniapp开发微信小程序 vue2 uview版本&#xff1a;2.0.36 &#xff1b; u-calendar 组件设置默认日期后 我打开弹窗&#xff0c;再关闭弹窗&#xff0c; 重复两次 就不显示默认日期了 在源码中找到这个位置进行打印值&#xff0c;根据出bug前后的值进行…...

vue naive ui 按钮绑定按键

使用vue (naive ui) 绑定Enter 按键 知识点: 按键绑定Button全局挂载使得message,notification, dialog, loadingBar 等NaiveUI 生效UMD方式使用vue 与 naive ui将vue默认的 分隔符大括号 替换 为 [[ ]] <!DOCTYPE html> <html lang"en"> <head>…...

Viobot基本功能使用及介绍

设备拿到手当然是要先试一下效果的&#xff0c;这部分可以参考本专栏的第一篇 Viobot开机指南。 接下来我们就从UI开始熟悉这个产品吧&#xff01; 1.状态 设备上电会自动运行它的程序&#xff0c;开启了一个服务器&#xff0c;上位机通过连接这个服务器连接到设备&#xff0c…...

《PMBOK指南》第七版12大原则和8大绩效域

《PMBOK指南》第七版12大原则 原则1&#xff1a;成为勤勉、尊重和关心他人的管家 原则2&#xff1a;营造协作的项目团队环境 原则3&#xff1a;有效地干系人参与 原则4&#xff1a;聚焦于价值 原则5&#xff1a;识别、评估和响应系统交互 原则6&#xff1a;展现领导力行为…...

docker 启动命令

cd /ycw/docker docker build -f DockerFile -t jshepr:1.0 . #前面测试docker已经介绍过该命令下面就不再介绍了 docker images docker run -it -p 7003:9999 --name yyy -d jshepr:1.0 #上面运行报错 用这个 不报错就不用 docker rm yyy docker ps #查看项目日志 docker …...

C++ DAY7

一、类模板 建立一个通用的类&#xff0c;其类中的类型不确定&#xff0c;用一个虚拟类型替代 template<typename T> 类template ----->表示开始创建模板 typename -->表明后面的符号是数据类型&#xff0c;typename 也可以用class代替 T ----->表示数据类型…...

Vue2 使用插件 Volar 报错:<template v-for> key should be placed on the <template> tag.

目录 问题描述 版本描述 问题定位 问题解决 VS Code 插件地址 问题描述 在 VS Code 上使用插件 Volar 开发 Vue3 项目&#xff0c;然后去改 Vue2 项目时&#xff0c;对没有放在<template v-for> 元素上的 :key&#xff0c;会提示 <template v-for> key should…...

启动线程方法 start ()和 run ()有什么区别

在Java中,线程可以通过调用start()方法或者直接调用run()方法来执行。这两种方式有着重要的区别: start() 方法:当你调用线程的start()方法时,它会使线程进入就绪状态,等待系统调度。系统会为该线程分配资源,并在合适的时机执行线程的run()方法。实际上,start()方法会启…...

Java的全排列模板

c有全排列函数&#xff0c;我们Java没有&#xff0c;所以我们只能自己手写了。 模板一&#xff1a;&#xff08;不去重&#xff09; import java.util.ArrayList; import java.util.Random; import java.util.Scanner; public class liyunpeng {public static void main(Stri…...

读书笔记——《万物有灵》

前言 上一本书是《走出荒野》&#xff0c;太平洋步道女王提到了这本书《万物有灵》&#xff0c;她同样是看一点撕一点的阅读。我想&#xff0c;在她穿越山河森林&#xff0c;听见鸟鸣溪流的旅行过程中&#xff0c;是不是看这本描写动物有如何聪明的书——《万物有灵》&#xf…...

面试现场表现:展示你的编程能力和沟通技巧

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…...

34亿的mysql表如何优雅的扩字段长度兵并归档重建

业务背景&#xff1a; 该系统有一张表数据量已达到34亿&#xff0c;并且有个字段长度不够&#xff0c;导致很多数据无法插入。因为业务只要保留近2个月数据即可&#xff0c;所以需要接下来需要做2点&#xff1a;1&#xff0c;扩字段长度 2&#xff0c;只保留近2个月的数据。 …...

C#_进程单例模式.秒懂Mutex

什么是Mutex? 可以定义调用线程是否具有互斥性&#xff0c;程序创建者拥有控制权&#xff0c;相反只能引用程序。 参数1&#xff1a;如果是程序创建者&#xff0c;就获得控制权。 参数2&#xff1a;名称&#xff0c;可使用GUID生成。 参数3&#xff1a;out 返回值&#xf…...

AcWing 5050. 排序 (每日一题)

题目描述 给定一个长度为 n 的由小写字母构成的字符串。 请你按照 a∼z 的顺序&#xff0c;对字符串内的字符进行重新排序&#xff0c;并输出重新排序后的字符串。 输入格式 第一行包含整数 T &#xff0c;表示共有 T 组测试数据。 每组数据第一行包含整数 n 。 第二行包…...

【TypeScript】proxy 和 Reflect

proxy &#xff08;代理&#xff09; 和 Reflect &#xff08;反射&#xff09; 参数一样。 基本用法 let person { name: xx, age: 20} // proxy 支持对象&#xff0c;数组&#xff0c;函数&#xff0c;set&#xff0c;map // 代理对象的常用模式&#xff1a;前面一个对象&…...

STM32f103入门(5)定时器中断

STM32 TIM&#xff08;定时器/计数器&#xff09;模块的中断流程如下&#xff1a; 配置TIM寄存器&#xff1a;首先&#xff0c;通过配置TIM相关的寄存器来设置计时器的基本参数&#xff0c;例如预分频系数、计数模式、计数器周期等。 使能TIM中断&#xff1a;使用TIM_ITConfig函…...

Mybatis查询数据

上一篇我们介绍了在pom文件中引入mybatis依赖&#xff0c;配置了mybatis配置文件&#xff0c;通过读取配置文件创建了会话工厂&#xff0c;使用会话工厂创建会话获取连接对象读取到了数据库的基本信息。 如果您需要对上面的内容进行了解&#xff0c;可以参考Mybatis引入与使用…...

【前车之鉴】: 2023最新教程-将java程序打包到maven私服的正确打开方式,详细流程介绍不怕你掌握不了

文章目录 为什么看这篇整体流程1. 注册账号【首次需要】2. 工单申请【新项目必须】3. 项目配置【新项目必须】4. 授权认证【新项目必须】5. 一键发布 最后也很重要 为什么看这篇 一是当前网络上一些博客有遗漏部分&#xff0c;这里做补充&#xff0c;二是网上思路没错&#xff…...

如何理解IaaS、PaaS、SaaS?盘点受欢迎的八大SaaS平台!

如何理解IaaS、PaaS、SaaS&#xff1f;他们各自的优势在哪里&#xff1f;我们又应该如何选择&#xff1f;本篇将带大家深入浅出的了解IaaS、PaaS、SaaS&#xff0c;并为大家盘点2023最受欢迎的SaaS平台。 通过本文你将了解&#xff1a; IaaS、PaaS、SaaS分别是什么我们该如何理…...

立创EDA专业版的原理图上器件有一个虚线框

立创EDA专业版的原理图上器件有一个虚线框解决方法 问题分析&#xff1a; 在使用立创EDA专业版 设计电路原理图时&#xff0c;中途莫名其妙就给我的元件添加了下面图片所示的虚线外框。看着就很别扭的样子&#xff0c;而且工程大了和器件稍微布局比较密的时候就导致整体很难看…...

JUC并发编程--------基础篇

一、多线程的相关知识 栈与栈帧 我们都知道 JVM 中由堆、栈、方法区所组成&#xff0c;其中栈内存是给谁用的呢&#xff1f;其实就是线程&#xff0c;每个线程启动后&#xff0c;虚拟 机就会为其分配一块栈内存。 每个栈由多个栈帧&#xff08;Frame&#xff09;组成&#xf…...

秒懂算法2

视频链接 : 希望下次秒懂的是算法题_哔哩哔哩_bilibili P1094 [NOIP2007 普及组] 纪念品分组 原题链接 : [NOIP2007 普及组] 纪念品分组 - 洛谷 思路 : 排序 贪心 双指针首先先对输入进来的数组进行排序(由小到大)运用贪心的思想 : 前后结合,令l1,rn,若a[l]a[r]<w…...

隐秘的角落:Java连接Oracle提示Connection timed out

前言 这个报错相信各位后端开发都不陌生&#xff0c;大体的原因就那么几种&#xff1a; 检查网络连接&#xff1a;确保您的计算机与数据库服务器之间的网络连接正常。尝试通过其他方式验证您的网络连接是否正常。 检查数据库服务器状态&#xff1a;确保数据库服务器正在运行&…...

基于微信小程序的餐厅预订系统的设计与实现(论文+源码)_kaic

摘 要 随着消费升级&#xff0c;越来越多的年轻人已经开始不再看重餐饮等行业的服务&#xff0c;而是追求一种轻松自在的用餐、购物环境。因此&#xff0c;无人餐厅、无人便利店、无人超市等一些科技消费场所应势而生。餐饮企业用工荒已成为不争的事实。服务员行业的低保障、低…...

科技政策 | 四川省科学技术厅关于发布2024年第一批省级科技计划项目申报指南的通知

原创 | 文 BFT机器人 近日&#xff0c;四川省科学技术厅发布了2024年第一批省级科技计划项目申报指南&#xff1b;其中包括自然科学基金项目、重点研发计划、科技成果转移转化引导计划、科技创新基地&#xff08;平台&#xff09;和人才计划。 01 自然科学基金项目 实施周期 …...

深入了解Webpack:特性、特点和结合JS混淆加密的实例

Webpack是现代前端开发中最受欢迎的构建工具之一&#xff0c;其强大的特性和灵活性使得开发者能够更有效地管理和优化项目资源。在本文中&#xff0c;我们将深入探讨Webpack的特性和特点&#xff0c;并结合实例演示如何使用Webpack与JS混淆加密相结合。Webpack的特性和特点 1.…...

2023-08-23力扣每日一题

链接&#xff1a; 1782. 统计点对的数目 题意&#xff1a; 给n个点和m条无向边&#xff08;可重复&#xff09;&#xff0c;q个查询 定义edge[a]为一个点是a的边数量&#xff0c;定义ret[a,b]是edge[a]edge[b]-&#xff08;a与b的边&#xff09; q个查询q个答案&#xff0…...

分发饼干【贪心算法】

分发饼干 假设你是一位很棒的家长&#xff0c;想要给你的孩子们一些小饼干。但是&#xff0c;每个孩子最多只能给一块饼干。 对每个孩子 i&#xff0c;都有一个胃口值 g[i]&#xff0c;这是能让孩子们满足胃口的饼干的最小尺寸&#xff1b;并且每块饼干 j&#xff0c;都有一个…...

为什么网络互联地址设置为30位地址

对于点对点链路&#xff0c;为了节约IPv4地址&#xff0c;一般为其分配/30地址块&#xff0c;这样包含4个地址&#xff1a;最小地址作为网络地址&#xff0c;最大地址作为广播地址&#xff0c;剩余两个可分配地址&#xff0c;分配给链路两端的接口&#xff0c;这是最普遍的方法…...