Oracle单实例迁移到RAC实例
ccwgpt 2024-12-04 12:00 100 浏览 0 评论
Oracle单实例迁移到RAC实例
将Oracle 单实例迁移到 RAC 实例上有两种方法:
1. 使用RMAN 复制
2. 使用逻辑导出导入(exp/imp) 或者 数据泵(expdp/impdp)
Oracle单实例迁移到RAC实例--使用RMAN 异机恢复
一. 大致操作步骤流程如下:
1. 安装Clusterware 和 ASM 实例
2. 备份源库,并将备份集copy到rac 节点上
3. 在RAC 上还原并修改初始化参数文件,还原控制文件和数据文件
4. 增加undo 表空间和redo log 线程组,创建密钥文件
5. 配置RAC监听
6. 将数据库等资源添加到CRS
注意: 迁移的2个db版本版本要一致。包括小版本。 比如10.2.0.4.0.
测试的时候是从10.2.0.5.0 迁移到10.2.0.5.0
Redhat 5.4 Orcle RAC 数据库 从10.2.0.1升级到 10.2.0.5
二. 具体操作步骤
2.1 安装Clusterware 和ASM 实例
上述安装相信能阅读小子此文档的诸位此能力已然具备,所以不再赘述。
附图参考:
2.1.1 运行DBCA 命令
[oracle@rac1 ~]$ dbca
2.1.2 选择 configure Automatic Storage Management, 来创建ASM 实例
2.1.3 选择所有结点
2.1.4 输入密码:RAC 的spfile 必须放在共享目录下。参数文件我们选择第一个initialization parameter。 也可以放在我们建的裸设备上。
2.1.5 ASM 实例创建完后,用Create New 来创建ASM 磁盘组。我们用DATA来创建一个DATA 组,FRA 创建FLASH_RECOVERY_AREA组。
注: Redundancy 一般选external 就是也就是不考虑冗余,假如选normal 则是mirror, 至少要一个FailGroup. 选High 就是triple mirror,3倍镜像,需要三个FailGroup。
2.1.6 创建完成后,能看到组的状态是Mount, ASM 组必须mount之后才能使用。
在这里,如果asm 服务必须要启动。如果没有启动,就手动启动它。
安装之后的进程如下:
[oracle@rac1 ~]$ crs_stat -t
集群监听状态查看:
[oracle@rac1 ~]$ lsnrctl status
2.2 在源库用RMAN 备份,并将备份文件copy到rac上
注意:保持单实例和RAC数据库SID一致(SID为db10g)
rman备份之前,单实例数据库为归档模式(archilve log list 来查看)
若未归档用:startup mount;
alter database archivelog; 改到归档模式
RAC上已经安装CRS以及ORACLE软件但未建库
2.2.1备份全库:
[oracle@singledb ~]$ rman target /
RMAN> list backup;
using target database control file instead of recovery catalog
RMAN> run {
2> backup full database format '/orabk/full_%d_%T_%U.bak';
3> backup archivelog all format '/orabk/arc_%U.bak' delete input;
4> copy current controlfile to '/orabk/control_bak.ctl';
5> }
备份之后的信息如下:
RMAN> list backup summary;
[oracle@db10g orabk]$ ls -l
2.2.1将备份文件SCP 到RAC 服务器:
[oracle@singledb orabk]$ scp * 192.168.10.101:/orabk
2.3 还原并修改初始化文件
2.3.1 还原spfile 到pfile(可复制、创建、RMAN恢复等)
[oracle@rac1 ~]$ export ORACLE_SID=db10g1
[oracle@rac1 ~]$ rman target /
RMAN> startup nomount
RMAN> restore spfile to pfile '/u01/app/oracle/product/10.2.0/db_1/dbs/initdb10g1.ora'
2> from '/orabk/full_DB10G_20130516_02o9pjb1_1_1.bak ';
查看刚才恢复的参数文件:
[oracle@rac1 ~]$ cd /u01/app/oracle/product/10.2.0/db_1/dbs
[oracle@rac1 dbs]$ ls
[oracle@rac1 dbs]$ cat initdb10g1.ora
这里面都是单实例的参数,需要把这个改成RAC的参数。
2.3.2 查看ASM 实例的相关目录信息
[oracle@rac1 ~]$ export ORACLE_SID=+ASM1
[oracle@rac1 ~]$ sqlplus / as sysdba
SYS@+ASM1(rac1)> col state format a10
SYS@+ASM1(rac1)> col name format a15
SYS@+ASM1(rac1)> col failgroup format a20
SYS@+ASM1(rac1)> set line 200
SYS@+ASM1(rac1)> select state,redundancy,total_mb,free_mb,name,failgroup from v$asm_disk;
SYS@+ASM1(rac1)> select group_number,name,state,type,total_mb,free_mb,unbalanced from v$asm_diskgroup;
2.3.3 在ASM下创建目录
[oracle@rac1 ~]$ export ORACLE_SID=+ASM1
[oracle@rac1 ~]$ asmcmd
创建的目录结构如下:
DATA/
RAC/
CONTROLFILE/
DATAFILE/
TEMPFILE/
ONLINELOG/
PARAMETERFILE/
FRA/
RAC/
ARCHIVELOG
2.3.4 创建系统目录(2个节点)
[oracle@rac1 ~]$ cd $ORACLE_BASE/admin
[oracle@rac1 admin]$ ls
+ASM
[oracle@rac1 admin]$ mkdir db10g
[oracle@rac1 admin]$ cd db10g
[oracle@rac1 db10g]$ mkdir adump bdump cdump dpdump hdump pfile udump
[oracle@rac1 db10g]$ ll
2.3.5 修改初始化参数
注意事项:
(1)RMAN 异机恢复的db_name 必须和备份的一致,如果说想改成其他名称,可以等还原之后,再用nid 命令修改。
(2)控制文件需要指定到共享设备上
(3)检查audit_file_dest、background_dump_dest、core_dump_dest、log_archive_dest_1、user_dump_dest等参数的位置。如果2个节点和共享位置没有对应的目录,先把目录建好。
最终修改之后的pfile 文件如下:
[oracle@rac1 db10g]$ cd $ORACLE_HOME/dbs
[oracle@rac1 dbs]$ cat initanqing.ora
db10g.__db_cache_size=188743680
db10g.__java_pool_size=4194304
db10g.__large_pool_size=4194304
db10g.__shared_pool_size=79691776
db10g.__streams_pool_size=0
*.audit_file_dest='/u01/app/oracle/admin/db10g/adump'
*.background_dump_dest='/u01/app/oracle/admin/db10g/bdump'
*.cluster_database_instances=2
*.cluster_database=true
*.compatible='10.2.0.5.0'
*.control_files='+DATA/RAC/CONTROLFILE/control01.ctl','+DATA/RAC/CONTROLFILE /control02.ctl','+DATA/RAC/CONTROLFILE /control03.ctl'
*.core_dump_dest='/u01/app/oracle/admin/db10g/cdump'
*.db_block_size=8192
*.db_create_file_dest='+DATA'
*.db_domain=''
*.db_file_multiblock_read_count=16
*.db_name='db10g'
*.db_recovery_file_dest='+FRA'
*.db_recovery_file_dest_size=2147483648
*.dispatchers='(PROTOCOL=TCP) (SERVICE=racXDB)'
db10g1.instance_name='anqing1'
db10g2.instance_name='anqing2'
db10g1.instance_number=1
db10g2.instance_number=2
*.job_queue_processes=10
*.log_archive_dest_1='LOCATION==+FRA/RAC/ARCHIVELOG'
*.log_archive_format='%t_%s_%r.arc'
*.open_cursors=300
*.pga_aggregate_target=94371840
*.processes=150
*.remote_login_passwordfile='EXCLUSIVE'
*.sga_target=283115520
db10g1.thread=1
db10g2.thread=2
*.undo_management='AUTO'
db10g1.undo_tablespace='UNDOTBS1'
db10g2.undo_tablespace='UNDOTBS1'
*.user_dump_dest='/u01/app/oracle/admin/db10g/udump'
2.3.6 用修改的pfile 来创建spfile,注意放在共享设备上
[oracle@rac1 ~]$ export ORACLE_SID=db10g1
[oracle@rac1 ~]$ sqlplus / as sysdba
SQL> create spfile='+DATA/RAC/PARAMETERFILE/spfiledb10g.ora'
2 from
3 pfile='/u01/app/oracle/product/10.2.0/db_1/dbs/initdb10g1.ora';
到ASM里验证一下:
ASMCMD> pwd
+DATA/RAC/PARAMETERFILE
ASMCMD> ls
spfiledb10g.ora
在所有节点上,修改pfile内容,将其指向共享设备上的spfile:
[oracle@rac1 ~]$ echo "SPFILE='+DATA/RAC/PARAMETERFILE/spfiledb10g.ora'" > /u01/app/oracle/product/10.2.0/db_1/dbs/initdb10g1.ora
[oracle@rac1 ~]$ cd $ORACLE_HOME/dbs
[oracle@rac1 dbs]$ cat initdb10g1.ora
SPFILE='+DATA/RAC/PARAMETERFILE/spfiledb10g.ora'
2.4 创建口令文件
在所有节点执行:
[oracle@rac1 ~]$ orapwd file=$ORACLE_HOME/dbs/orapwdb10g1 password=oracle
[oracle@rac2 ~]$ orapwd file=$ORACLE_HOME/dbs/orapwdb10g2 password=oracle
2.5 还原控制文件
在其中一个节点上执行。
2.5.1 用spfile,将DB 启动到nomount 状态
[oracle@rac1 dbs]$ sqlplus / as sysdba
SQL> startup nomount;
SQL> show parameter spfile
2.5.2 RMAN 执行对控制文件的恢复
[oracle@rac1 dbs]$ rman target /
RMAN> restore controlfile from '/orabk/control_bak.ctl ';
这个位置是在初始化参数里指定的,到ASM 实例里验证下:
ASMCMD> cd DATA/rac/controlfile
ASMCMD> ls
control01.ctl
control02.ctl
control03.ctl
2.6 restore数据库
在其中一个节点执行
2.6.1 将数据库启动到MOUNT状态
RMAN> alter database mount;
2.6.2 查看源库数据文件存储位置信息
注意一点,单实例和RAC 实例存储数据文件的位置不同,如果使用rman 的duplicate,那么使用log_file_name_convert 和 db_file_name_convert来进行转换,在这个实验中,使用的是RMAN的异机恢复,所以只能在restore的时候用set newname来进行转换。
SQL> col file_id format 9
SQL> col file_name format a30
SQL> select file_id,file_name from dba_data_files;
SQL> select file_id,file_name from dba_temp_files;
2.6.3 在RAC上restore 数据文件
RMAN> run {
2> set newname for datafile 1 to '+DATA/rac/DATAFILE/system01.dbf';
3> set newname for datafile 2 to '+DATA/rac/DATAFILE/undotbs01.dbf';
4> set newname for datafile 3 to '+DATA/rac/DATAFILE/sysaux01.dbf';
5> set newname for datafile 4 to '+DATA';
6> set newname for tempfile 1 to '+DATA/rac/TEMPFILE/temp01.dbf';
7> restore database;
8> switch datafile all;
9> switch tempfile all;
10> }
-- 从这里可以看到,对tempfile 仅仅是rename:即更新控制文件。
注意:
(1)datafile 3 和 4的区别,datafile 4 我没有指定具体的文件名,那么在还原时会使用ASM 自己的命名方式来命名datafile 4. 其他的文件会创建别名。
(2)对switch的说明:
对于nocatalog 模式下,rman备份的信息是保存在控制文件里的,包括文件的路径信息。 这里的switch的作用,就是更新控制文件里的信息。
(3)restore 的时候不会对temp 表空间进行restore。所以等restore 之后,需要手工创建temp表空间。
不过在这个测试里,还是对tempfile 进行了指定。 但是这个操作只更新控制文件,不恢复数据文件。
到ASM 实例里查看一下:
ASMCMD> cd db10g/datafile
ASMCMD> pwd
+DATA/db10g/datafile
ASMCMD> ls
SYSAUX.262.815794931
SYSTEM.260.815794931
UNDOTBS1.261.815794931
USERS.263.815794933
ASMCMD> ls -l
Type Redund Striped Time Sys Name
DATAFILE UNPROT COARSE MAY 19 01:00:00 Y SYSAUX.262.815794931
DATAFILE UNPROT COARSE MAY 19 01:00:00 Y SYSTEM.260.815794931
DATAFILE UNPROT COARSE MAY 19 01:00:00 Y UNDOTBS1.261.815794931
DATAFILE UNPROT COARSE MAY 19 01:00:00 Y USERS.263.815794933
-- 映射别名
ASMCMD> cd ../..
ASMCMD> cd rac/tempfile
ASMCMD> ls
--tempfile 对应的目录为空,即没有恢复数据文件。
2.7 recover 数据库
在执行restore的节点执行,因为备份文件在该节点上。
RMAN> recover database;
最后一行的错误说明:
RMAN-06054: media recovery requesting unknown log: thread 1 seq 12 lowscn 206051
这里是提醒恢复到一个未知的scn号。在alter database mount之后,通过set until scn或者set until time命令设置恢复到的scn号或时间,就可以避免这个错误。
2.8 处理online redo
因为此时另一个节点还没有配好,所以我们只能在执行恢复的节点上处理redo。
SYS@db10g1(rac1)> set wrap off;
SYS@db10g1(rac1)> select * from v$logfile;
SYS@db10g1(rac1)>alter database rename file '/oradata/db10g/redo01.log' to '+DATA/rac/onlinelog/redo01.log';
SYS@db10g1(rac1)> alter database rename file '/oradata/db10g/redo02.log' to '+DATA/rac/onlinelog/redo02.log';
SYS@db10g1(rac1)> alter database rename file '/oradata/db10g/redo03.log' to '+DATA/rac/onlinelog/redo03.log';
SYS@db10g1(rac1)> select * from v$logfile;
ASMCMD> pwd
+DATA/rac/onlinelog
ASMCMD> ls
注意这个时候,对应目录还是空的,当open db 的时候,oracle 会自动创建online redo log。这里修改的目的就是改变online redo 的位置。
2.9 open resetlogs 打开DB
在恢复的节点执行该操作。
SYS@db10g1(rac1)> alter database open resetlogs;
SYS@db10g1(rac1)> select name,open_mode from v$database;
SYS@db10g1(rac1)> col comp_name for a35
SYS@db10g1(rac1)> col version for a15
SYS@db10g1(rac1)> col status for a10
SYS@db10g1(rac1)> select comp_name,version,status from sys.dba_registry;
2.10检查并修改几个初始化参数
SYS@db10g1(rac1)> col parameter for a30
SYS@db10g1(rac1)> col value for a10
SYS@db10g1(rac1)> select * from v$option where parameter = 'Real Application Clusters';
SYS@db10g1(rac1)> show parameter cluster
SYS@db10g1(rac1)> show parameter thread
SYS@db10g1(rac1)> show parameter instance_number
由上述返回结果可知,RAC特性是支持的,如果尚未启用集群数据库,接下来首先要改的,就是enable CLUSTER DATABASE,操作如下:
SYS@db10g1(rac1)> alter system set cluster_database=true scope=spfile;
修改2个节点的配置参数:
SYS@db10g1(rac1)> alter system set cluster_database_instances=2 scope=spfile;
SYS@db10g1(rac1)> alter system set instance_number=1 scope=spfile sid='db10g1';
SYS@db10g1(rac1)> alter system set instance_number=2 scope=spfile sid='db10g2';
SYS@db10g1(rac1)> alter system set thread=1 scope=spfile sid='db10g1';
SYS@db10g1(rac1)> alter system set thread=2 scope=spfile sid='db10g2';
2.11创建节点2的undo 表空间
SYS@db10g1(rac1)> col name for a10
SYS@db10g1(rac1)> col type for a10
SYS@db10g1(rac1)> col value for a10
SYS@db10g1(rac1)> show parameter undo_tablespace
这个是rac1上节点的信息,在之前的在spfile参数指定的rac2节点的undo 空间是UNDOTBS2。所以这里创建该undo 表空间,并指定相关参数。
SYS@anqing1(rac1)> create undo tablespace UNDOTBS2 datafile '+DATA/rac/datafile/undotbs02.dbf' size 500m;
Tablespace created.
--这里直接指定别名
ASMCMD> pwd
+DATA/rac/datafile
ASMCMD> ls
sysaux01.dbf
system01.dbf
undotbs01.dbf
undotbs02.dbf
ASMCMD> pwd
+DATA/db10g/datafile
ASMCMD> ls
SYSAUX.262.815794931
SYSTEM.260.815794931
UNDOTBS1.261.815794931
UNDOTBS2.268.815805971
USERS.263.815794933
SYS@anqing1(rac1)> alter system set undo_tablespace='UNDOTBS2' scope=spfile sid='db10g2';
System altered.
2.12添加rac2 节点的redo 文件
rac 的redo 是接其他节点来的,我们之前的rac1上已经有3组,所以我们这里从4开始,在添加2组给rac2,使用thread 2.
SYS@db10g1(rac1)> alter database add logfile thread 2 group 4 '+DATA' size 100m;
Database altered.
SYS@db10g1(rac1)> alter database add logfile thread 2 group 5 '+DATA' size100m;
Database altered.
SYS@db10g1(rac1)> alter database enable thread 2;
Database altered.
2.13重启节点1和节点2 上的实例,使相关参数生效
节点1:
SYS@db10g1(rac1)> shutdown immediate
SYS@db10g1(rac1)> startup
SYS@db10g1(rac1)> show parameter cluster
节点2:
[oracle@rac2 dbs]$ sqlplus / as sysdba
SQL> startup
SQL> show parameter cluster
最后确认:
SYS@db10g1(rac1)> select instance_number,instance_name,host_name from gv$instance;
到现在已经是集群了,不过还有一些收尾的工作要做。
2.14执行catclust.sql脚本来创建相关视图
SYS@anqing1(rac1)> @$ORACLE_HOME/rdbms/admin/catclust.sql
2.15 重建Temp 表空间
步骤如下:
SYS@db10g1(rac1)> select name from v$tempfile;
SYS@db10g1(rac1)> alter tablespace temp
add tempfile '+DATA/rac/tempfile/temp02.dbf' size 100M;
SYS@db10g1(rac1)> alter database tempfile
'+DATA/anqing/tempfile/temp01.dbf' offline;
SYS@anqing1(rac1)> alter database tempfile
'+DATA/anqing/tempfile/temp01.dbf' drop including datafiles;
SYS@anqing1(rac1)> select name from v$tempfile;
2.16 添加集群的监听
2.17添加信息注册到CRS
[oracle@rac1 ~]$ srvctl add database -d db10g -o $ORACLE_HOME -p +DATA/ANQING/PARAMETERFILE/spfileanqing.ora
[oracle@rac1 ~]$ srvctl add instance -d db10g -i db10g1 -n rac1
[oracle@rac1 ~]$ srvctl add instance -d db10g -i db10g2 -n rac2
修改instance 和 asm 之间的依赖关系:
[oracle@rac1 ~]$ srvctl modify instance -d db10g -i db10g1 -s +ASM1
[oracle@rac1 ~]$ srvctl modify instance -d db10g -i db10g2 -s +ASM2
查看:
[oracle@rac1 ~]$ crs_stat -t
这里并没有启动,因为服务是刚添加上来的,还没有同步。启动一下就ok了。
[oracle@rac1 ~]$ srvctl start database -d db10g
启动之后再来查,各个进程正常:
[oracle@rac1 ~]$ crs_stat -t
Oracle单实例迁移到RAC实例--使用导出导入方法
详细见之前的Oracle-备份与恢复(一)expdp/impdp详解。
相关推荐
- VUE3前端开发入门系列教程二:使用iView框架辅助开发
-
1、安装iView新框架,支持VUE3npminstallview-ui-plus2、编辑src/main.js,添加以下内容,导入js和css到项目importViewUIPlusfrom...
- 万能前端框架uni app初探03:底部导航开发
-
前言本节我们使用uniapp的底部导航功能,点击不同tab会显示不同页面,这个功能在实际项目开发中几乎是必备的。一、基础知识1.tabBar如果应用是一个多tab应用,可以通过tabBar配...
- Rust Web 开发框架,前端你可以选择哪个?
-
Rust构建一切。在如今流行的语言中,Rust可谓是将构建和高效作为自己优美的身姿在大众视野中脱颖而出。它是一门赋予每个人构建可靠且高效软件能力的语言。它有什么特性呢?高性能。Rust速度惊人且内...
- 连载:前端开发中纠结的Javascript框架(上)
-
如今,前端开发有着许许多多的框架和库。其中一些好用,一些却不尽人意。通常我们会习惯性运用某一概念,模块或句法。事实上,并没有什么万能工具。这篇文章是关于未来框架的发展趋势——那就是没有框架!我从以下几...
- 前端开发框架的演进架构:提升用户体验和开发效率
-
前端开发框架是现代Web应用开发的重要工具,它不仅可以帮助开发者构建复杂的用户界面,还能够提升用户体验和开发效率。随着Web技术的不断发展,前端开发框架也在不断演进,为开发者提供了更丰富、更高效的工具...
- Google应用Mesh-TensorFlow框架,让CNN也能处理超高分辨率图像
-
为了要处理超高分辨率医疗图像数据,Google开发了一种空间数据分区(SpatialPartition)技术,在不牺牲图像分辨率的条件下,分析超高分辨率图像。Google使用Mesh-TensorF...
- 大模型安全挑战加剧:框架层漏洞成新靶心
-
近日,360数字安全集团发布了一份关于大模型安全漏洞的报告,揭示了当前大模型及围绕其构建的框架和应用中存在的严重安全问题。报告显示,360近期研究发现了近40个大模型相关的安全漏洞,其中既包括二进制内...
- Keras 3.0正式发布:可用于TensorFlow、JAX和PyTorch
-
机器之心报道编辑:陈萍经过5个月的更新迭代,Keras3.0终于来了。「大新闻:我们刚刚发布了Keras3.0版本!」Keras之父FrancoisChollet在X上激动的...
- TensorFlow和Keras入门必读教程(tensorflow与keras版本对应)
-
导读:本文对TensorFlow的框架和基本示例进行简要介绍。作者:本杰明·普朗什(BenjaminPlanche)艾略特·安德烈斯(EliotAndres)来源:华章科技01TensorFlo...
- 谷歌官方回应“TensorFlow遭弃”:还在投资开发,将与JAX并肩作战
-
鱼羊发自凹非寺量子位|公众号QbitAI终于,谷歌出面回应“TensorFlow遭弃”传闻:我们将继续致力于将TensorFlow打造为一流机器学习平台,与JAX并肩推动机器学习研究。这段时...
- 2025 年的PHP :现代 Web 开发的强大引擎
-
程序员还在吐槽PHP过时?2025年的PHP8.4直接封神了。看看最近更新的属性钩子、强类型系统,加上Laravel这些框架,老语言早就脱胎换骨。十年前说PHP弱类型容易崩代码的,现在脸疼不?联合类...
- 前端内卷终结者?htmx如何让开发者告别200行JS只做一个按钮
-
当你用React写一个点赞按钮需要引入3个状态管理库、编写80行JSX和120行钩子函数时,htmx只需要一行HTML:<buttonhx-post="/like"hx-sw...
- NativePHP桌面版V1.0正式发布(元气桌面电脑版下载)
-
导读:各位小伙伴,使用PHP构建桌面级系统的利器,NativePHP来了。概述NativePHP是一个用于使用PHP构建桌面应用的框架。它允许PHP开发人员使用熟悉的工具和技术创建跨平台的原生应用...
- PHP Laravel框架底层机制(php基本框架)
-
当然可以,Laravel是最受欢迎的PHP框架之一,以优雅的语法和丰富的生态而闻名。尽管开发体验非常“高端”,它的底层其实是由一系列结构清晰、职责分明的组件构成的。下面我从整体架构、核心流程、...
- PHP框架之Laravel框架教程:2. 控制器、路由、视图简单介绍
-
2.控制器、路由、视图简单介绍我们先建立控制器,目录是:app/Http/Controllers,新建控制器Ding.php,代码如下:Ding.php:<?phpnamespaceA...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- VUE3前端开发入门系列教程二:使用iView框架辅助开发
- 万能前端框架uni app初探03:底部导航开发
- Rust Web 开发框架,前端你可以选择哪个?
- 连载:前端开发中纠结的Javascript框架(上)
- 前端开发框架的演进架构:提升用户体验和开发效率
- Google应用Mesh-TensorFlow框架,让CNN也能处理超高分辨率图像
- 大模型安全挑战加剧:框架层漏洞成新靶心
- Keras 3.0正式发布:可用于TensorFlow、JAX和PyTorch
- TensorFlow和Keras入门必读教程(tensorflow与keras版本对应)
- 谷歌官方回应“TensorFlow遭弃”:还在投资开发,将与JAX并肩作战
- 标签列表
-
- 框架图 (58)
- flask框架 (53)
- quartz框架 (51)
- abp框架 (47)
- jpa框架 (47)
- springmvc框架 (49)
- 分布式事务框架 (65)
- scrapy框架 (56)
- shiro框架 (61)
- 定时任务框架 (56)
- java日志框架 (61)
- JAVA集合框架 (47)
- mfc框架 (52)
- abb框架断路器 (48)
- beego框架 (52)
- java框架spring (58)
- grpc框架 (65)
- tornado框架 (48)
- 前端框架bootstrap (54)
- orm框架有哪些 (51)
- ppt框架 (48)
- 内联框架 (52)
- cad怎么画框架 (58)
- ssm框架实现登录注册 (49)
- oracle字符串长度 (48)