oracle golden gate使用配置

我们采用oracle 11g数据库对应的golden gate传统模式配置:
oracle golden gate的逻辑架构:

oracle golden gate实现live standby database架构图:

系统版本

rh linux6.3
oracle database 11.2.0.4.0
oracle golden gate for oracle 11g

Golden Gate源目标端DDL和DML复制配置详细过程

环境信息

主机 ip 数据库名 用户信息 ogg软件安装目录
源端 192.168.10.1 DOG ogg/ogg /ogg/product
目标端 192.168.10.2 OGGSBY oggsby/oggsby /ogg/product

源数据库配置

关闭回收站:


alter system set recyclebin=off deferred;
shutdown immediate;
startup
show parameter recyclebin

配置用户和表空间:

create tablespace oggtbs datafile '/app/oracle/oradata/DOG/oggtbs01.dbf' size 100M ;
create user ogg identidied by ogg default tablespace oggtbs;
grant connect to ogg;
grant dba to ogg;
# 因为我们是测试环境 ,所以为了测试方面,我们直接授权dba权限,而在实际的生产环境中,需要使用最小化权限管理
# 根据ogg用户需要的权限进行相应的配置

注:ogg用户可能需要的权限配置:

create user ogg identified by ogg;
grant connect,resource to ogg;alter user ogg default tablesp    ace oggtbs;
grant unlimited tablespace to ogg;
grant connect, resource, dba to ogg;
grant create session, alter session to ogg;
grant alter system to ogg;
grant select any dictionary to ogg;
grant flashback any table to ogg;
grant select any table, insert any table, update any table, delete any table, drop any table to ogg;
grant create table, create sequence to ogg;
grant select on dba_clusters to ogg;
grant select on v_$database to ogg;
grant select on sys.logmnr_buildlog to ogg;
grant select any transaction to ogg;
grant lock any table to ogg;
grant execute on dbms_flashback to ogg;
grant execute on dbms_logmnr_d to ogg;
grant execute on dbms_capture_adm to ogg;
grant execute on dbms_streams to ogg;
grant execute on utl_file to ogg;
exec dbms_streams_auth.grant_admin_privilege('ogg');

源库开户附加日志和force logging:

alter database force logging;
alter database add supplemental log data;

目标端数据库配置

目标端数据库配置:

alter system set recyclebin=off deferred;
shutdown immediate;
startup
show parameter recyclebin

用户和表空间:

create tablespace oggtbs datafile '/app/oracle/OGGSBY/oradata/oggtbs1.dbf' size 100M;
create user oggsby identified by oggsby default tablespace oggtbs;
grant connct,resource to oggsby;
grant dba to oggsby;
alter user oggsby quota unlimited on oggtbs;

源和目标端开启DDL复制配置

开启DDL复制配置,当源端执行DDL语句 ,如create table ,alter table等操作时,配置extract进程和replicat进程的配置,就可以实现源库和目标库的DDL复制了

#源库配置DDL复制所执行的SQL脚本 :
grant create table ,create sequence to ogg;
grant ggs_ggsuser_role to ogg;
@marker_setup.sql
@ddl_setup.sql
@role_setup.sql
@ddl_enable.sql
@?/rdbms/admin/dbmspool.sql
@ddl_pin.sql ogg #指定对应的用户

目标端开启DDL:

grant create table ,create sequence to oggsby;
grant ggs_ggsuser_role to oggsby;
@marker_setup.sql
@ddl_setup.sql
@role_setup.sql
grant ggs_ggsuser_role to oggsby;
@ddl_enable.sql
@?/rdbms/admin/dbmspool.sql
@ddl_pin.sql oggsby#指定对应的用户  这个目标端的承载用户

源端配置mgr、extract抽取、extract datapump进程

配置mgr进程

ggsci
info mgr
edit params mgr --编辑mgr进程参数
--具体内容:PORT 7809
DYNAMICPORTLIST  7840-7939  --mgr进程使用7809,当7809不可用时,可使用7840至7939浮动端口
AUTOSTART EXTRACT *   --自动启动所有的extract进程
AUTORESTART EXTRACT *, RETRIES 5, WAITMINUTES 2  --extract进程出问题,则每2min尝试重启,尝试次数5次
PURGEOLDEXTRACTS /ogg/product/dirdat/*, USECHECKPOINTS, MINKEEPDAYS 5  --定期清理dirdat目录下的trail文件,最少保留时间5天
LAGREPORTHOURS 1  --每隔一小时检查各进程延时情况,并记录到goldengate report文件。
LAGINFOMINUTES 30  --进程复制延时超过30分钟,向日志文件记录一条错误日志
LAGCRITICALMINUTES 45 --传输延时超过45分钟将写入警告日志

配置extract ext1抽取进程

ggsci
dblogin userid ogg,password ogg --使用此用户,登录到源数据为操作。 进行数据的extract
add extract ext1,tranlog,begin now  --增加进程
add exttrail ./dirdat/sr,extract ext1 --为ext1进程增加trail文件,存放到$OGG_HOME/dirdat/sr文件中。 1、第一步,添加队列文件(进程文件)
edit params ext1   --2、第二步,编辑队列文件,也就是进得文件
--具体的参数内容
extract ext1
SETENV(ORACLE_SID="DOG")
SETENV(NLS_LANG=AMERICAN_AMERICA.ZHS16GBK)
userid ogg, password ogg
REPORTCOUNT EVERY 30 MINUTES, RATE --每隔30min报告一次从程序开始到现在的抽取进程或者复制进程的事物记录数,并汇报进程的统计信息
DISCARDFILE /ogg/product/dirrpt/extsr.desc, APPEND, MEGABYTES 1024  --执行失败记录保存在discardfile中,文件大小设置最大为1024M.使用APPEND追加模式写文件
DISCARDROLLOVER AT 3:00  --没3:00做一次文件清理
EXTTRAIL /ogg/product/dirdat/sr     --此处使用绝对路径存放。 和add exttrail命令对应的文件需要相同。 trail文件的存放路径
DYNAMICRESOLUTION --有时候开启OGG进程的时候较慢,可能是因为需要同步的表太多,OGG在开启进程之前会将需要同步的表建立一个记录并且存入到磁盘中,这样就需要耗费大量的时间。使用该参数来解决此问题。
DBOPTIONS  ALLOWUNUSEDCOLUMN --用于阻止抽取进程抽取数据时由于表含有unused列而导致进程异常终止(abend)。使用该参数,抽取进程抽取到unused列时也会向日志文件记录一条警告信息。 数据表的unused列操作配置
FETCHOPTIONS NOUSESNAPSHOT --默认值为 usesnapshot,表示利用数据库闪回读取数据。Nousesnapshot表示直接从原表读取相关数据。
FETCHOPTIONS FETCHPKUPDATECOLS --当使用了HANDLECOLLISIONS时,请使用该参数。复制进程出现丢失update记录(missing update)并且更新的是主键,update将转换成insert。由于插入的记录可能不是完整的行,若要保证完整需要加入此参数
table ogg.*;  --需要复制的表

配置datapump进程

datapump进程本质上是extract进程
如果不使用datapump进程,则extract进程则抽取和发送trail文件到目标端,需要完成的此两项功能。
如果配置了datapump进程,则extract进程抽取和捕获数据写入到trail文件,而datapump进得负责发送trail文件到目标端,发送过程通过网络传输。加强源、目标端进程的可用性。相对松耦合的架构 。

注意:创建并指定源数据库trail文件位置,必须包含两个字符,这个路径和主抽取进程(Primary Extract)中指定的trail目录和trail文件命名必须相同,因为Data Pump进程要从此读取主抽取进程生成的trail文件; 我们在第一次测试时,就是这个路径写的不一致,而导致同步失败了。

# 配置datadump  dpump1进程
ggsci
dblogin userid ogg,password ogg
add extract dpump1, exttrailsource /ogg/product/dirdat/sr   --增加进程 dpump1
add rmttrail /ogg/product/dirdat/tr,extract dpump1  --dpump1进程,传输至远程目标端的trail文件目录。 注意:这个文件参数要和edit params pdump1参数配置项相同  。 1、第一步、添加队列文件
edit params dpump1  --2、第二步,编辑队列文件
--dpump1参数配置内容
extract dpump1
SETENV(ORACLE_SID="DOG")
SETENV(NLS_LANG=AMERICAN_AMERICA.ZHS16GBK)
RMTHOST 192.168.10.2, mgrport 7839, COMPRESS   --远端数据mgr进程和端口号,compress使用压缩文件传输
PASSTHRU  --输进程直接跟抽取进程交互,而不再和数据库进行交互,减少数据库资源的利用。passthru表示本进程是一个传输进程data pump,无需跟数据库交互,只需要搬运数据即可;
因为data pump要传输数据到目标,所以需要配置rmthost和rmttrail指定目标主机和队列信息
RMTTRAIL /ogg/product/dirdat/tr --传递到target端,trail文件存放目录
--DYNAMICRESOLUTION
table ogg.*;

注意:
源端可以配置多个主抽取进程,也可以配置多个Data Pump进程,但必须为每个要同步的目标端配置一个Data Pump进程;

在dpump1增加远端trail文件配置

add rmttrail /ogg/product/dirdat/tr, extract dpump1

目标端配置replicat复制进程

关于checkpoint说明:
Checkpoint存储从文件读取和写入的检测点位置,用于还原和恢复数据,Checkpoint确保发生变化并提交(commit)的数据被extract抽取捕获和被replicat进程应用到目标端;保证在系统、网络或者GoldenGate需要重启进程时发生的错误不会导致数据丢失;在复杂的同步配置中checkpoints启用多个extract和replicat进程从同一个trail集中读取数据。

Checkpoint table有两种类型:主表和辅助表。主表根据用户定义名称来来创建,辅助表会自动创建。辅助表就是transaction table。名称是checkpoint table名上加_LOX。

目标端增加checkpoing表:

add checkpointtable oggsby.checkpoint;
edit params ./GLOBALS
GGSCHEMA oggsby
CHECKPOINTTABLE obbsby.checkpoint

目标端配置复制进程:

add replicat rep1, exttrail /ogg/product/dirdat/tr, checkpointtable oggsby.checkpoint
edit params rep1
REPLICAT rep1
SETENV(ORACLE_SID="OGGSBY")
SETENV(NLS_LANG=AMERICAN_AMERICA.ZHS16GBK)
USERID oggsby, PASSWORD oggsby
ddl include all    --配置ddl复制
ddlerror default ignore retryop maxretries 3 retrydelay 5 --出错时,每5min尝试一次,尝试次数3
REPORT AT 06:00   --6:00生成report
REPORTCOUNT EVERY 30 MINUTES, RATE
REPORTROLLOVER AT 02:00  --每天2:00清理report文件
REPERROR DEFAULT, ABEND   --除了特殊指定的REPERROR语句,报告所有复制期间出现的错误,回滚非正常中断的事物和进程。遇到不能处理的错误就自动abend,启动需要人工干预处理。
ALLOWNOOPUPDATES  --当源表有排除列情况或者有目标表不存在的列时,当更新这列goldengate默认报错。应用该参数后,即可让goldengate生成一条警告信息而不是报错。
ASSUMETARGETDEFS --使用ASSUMETARGETDEFS参数时,用MAP语句中指定的生产库源表和灾备端目标表具有相同的列结构。它指示的Oracle GoldenGate不在生产端查找源表的结构定义。
HANDLECOLLISIONS --用于goldengate自动过滤不能出来的冲突记录,为了严格保证数据一致性
DISCARDFILE /ogg/product/dirrpt/repsa.dsc, APPEND, MEGABYTES 1024
DISCARDROLLOVER AT 02:00
MAP ogg.*, target oggsby.*;

创建测试表和同步测试

创建测试表

#src:
create table ogg.togg(id primary key, name, type, CREATED, update_date) as select object_id, object_name, object_type, CREATED, sysdate from dba_objects where rownum < 101;

在目标端初始化测试表的数据同步:

create public database link oggsrc connect to ogg identified by ogg using '192.168.10.1:1521/DOG';
create table oggsby.togg(id primary key, name, type, CREATED, update_date) as select object_id, object_name, object_type, CREATED, sysdate from dba_objects where rownum < 1;
insert into oggsby.togg select * from ogg.togg@oggsrc;
commit;

src插入一条数据进行测试

# src:
insert into ogg.togg   select object_id, object_name, object_type, CREATED, sysdate from dba_objects where object_id =200 ;
commit;
select count(*) from ogg.togg;#在目标端进行查看:
select count(*) from oggsby.togg;

测试DDL操作:

# src源端:
create table ogg.test1 as select * from dba_users;
# 在target查看
select count(*) from  oggsby.test1;  --进行相应的验证

Golden Gate组件说明

MGR进程

MRG也就是oracle manager进程,是ogg的管理进程,管理ogg的启动、分配端口、管理trail文件、创建事件、记录错误日志等,需要首先启动的进程,在extract和replicat进程前启动
oracle官方说明:
● Start Oracle GoldenGate processes
● Start dynamic processes
● Start the Collector process
● Manage the port numbers for processes
● Perform trail management
● Create event, error, and threshold reports

查看
ggsci
info mgr
edit params mgr #编辑mgr参数配置项

extract进程

extract进程主要在源端配置
extract进程运行在源端,它可以配置初始化数据直接从源端加载(直接从数据源加载静态数据)和在某个时间点后源端与服务端变更数据同步((从在线日志或归档日志抽取捕获变更的数据),它也可以在支持DDL变更的系统中抽取捕获DDL;

You can configure Extract in one of the following ways:
● Initial loads: For initial data loads, Extract extracts (captures) a current, static set of data directly from their source objects. --从源端抽取初始化静态数据,并加载
● Change synchronization: To keep source data synchronized with another set of data, Extract captures DML and DDL operations after the initial synchronization has taken place. --操持数据变更同步。

当配置为数据同步时,extract进程抽取捕获extract配置文件里配置的对象的任何DML和DDL(需要额外配置)的操作,extract进程记录这些操作,直到用户提交或回滚事务;
当收到回滚(rollback)时,extract撤销这些记录;
当收到(commit)操作后,extract进程记录保存这些操作到一个或多个trail文件里并以队列的形式发送到目标端,以确保数据传输速度和数据的一致性。

extract进程抽取源系统数据变更并将这此数据保存到trail文件中,所以需要为源extract进程配置trail文件目录和trail文件名的两个字符名。

extract使用下面三个方面来抽取数据:
1、Source tables, if the run is an initial load.
通过source table
2、The <font color="red> database recovery logs or transaction logs (such as the Oracle redo logs or SQL/MX audit trails). The actual method of capturing from the logs varies depending on the database type.
3、A third-party capture module. This method provides a communication layer tha tpasses data and metadata from an external API to the Extract API(通过第三方的api获取 ).The database vendor or a third-party vendor provides the components that extract the data operations and pass them to Extract.

datapump 文件传递进程

datapump是一种secondary Extract group进程,在source端进行配置的。
如果不使用datapump进程,则在source端,数据的抽取和投递都是需要基于primary extract进程写入trail文件,并传递到远端target数据库。
使用datadump进程,则在source端,extract进程负责抽取数据并写入trail文件,datapump进程读取trail文件并通过网络将其传入到远端target database。增加了系统的健壮性和存储的可用性。

使用datapump配置的原因和好处:
1、Protection against network and target failures. 对网络和target端失败的保护
2、You are implementing several phases of data filtering or transformation. --数据的过滤和传输分阶段执行,增加系统的稳定性和可用性
3、Consolidating data from many sources to a central target. 可实现多源到单目标的数据抽取
4、Synchronizing one source with multiple targets. 可实现同源至多目标数据的同步。

replicat 复制进程

replicat进程运行在target database端,replicat进程读取传输而来的trail文件,并重构DML和DDL语句,然后在target database上应用语句。
replicat进程通过如下种方式复制数据:
1、initial loads. 对于初始化数据,replicat进程可在target端直接应用传输面来的静态数据
2、change synchronization. 数据变更同步,应用传递而来的数据变更操作。

初始化数据

DML操作包括INSERT、UPDATE、DELETE、SELECT操作,而在这些操作中UPDATE、DELETE操作Redo只记录了变更的数据列以及行ID(ROWID),GoldenGate抽取数据后将其转换为自己的格式发送都目标端。在同步开始前目标端没有初始化数据(目标端为空数据),那么事物产生的UPDATE、DELETE DML操作发送到目标端,目标端GoldenGate Replicat进程会因为找不到数据而报错从而导致Replicat进程崩溃停止(ABENDED),所以这就需要我们在同步前初始化数据,初始化完后再同步,这样大大降低错误率。同步数据的方式可以通过DBLINK、EXP/IMP、SQLLDR或者表空间迁移等方式同步。

管理命令和一些配置说明

查看mgr进程

ggsci
view param mgr
info mgr
status mgr   查看mgr进程状态
stats mgr     查看mgr进程的详细信息
info all  查看所有进程信息因为我们manager进程使用的是7809端口,在linux系统查看
netstat -ano|grep 7809
lsof -i:7809
根据产生的进程ID,可以看到进程的信息
ps -ef|grep 30392
oracle   30392     1  0 16:50 ?        00:00:00 ./mgr PARAMFILE /ogg/product/dirprm/mgr.prm REPORTFILE /ogg/product/dirrpt/MGR.rpt PROCESSID MGR

目标端需要权限

grant  insert any table to oggsby;
grant delete any table to oggsby;
grant update any table to oggsby;
# 如果权限不敏感,可以直接授予dba权限

ggsci命令

ggsci
info all
start ext*   ext开头的
start ext1  开始这个ext1进程#联合使用
add extract ext1,tranlog,begin now  --增加进程ext1
add exttrail ./dirdat/sr,extract ext1   --为增加队列文件#
add extract dpump1, exttrailsource /ogg/product/dirdat/sr   --增加进程 dpump1
add rmttrail /ogg/product/dirdat/tr,extract dpump1   --增加远程队列文件,用于远程传输#复制进程
add replicat rep1, exttrail /ogg/product/dirdat/tr, checkpointtable oggsby.checkpointdelete ext1 删除进程
delete exttrail ./dirdat/sr  删除trail文件view report REP1  # 查看report
help   # 使用帮助命令#错误日志做准备:
$OGG_HOME/ggserr.log #查看参数
view params *
view params ext1
edit params ext1
info exttrail *
view report *
info credentialstore  #12c新特性,查看用户的配置信息,用户名、密码
add credentialstore    # 增加
delete credentialstore
add extract e*, tranlog, begin now:
add extract p*,exttrailsource ./dirdat/xx*  #创建推送进程—>配置相应的配置文件
add exttrail ./dirdat/xx*,extract e_gessdb,megabytes 100:配置进程

增加附加日志:(用户级)
ggsci
add trandata ogg.* 使用通配符实现用户级
add trandata ogg.test01 表级
delete trandata ODS.OGG_LCCONT 删除表级日志

数据库补充日志:

select supplemental_log_data_min from v$database; --YES表示已经启用数据库级补充日志
select SUPPLEMENTAL_LOG_DATA_MIN, SUPPLEMENTAL_LOG_DATA_PK, SUPPLEMENTAL_LOG_DATA_UI from v$database;
alter  database  add supplemental log data;
alter database force logging;

关于数据为recyclebin说明

参数类型deferred,对当前session无效,对修改生新创建session有效
当修改系统级时,需要重启数据库。
select name,isses_modifiable,issys_modifiable from v$parameter wherename=‘recyclebin’; --查看参数类型

配置mgr将多余文件删除
PURGEOLDEXTRACTS ./dirdat/*, USECHECKPOINTS, MINKEEPHOURS 1 --此行是新添加的内容,表示超过一小时且超过读检查点的数据自动删除

关于DDL复制

GoldenGate的DDL同步只支持两边一致的数据库,限制条件较多(如不能进行字段映射、转换等),具体可以参考官方文档。DDL的抓取不是通过日志抓取来捕获的,而是通过触发器来实现,所以对源数据库的性能影响要比单纯的数据抓取要大很多,可谓屏弃了GoldenGate的优势。尽量不要使用GoldenGate的DDL复制功能,在大多数业务系统中,实际上不会有频繁的数据库结构变动,完全可以通过手工的方式进行维护。确实有大量DDL操作的环境,如果可以,还是推荐物理DG之类的替换方案;确实要使用GoldenGate的DDL复制,那么请详细参考官方文档的限制和说明。开启DDL复制的基本配置步骤为:
(1)关闭ORACLE的回收站功能。
(2)选择一个数据库schema存放支持DDL的GoldenGate对象,运行相应创建脚本。
(3)编辑globals参数文件。
(4)修改extl和repl的配置文件 参引:https://www.cnblogs.com/junnor/p/4307228.html

参考说明

本文配置学习了https://www.cnblogs.com/VoiceOfDreams/p/8576973.html所述,结合自己实验操作。

oracle golden gate原理和安装配置相关推荐

  1. Oracle Golden Gate 系列十六 -- 配置 GG 安全 说明 与 示例

    由于GoldenGate所需的用户权限较大,而每个GoldenGate进程配置文件中都需要设置该用户和密码用于数据库登陆,出于安全性的考虑,建议将密码进行加密. 官方文档上介绍的加密有如下三种方法: ...

  2. Oracle Golden Gate

    Oracle Golden Gate 系列 小结 花了大半个月的时间小研究了一下Oracle Golden Gate. 先简单的说说自己学习GG的一个过程.参考资料都是官方文档,官网的链接如下: ht ...

  3. Oracle Golden Gate 系列 小结

    花了大半个月的时间小研究了一下Oracle Golden Gate. 先简单的说说自己学习GG的一个过程. 参考资料都是官方文档,官网的链接如下: http://download.oracle.com ...

  4. Oracle Golden Gate 系列十七 -- GG 一对多 real-time data distribution 说明 与 示例

    一.官网说明 A datadistribution configuration is a one-to-many configuration. Oracle GoldenGatesupports sy ...

  5. Oracle Golden Gate 系列十一 -- 配置 GG DDL 同步 说明 与 示例

    一.DDL 说明 1.1 说明 这部分的说明,在系列四和系列六中已经说明: Oracle Golden Gate 系列六 --11gR2 Ora2Ora 单向复制GG 示例 www.2cto.com/ ...

  6. Oracle Golden Gate 11.2.0.3安装详解

    Oracle Golden Gate 11.2.0.3安装详解 环境 环境变量 安装OGG软件 开始OGG配置 配置源端数据库 源端OGG配置 配置目标端数据库 目标端OGG配置 开启同步 环境 ce ...

  7. Oracle Golden Gate 系列七 -- 配置 GG Manager process

    在上篇GG 单向复制的示例中,有配置Manager process,这篇具体来看一下Manager Process 的配置. Oracle Golden Gate 系列六 --11gR2 Ora2Or ...

  8. Oracle Golden Gate 系列十五 -- GG Trails 说明

    一.Trails 说明 理论知识在系列一里有说明,这里在拿出来看一下: Oracle Golden Gate 系列一 -- GG 架构 说明 http://blog.csdn.net/tianleso ...

  9. Oracle Golden Gate概要

    Oracle GoldenGate简介 Oracle Golden Gate用于源数据库与目标数据库的数据复制备份:可以在异构的环境(各种操作系统和数据库)之间实现数据亚秒级的实时复制备份:以及可以在 ...

最新文章

  1. python字符串input输入_5.print()函数、转义字符、python注释、常量、字符串、格式化输出、input()输入...
  2. 给Java程序员的Golang教程
  3. 类和类之间的关系解析-1
  4. python语言发明者 google_谷歌的语言何以战胜Python?50%的人都应该立即学习Golang...
  5. Virtual DOM 详解
  6. UITableView (4): 在TableView中移动cell和Section 从TableView中删除cell和section 添加系统默认刷新控件...
  7. python多进程卡死_Python 多进程中使用logging导致死锁
  8. 【网络信息安全】网络安全基础
  9. [原]VS2012入门图文教程——第一个程序Hello World
  10. 移动前端开发抓包调试工具fiddler使用教程
  11. css找某个元素的下个子元素,使用CSS获取特定位置的子元素
  12. 透视与3D(3D立方体)
  13. mysql的tps和qps_关于MySQL的TPS和QPS
  14. 小孔成像总结_备战中考|初中物理重要知识点总结,建议收藏!(下篇)
  15. 6-10 两个字符串穿插 (10分)pta,c
  16. Unity中利用NOPI读取Excel
  17. 用OpenSSL做自签名的证书(by quqi99)
  18. Ray----Tune(2):Tune的用户指南
  19. pgAdminIII简介
  20. oracle 单向同步 方案,使用Goldengate 实现Oracle for Oracle 单向数据同步

热门文章

  1. CPU存储器层次结构
  2. 基于leapmotion的手势识别---4种手势
  3. 聚类算法分类及如何选择某类方法
  4. 大型门户网站密码强度检验---强弱判断实施html代码
  5. Vue + Echart实现国省市县地图下钻
  6. mysql 8.0 命令行root无法登录
  7. 量子计算机优缺点,量子点电视优缺点
  8. ROS开发系列(7)- 在回调函数中发布topic
  9. bim机电软件的【快速立管】功能,快速立管
  10. 雍禾冲击“植发第一股”,烧钱式的营销能持续多久?