本文描述如何创建一个逻辑备用数据库,包括以下主题:
创建逻辑备用数据库的准备工作
创建逻辑备用数据库
更多的准备
1、创建逻辑备用数据库的准备工作
在你创建备用数据库之前,你需要首先确保主数据库的配置是正确的。
1.1确定对于表的数据类型和存储参数的支持
在建立逻辑备用数据库之前,确保逻辑备用数据库可以维护你主数据中的数据类型和表。
下列表显示了逻辑备用数据库支持的何不支持的多种数据库对象
Supported Datatypes and Storage Attributes for Tables
CHAR
NCHAR
VARCHAR2 and VARCHAR
NVARCHAR2
NUMBER
DATE
TIMESTAMP
TIMESTAMP WITH TIME ZONE
TIMESTAMP WITH LOCAL TIME ZONE
INTERVAL YEAR TO MONTH
INTERVAL DAY TO SECOND
RAW
CLOB (including both fixed-width and variable-width character sets)
NCLOB
BLOB
LONG
LONG RAW
BINARY_FLOAT
BINARY_DOUBLE
Index-organized tables (without overflows and without LOB columns)
Unsupported Datatypes
BFILE
ROWID
UROWID
user-defined types
object types REFs
varrays
nested tables
XMLType
不支持的表,序列,视图
多数传输的的方案被sql apply跳过
带有不支持的数据类型的表
使用表压缩的表
要确定哪些方案会被跳过,查询DBA_LOGSTDBY_SKIP视图
要确定是否主库包含部支持的对象,查询DBA_LOGSTDBY_UNSUPPORTED视图
在你创建逻辑备用数据库前验证主库不支持的数据库对象是很重要的。因为对于不支持的对象的修改不会传播到逻辑备用数据库。而且,也不会返回错误消息。
例如,在主库使用下面的查询列出主数据库表中逻辑数据库不支持的表的方案名和表名:
SQL> SELECT DISTINCT OWNER,TABLE_NAME FROM DBA_LOGSTDBY_UNSUPPORTED
2> ORDER BY OWNER,TABLE_NAME;
OWNER TABLE_NAME
----------- --------------------------
HR COUNTRIES
OE ORDERS
OE CUSTOMERS
OE WAREHOUSES
查询列名和数据类型
SQL> SELECT COLUMN_NAME,DATA_TYPE FROM DBA_LOGSTDBY_UNSUPPORTED
2> WHERE OWNER='OE' AND TABLE_NAME = 'CUSTOMERS';
COLUMN_NAME DATA_TYPE
------------------------------- -------------------
CUST_ADDRESS CUST_ADDRESS_TYP
PHONE_NUMBERS PHONE_LIST_TYP
CUST_GEO_LOCATION SDO_GEOMETRY
如果主数据库包含不支持的表,当应用日志数据时,日志应用服务自动排除这些表
1.1.1在逻辑备用数据库跳过的sql语句
默认情况下,除了下面列出的所有sql语句,如果它们在主数据库被执行,都会被逻辑备用数据库应用:
ALTER DATABASE
ALTER SESSION
ALTER MATERIALIZED VIEW
ALTER MATERIALIZED VIEW LOG
ALTER SYSTEM
CREATE CONTROL FILE
CREATE DATABASE
CREATE DATABASE LINK
CREATE PFILE FROM SPFILE
CREATE SCHEMA AUTHORIZATION
CREATE MATERIALIZED VIEW
CREATE MATERIALIZED VIEW LOG
CREATE SPFILE FROM PFILE
DROP DATABASE LINK
DROP MATERIALIZED VIEW
DROP MATERIALIZED VIEW LOG
EXPLAIN
LOCK TABLE
SET CONSTRAINTS
SET ROLE
SET TRANSACTION
1.1.2支持的类型和操作
不修改系统元数据或者用户数据的Oracle PL/SQL支持包可以安全的被主数据库使用,例如DBMS_OUTPUT, DBMS_RANDOM, DBMS_PIPE, DBMS_DESCRIBE, DBMS_OBFUSCATION_TOOLKIT, DBMS_TRACE, DBMS_METADATA,不修改系统元数据,修改用户数据的Oracle PL/SQL包,只要修改的数据是支持的数据类型的,可以被sql apply 支持,例如DBMS_LOB, DBMS_SQL, DBMS_TRANSACTION。
修改系统元数据的Oracle PL/SQL包,因为sql apply 不支持元数据的修改,所以这些改动对于逻辑备用数据库是不可见的。例如DBMS_JAVA, DBMS_REGISTRY, DBMS_ALERT, DBMS_SPACE_ADMIN, DBMS_REFRESH, DBMS_SCHEDULER, DBMS_AQ
对于DBMS_JOB,提供了特殊的支持。在逻辑备用数据库,作业是暂停的,并且不能直接创建。但是,在主库提交的作业会被复制到备库,在switchover或者failover之后,新主库的作业会自动开始运行。
1.2确保主库中的表行能被唯一标志
因为ROWID在主库和从库中可能不一致,所以必须使用一个不同的机制来匹配主库更新的行与它在从库中对应的行。你可以使用以下方法来匹配对应行:
主键
唯一索引
oracle建议你给主库的表增加主键和唯一性约束,确保sql apply可以有效地对逻辑备用数据库应用修改。
完成以下步骤:
第一步,在主库中找到没有唯一标志的表。
查询DBA_LOGSTDBY_NOT_UNIQUE视图来显示表中没有主键或者表中的唯一索引中存在有非空列的表:
SQL> SELECT OWNER, TABLE_NAME,BAD_COLUMN FROM DBA_LOGSTDBY_NOT_UNIQUE
2> WHERE TABLE_NAME NOT IN (SELECT TABLE_NAME FROM DBA_LOGSTDBY_UNSUPPORTED);
由于supplemental logging,以上查询显示的一些表也可以被支持。
BAD_COLUMN列的值可以是Y或N
Y,表示一个表列被使用大数据类型定义,例如CLOB或BLOB。sql apply尝试维护这些表,但是你必须要保证表中除这列外的其他列的单值性。就是说,注意,如果一个表中有两行除了LOB列外,其他的值完全相同,这样表的改动就不能被逻辑备用数据库应用,sql apply会停止。
N,表示表中包含足够的列信息,需要用来在逻辑备用数据库中维护表的
第二步,增加一个非激活依赖约束
如果你的应用可以保证表中行的唯一性,你可以创建一个非激活依赖的主键约束:
SQL> ALTER TABLE mytab ADD PRIMARY KEY (id, name) RELY DISABLE;
RELY约束告诉系统假定行是唯一的。
2、创建逻辑备用数据库
2.1创建一个物理备用数据库
首先创建一个物理备用数据库,然后把它转换成一个逻辑备用数据库:
第一步,创建物理备用数据库。
第二步,确保物理备用数据库追上主数据库
在你完成启动物理备用数据库和重做应用之后,允许恢复进行到备用数据库与主数据库一致的状态,包括所有数据库结构的改变,例如增加或删除数据文件。
2.2准备主数据库使它支持逻辑备用数据库
2.2.1确保激活追加日志的功能
在主数据库,追加日志的功能必须被激活来支持逻辑备用数据库。因为oracle数据库只记录被修改的列,并不总能够唯一确定修改的行,所以额外的信息需要被放入重做日志数据流中。额外的信息帮助sql apply来维护逻辑备用数据库中的表。
第一步,确定追加日志功能是否被激活
SQL> SELECT SUPPLEMENTAL_LOG_DATA_PK AS PK_LOG,
2> SUPPLEMENTAL_LOG_DATA_UI AS UI_LOG
3> FROM V$DATABASE;
PK_LOG UI_LOG
------ ------
NO NO
第二步,激活追加日志功能
在主数据库,使用如下语句增加主键和唯一索引信息到归档重做日志文件中:
SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (PRIMARY KEY, UNIQUE INDEX) COLUMNS;
第三步,验证追加日志功能激活
SQL> SELECT SUPPLEMENTAL_LOG_DATA_PK AS PK_LOG,
2> SUPPLEMENTAL_LOG_DATA_UI AS UI_LOG
3> FROM V$DATABASE;
PK_LOG UI_LOG
------ ------
YES YES
注意,如果在一个有物理备用数据库的Data Guard配置中,你在主数据库激活追加日志功能,之后你必须在每一个物理备用数据库执行ALTER DATABASE ADD SUPPLEMENTAL LOG DATA 这个语句,来确保将来的switchover能够正确工作。
2.2.2为角色转换准备主数据库
主数据库:逻辑备用角色初始化参数
LOG_ARCHIVE_DEST_1=
'LOCATION=/arch1/chicago/
VALID_FOR=(ONLINE_LOGFILES,ALL_ROLES)
DB_UNIQUE_NAME=chicago'
LOG_ARCHIVE_DEST_2=
'SERVICE=boston
VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE)
DB_UNIQUE_NAME=boston'
LOG_ARCHIVE_DEST_3=
'LOCATION=/arch2/chicago/
VALID_FOR=(STANDBY_LOGFILES,STANDBY_ROLE)
DB_UNIQUE_NAME=chicago'
LOG_ARCHIVE_DEST_STATE_1=ENABLE
LOG_ARCHIVE_DEST_STATE_2=ENABLE
LOG_ARCHIVE_DEST_STATE_3=ENABLE
UNDO_RETENTION=3600
2.3转换物理备用数据库为逻辑备用数据库
2.3.1确保追加日志功能激活
在逻辑备用数据库完成上文的步骤
2.3.2准备一个初始化参数文件
第一步,为逻辑备用数据库设置初始化参数
你需要修改LOG_ARCHIVE_DEST_n参数,增加PARALLEL_MAX_SERVERS参数。
你需要修改LOG_ARCHIVE_DEST_n参数,是因为与物理备用数据库不一样,逻辑备用数据库是打开状态的数据库,需要生成重做数据,有多种日志文件(联机重做日志文件,归档重做日志文件以及备用重做日志文件)
例如:逻辑备用数据库修改的初始化参数
LOG_ARCHIVE_DEST_1=
'LOCATION=/arch1/boston/
VALID_FOR=(ONLINE_LOGFILES,ALL_ROLES)
DB_UNIQUE_NAME=boston'
LOG_ARCHIVE_DEST_2=
'SERVICE=chicago
VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE)
DB_UNIQUE_NAME=chicago'
LOG_ARCHIVE_DEST_3=
'LOCATION=/arch2/boston/
VALID_FOR=(STANDBY_LOGFILES,STANDBY_ROLE)
DB_UNIQUE_NAME=boston'
LOG_ARCHIVE_DEST_STATE_1=ENABLE
LOG_ARCHIVE_DEST_STATE_2=ENABLE
LOG_ARCHIVE_DEST_STATE_3=ENABLE
PARALLEL_MAX_SERVERS=9
UNDO_RETENTION=3600
PARALLEL_MAX_SERVERS参数:不要设置小于5的值;要得到最佳结果,最小把它设置为9;
第二步,关闭逻辑备用数据库
SQL> SHUTDOWN IMMEDIATE;
2.3.3创建控制文件
第一步,创建控制文件
SQL> ALTER DATABASE CREATE LOGICAL STANDBY CONTROLFILE AS '/tmp/boston.ctl';
第二步,复制控制文件到逻辑备用数据库
cp /tmp/boston.ctl /arch1/boston/control1.ctl
cp /tmp/boston.ctl /arch2/boston/control2.ctl
2.4启动逻辑备用数据库
第一步,启动装载逻辑备用数据库
SQL> STARTUP MOUNT PFILE=initboston.ora;
第二步,准备sql apply
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE;
第三步,激活逻辑备用数据库
SQL> ALTER DATABASE ACTIVATE STANDBY DATABASE;
第四步,重建逻辑备用数据库的数据库名
运行oracle DBNEWID (nid)工具来改变逻辑备用数据库的数据库名,修改名字防止主库副本与最初主库之间的交互。
在你运行这个工具前,必须关闭和装载数据库
SQL> SHUTDOWN IMMEDIATE;
SQL> STARTUP MOUNT PFILE=initboston.ora;
现在在备用数据库运行DBNEWID工具来改变数据库名并且关闭它:
nid TARGET=SYS/password@boston DBNAME=boston
Connected to database chicago (DBID=1456557175)
Control Files in database:
/arch1/boston/control1.ctl
Change database ID and database name chicago to boston? (Y/[N]) => y
Proceeding with operation
Changing database ID from 1456557175 to 416458362
Changing database name from chicago to boston
Control File /arch1/boston/control1.ctl - modified
Datafile /arch1/boston/system01.dbf - dbid changed, wrote new name
Datafile /arch1/boston/undotbs01.dbf -dbid changed, wrote new name
.
.
.
Control File /arch1/boston/control1.ctl-dbid changed, wrote new name
Database name changed to boston.
Modify parameter file and generate a new password file before restarting.
Database ID for database boston change to 416458362.
All previous backups and archive logs for this database are unusable.
Database has been shut down, open database with RESETLOGS option.
Successfully changed database name and ID.
DBNEWID - Completed successfully.
当运行Oracle DBNEWID (nid)之后你必须重建密码文件。
第五步,在参数文件中修改逻辑备用数据库名。
修改DB_NAME初始化参数文件
创建spfile
SQL> CREATE SPFILE FROM PFILE=initboston.ora;
重新启动逻辑备用数据库
SQL> STARTUP MOUNT;
SQL> ALTER DATABASE OPEN RESETLOGS;
第六步,改变逻辑备用数据库的全局名。
SQL> ALTER DATABASE RENAME GLOBAL_NAME TO boston;
第七步,创建一个新的临时文件
SQL> SELECT TABLESPACE_NAME FROM DBA_TABLESPACES
2> WHERE CONTENTS = 'TEMPORARY';
TABLESPACE_NAME
--------------------------------
TEMP1
TEMP2
SQL> ALTER TABLESPACE TEMP1 ADD TEMPFILE
2> '/arch1/boston/temp01.dbf'
3> SIZE 40M REUSE;
第八步,启动sql apply
SQL> ALTER DATABASE START LOGICAL STANDBY APPLY;
2.5检验备用数据库的工作
第一步,检验归档重做日志文件已登记。
SQL> ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MON-YY HH24:MI:SS';
Session altered.
SQL> COLUMN DICT_BEGIN FORMAT A10
SQL> COLUMN DICT_END FORMAT A8
SQL> SELECT SEQUENCE#, FIRST_TIME, NEXT_TIME, DICT_BEGIN, DICT_END
2> FROM DBA_LOGSTDBY_LOG ORDER BY SEQUENCE#;
SEQUENCE# FIRST_TIME NEXT_TIME DIC DIC
---------- ------------------ ------------------ --- ---
24 23-JUL-02 18:19:05 23-JUL-02 18:19:48 YES YES
25 23-JUL-02 18:19:48 23-JUL-02 18:19:51 NO NO
26 23-JUL-02 18:19:51 23-JUL-02 18:19:54 NO NO
27 23-JUL-02 18:19:54 23-JUL-02 18:19:59 NO NO
28 23-JUL-02 18:19:59 23-JUL-02 18:20:03 NO NO
29 23-JUL-02 18:20:03 23-JUL-02 18:20:13 NO NO
30 23-JUL-02 18:20:13 23-JUL-02 18:20:18 NO NO
31 23-JUL-02 18:20:18 23-JUL-02 18:20:21 NO NO
8 rows selected.
第二步,发送重做数据到备用数据库
在主库:
SQL> ALTER SYSTEM ARCHIVE LOG CURRENT;
System altered.
SQL> ALTER SYSTEM ARCHIVE LOG CURRENT;
System altered.
第三步,再次查询DBA_LOGSTDBY_LOG视图
SQL> ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MON-YY HH24:MI:SS';
Session altered.
SQL> COLUMN DICT_BEGIN FORMAT A10
SQL> COLUMN DICT_END FORMAT A8
SQL> SELECT SEQUENCE#, FIRST_TIME, NEXT_TIME, DICT_BEGIN, DICT_END
2 FROM DBA_LOGSTDBY_LOG ORDER BY SEQUENCE#;
SEQUENCE# FIRST_TIME NEXT_TIME DIC DIC
---------- ------------------ ------------------ --- ---
24 23-JUL-02 18:19:05 23-JUL-02 18:19:48 YES YES
25 23-JUL-02 18:19:48 23-JUL-02 18:19:51 NO NO
26 23-JUL-02 18:19:51 23-JUL-02 18:19:54 NO NO
27 23-JUL-02 18:19:54 23-JUL-02 18:19:59 NO NO
28 23-JUL-02 18:19:59 23-JUL-02 18:20:03 NO NO
29 23-JUL-02 18:20:03 23-JUL-02 18:20:13 NO NO
30 23-JUL-02 18:20:13 23-JUL-02 18:20:18 NO NO
31 23-JUL-02 18:20:18 23-JUL-02 18:20:21 NO NO
32 23-JUL-02 18:20:21 23-JUL-02 18:32:11 NO NO
33 23-JUL-02 18:32:11 23-JUL-02 18:32:19 NO NO
10 rows selected.
第四步,验证重做数据是否被正确应用
在逻辑备用数据库,查询V$LOGSTDBY_STATS视图,例如:
SQL> COLUMN NAME FORMAT A30
SQL> COLUMN VALUE FORMAT A30
SQL> SELECT NAME, VALUE FROM V$LOGSTDBY_STATS WHERE NAME = 'coordinator state';
NAME VALUE
------------------------------ ------------------------------
coordinator state INITIALIZING
了解协调进程的状态非常重要,因为它是指示其他逻辑备用进程的LSP后台进程。
第五步,查看V$LOGSTDBY视图来观察当前sql apply的行为
初始化阶段V$LOGSTDBY的输出:
SQL> COLUMN STATUS FORMAT A50
SQL> COLUMN TYPE FORMAT A12
SQL> SELECT TYPE, HIGH_SCN, STATUS FROM V$LOGSTDBY;
TYPE HIGH_SCN STATUS
------------ ---------- --------------------------------------------------
COORDINATOR ORA-16115: loading Log Miner dictionary data
READER ORA-16127: stalled waiting for additional transact
ions to be applied
BUILDER ORA-16117: processing
PREPARER ORA-16116: no work available
SQL> SELECT TYPE, HIGH_SCN, STATUS FROM V$LOGSTDBY;
TYPE HIGH_SCN STATUS
------------ ---------- --------------------------------------------------
COORDINATOR ORA-16126: loading table or sequence object number
READER ORA-16116: no work available
BUILDER ORA-16116: no work available
PREPARER ORA-16116: no work available
应用阶段的V$LOGSTDBY的输出:
SQL> COLUMN NAME FORMAT A30
SQL> COLUMN VALUE FORMAT A30
SQL> SELECT NAME, VALUE FROM V$LOGSTDBY_STATS WHERE NAME = 'coordinator state';
NAME VALUE
------------------------------ ------------------------------
coordinator state APPLYING
SQL> COLUMN STATUS FORMAT A50
SQL> COLUMN TYPE FORMAT A12
SQL> SELECT TYPE, HIGH_SCN, STATUS FROM V$LOGSTDBY;
TYPE HIGH_SCN STATUS
------------ ---------- --------------------------------------------------
COORDINATOR ORA-16117: processing
READER ORA-16127: stalled waiting for additional transact
ions to be applied
BUILDER 191896 ORA-16116: no work available
PREPARER 191902 ORA-16117: processing
ANALYZER 191820 ORA-16120: dependencies being computed for transac
tion at SCN 0x0000.0002ed4e
APPLIER 191209 ORA-16124: transaction 1 16 1598 is waiting on ano
ther transaction
APPLIER 191205 ORA-16116: no work available
APPLIER 191206 ORA-16124: transaction 1 5 1603 is waiting on anot
her transaction
APPLIER 191213 ORA-16117: processing
APPLIER 191212 ORA-16124: transaction 1 20 1601 is waiting on ano
ther transaction
APPLIER 191216 ORA-16124: transaction 1 4 1602 is waiting on anot
her transaction
11 rows selected.
第六步,检查sql apply的整个处理过程。
SQL> SELECT APPLIED_SCN, NEWEST_SCN FROM DBA_LOGSTDBY_PROGRESS;
APPLIED_SCN NEWEST_SCN
----------- ----------
180702 180702
如果备用重做日志文件没有配置,APPLIED_SCN 和NEWEST_SCN列的值是相等的,表明在归档重做日志文件中所有可用数据都被应用了。这些值可以与DBA_LOGSTDBY_LOG视图中的FIRST_CHANGE#列的值比较,查看有多少日志文件信息被应用,多少剩余。
3、更多准备
升级数据保护模式
配置备用重做日志
激活闪回数据库功能

ORACLE DATAGUARD 数据库---创建逻辑备用数据库相关推荐

  1. 逻辑备用数据库主要作用是什么。

    看到一个文档里面介绍了逻辑备用数据库,不太明白其作用. 来自 " ITPUB博客 " ,链接:http://blog.itpub.net/79499/viewspace-41762 ...

  2. sybase 数据导入mysql_Windows环境下Sybase12.5 数据库创建与导入数据库.docx

    Windows环境下Sybase12.5 数据库创建与导入数据库?? 现在的情况是,Sybase数据库已经安装完成了,需重新创建一个叫ptms的数据库,指定一个用户名sybase/sybase,具备全 ...

  3. oracle 一个实例创建多个数据库_Oracle闪回,为你的数据库上一个安全防线

    概述 Oracle 9i 开始支持闪回,Oracle10g开始全面支持闪回功能,Oracle11g有所完善,为我们快速的恢复数据,查询历史数据提供了很大的便捷方法. 今天主要对Oracle常用闪回使用 ...

  4. oracle 一个实例创建多个数据库_创建多个Oracle数据库及相应的实例

    转 http://blog.csdn.net/luiseradl/article/details/6972217 对于使用过SQL Server数据库的用户可以会对Oracle中的数据库的实例的概念理 ...

  5. oracle 查询、创建、删除 数据库用户

    select * from dba_users where username = '用户名' :  (查询) create user "用户名" identifled by &qu ...

  6. oracle 一个实例创建多个数据库_oracle 一个实例创建多个数据库

    {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...

  7. mysql数据库创建带-的数据库名

    创建test-test数据库 "(root@localhost) 09:09: [(none)]>create database test-test; ERROR 1064 (4200 ...

  8. Oracle DataGuard介绍

     DataGuard 概述 DataGuard工作流程 主库把日志传输到备库,主库记录所有的操作信息,通过两种方式传输: 1:通过LNS(监听网络服务)传输到远程,通过service定义远程数据库, ...

  9. oracle dataguard详细,Oracle数据库DataGuard参数配置与参数详解

    oracle数据库Data Guard参数配置与参数详解 1. Oracle 11g Dataguard参数详解 就Oracle Data Guard来说,我们只关注如下三种参数: 1 独立于数据库角 ...

最新文章

  1. cocos2dx小游戏数据签名算法破解
  2. 科大星云诗社动态20210207
  3. 将编号为0和1的两个栈存放于一个数组空间V[m]中。
  4. 数据结构之顺序表(一)
  5. python的编码规范【摘】
  6. 错排公式的推导及应用
  7. 有了linux基础还学习学哪些,学linux的前途和好处有哪些
  8. 十代主板改win7_10代cpu装win7系统及bios设置教程(完美支持10代驱动)
  9. 理想边界尺寸怎么算_CFD 仿真中的边界条件设置
  10. 区块链之零知识证明(zk-SNARK从小白到明白)
  11. 快速取消PPT中所有动画效果
  12. 计算机的游戏功能,游戏同步器功能介绍、作用讲解及使用方法
  13. 【立创EDA开源推荐】10期基于PCB彩印教程(水转印)
  14. 第四百九十一章 战利品
  15. Windows下如何清除文件资源管理器搜索框中的搜索记录?
  16. 用python画一朵鲜艳欲滴的红玫瑰
  17. HDFS遍历子目录 Hadoop fs -ls -R path
  18. 开启这个数据缓存,一键加速你的小程序。
  19. git在push时候出现timeout的解决方法
  20. HTML+JavaScript实现网页秒杀倒计时效果

热门文章

  1. linux下编写sql脚本,在Linux系统中编写简易shell脚本,向PLSQL表中插入数据
  2. android 手机固定mac地址吗,Android手机获取Mac地址的几种方法
  3. c++ 怎么配置头文件路径_OpenGL环境配置
  4. myBatis association的两种形式
  5. VB Listview导出到CSV文件函数
  6. ※部分VB文章汇总A※
  7. 合作︱2018CCF青年精英大会首设科技创业竞赛,快来报名吧!
  8. 11月23日python笔记(python基础2.6-3.0)
  9. ELK入门级介绍--打造实时日志查询系统
  10. 八皇后问题(非递归版)