加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ogg112101同构部署for_oracle11gr2

发布时间:2020-12-12 12:38:07 所属栏目:百科 来源:网络整理
导读:2.1创建ogg操作系统用户: useradd -u 1003 -g oinstall -G dba ogg passwd ogg ? --源端开启归档,若归档路径不设置则pump进程启动报错 su - oracle mkdir archivelog sqlplus / as sysdba alter system set log_archive_dest_1=‘location=/home/oracle/ar

2.1创建ogg操作系统用户:

useradd -u 1003 -g oinstall -G dba ogg

passwd ogg

?

--源端开启归档,若归档路径不设置则pump进程启动报错

su - oracle

mkdir archivelog

sqlplus / as sysdba

alter system set log_archive_dest_1=‘location=/home/oracle/archivelog‘;

shutdown immediate;

startup mount;

alter database archivelog;

alter database open;

alter system switch logfile;

/

archive log list;

exit

?

2.2修改ogg操作系统用户环境变量,并链接oracle用户环境变量,修改实例名为jvm

vi /home/ogg/.bash_profile

?

export ORACLE_SID=orcl

export ORACLE_BASE=/home/oracle/app/oracle

export ORACLE_HOME=/home/oracle/app/oracle/product/11.2.0/dbhome_1

export OGG_HOME=/ogg

export PATH=$ORACLE_HOME/bin:/usr/sbin:$ORACLE_HOME/OPatch:$ORACLE_HOME/jdk/bin:$PATH:/ogg:$PATH

export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib:/ogg

?

--运行生效

. /home/ogg/.bash_profile

?

2.3创建OGG安装目录?

--两台服务器都需要做同样的操作。

mkdir /ogg

chown -R ogg:oinstall /ogg

--chmod 770 -R /ogg

--让ogg用户可以访问oracle用户的sqlplus和lsnrctl

chmod 770 /home/oracle

?

2.4上传ogg介质

--将ogg安装文件上传到2台服务器的ogg操作系统用户的家目录(默认为/home/ogg)

su - ogg

unzip ogg112101_fbo_ggs_Linux_x64_ora11g_64bit.zip

tar -xvf fbo_ggs_Linux_x64_ora11g_64bit.tar -C /ogg/

--GGSCI (dbdream) 2> DBLOGIN USERID ogg,PASSWORD oracle无权限

?

2.5登录OGG测试?

cd /ogg

./ggsci

--创建OGG的管理目录

--源端:

./ggsci

create subdirs

--查询管理目录是否创建

show

--目标端:

./ggsci?

create subdirs

show

exit

?

2.6建立OGG表空间,以ogg用户执行

sqlplus / as sysdba

--ORACLE建议使用单独的表空间存放OGG数据,表空间大小50M就可以,但是最好设置数据文件的自动扩展。?

create tablespace ogg datafile ‘/home/oracle/ogg01.dbf‘ size 50M autoextend on;?

?

2.7创建OGG用户?

create user ogg identified by oracle default tablespace ogg;?

?

2.8为OGG用户授权?

--OGG用户需要以下权限,也有人为了省事,直接给OGG用户DBA权限。?

--不同的需求,OGG用户需要的权限也不一样,上面的权限基本可以支持大多数情况的数据复制,如权限不足,需根据实际需求授权

grant CONNECT,RESOURCE to ogg;?

grant ALTER ANY TABLE to ogg;?

grant FLASHBACK ANY TABLE to ogg;?

grant EXECUTE on DBMS_FLASHBACK to ogg;?

grant SELECT ANY DICTIONARY to ogg;?

grant SELECT ANY TABLE to ogg;?

grant insert any table to ogg;?

grant update any table to ogg;?

grant delete any table to ogg;

?

2.9打开数据库的附加日志和force log?

alter database force logging;?

alter database add SUPPLEMENTAL log data;?

select NAME,OPEN_MODE,FORCE_LOGGING,SUPPLEMENTAL_LOG_DATA_MIN from v$database;?

?

2.10运行OGG支持DDL脚本

/*

--不确定兼容性,先不执行,否则ddl_setup.sql可能会报错而导致无法create user:ORA-04098:trigger ‘SYS.GGS_DDL_TRIGGER_BEFORE‘ is invalid and failed

--如果要让OGG支持DDL操作,源端与目标端都需要运行

--验证ogg用户调用sqlplus时对脚本marker_status.sql的访问权限

sqlplus / as sysdba?

@/ogg/marker_setup.sql?

@/ogg/ddl_setup.sql?

@/ogg/role_setup.sql?

@/ogg/ddl_enable.sql?

?

--主库配置ddl参考

主库 执行DDL配置脚本

sqlplus / as sysdba

--oracle11.2.0.4报错:SP2-0310:unable to pen file:"marker_status.sql"

SQL> @/opt/app/OGG/marker_setup.sql?

输入OGG管理用户名:ogg

?

SQL> @/opt/app/OGG/ddl_setup.sql?

输入OGG管理用户名:ogg

注意1:此处可能会报错:ORA-04098: trigger ‘SYS.GGS_DDL_TRIGGER_BEFORE‘ is invalid and failed,同时OGG中的很多表和视图无法创建,原因主要由于OGG缺少权限引起,即便有

DBA权限也是不足的(OGG BUG),可以通过如下方法修复:

1)先将触发器关闭,否则执行任何sql都会包ORA-04098的错误

@/opt/app/OGG/ddl_disable.sql

2)赋予ogg对应权限

grant execute on utl_file to ogg;

grant restricted session to ogg;

GRANT CREATE TABLE,CREATE SEQUENCE TO OGG;

3)重新执行ddl_setup.sql

?

注意2:当主库上有很多应用连接时,执行该sql会出现如下报警:

IMPORTANT: Oracle sessions that used or may use DDL must be disconnected. If you

continue,some of these sessions may cause DDL to fail with ORA-6508.

To proceed,enter yes. To stop installation,enter no.

Enter yes or no:

为了不影响主库,选no,选择一个时间点,停止应用再创建ddl。

如果不创建ddl,需要在主备库的ogg进程参数中添加truncate选项:

gettruncates,参考后面同步进程配置。

?

SQL> @/opt/app/OGG/role_setup.sql?

输入OGG管理用户名:ogg

SQL> GRANT GGS_GGSUSER_ROLE TO OGG;?

SQL> @/opt/app/OGG/ddl_enable.sql?

*/

?

2.12 OGG复制流程?

--先看下OGG的复制流程,OGG和其他传统复制软件一样,也是通过源端捕获/挖掘ORACLE的日志信息,?

--目标端根据源端传送过来的日志信息进行重塑,实现源端-目标端数据同步

--只有commit之后的日志信息才会被Capture进程捕获,未提交的事务OGG不会捕获。?

2.13建立测试表,含主键

create user test identified by oracle;

grant dba to test;

create table test.test_ogg(id number primary key,name varchar2(20));

create table test.dep_ogg(depno number primary key,depname varchar2(20));

insert into test.test_ogg values(1,‘zyj‘);

insert into test.dep_ogg values(1,‘imp‘);

commit;

?

--目标端建立EMP_OGG和DEPT_OGG测试表

create user test identified by oracle;

grant dba to test;

create table test.test_ogg(id number primary key,depname varchar2(20));

?

2.14源端添加表级TRANDATA?

--将哪些用户的哪些表和目标库同步,其实也是添加表级的supplemental log,但是只有上文打开的minimal supplemental log后,这个才生效

cd /ogg

./ggsci

DBLOGIN USERID ogg,PASSWORD oracle?

add trandata test.test_ogg?

add trandata test.dep_ogg?

INFO TRANDATA test.*?

?

2.15配置MGR管理进程?

--源端:?

EDIT PARAMS MGR?

?

PORT 7809?

PURGEOLDEXTRACTS /ogg/dirdat,USECHECKPOINTS?

?

--目标端: 可以添加 DYNAMICPORTLIST 7840-7850

EDIT PARAMS MGR?

?

PORT 7809?

PURGEOLDEXTRACTS /ogg/dirdat,USECHECKPOINTS?

?

--参数说明:?

PORT 7809:OGG管理进程监控端口。?

PURGEOLDEXTRACTS:清除不需要的trail文件。?

/ogg/dirdat:trail文件存放位置。?

USECHECKPOINTS:使用检查点队列。

?

--置完MGR管理进程后,就可以启动MGR管理进程(源端和目标端都需要启动)。?

start mgr

info mgr

?

2.16配置初始化数据进程?

ADD EXTRACT EINI_1,SOURCEISTABLE?

INFO EXTRACT *,TASKS?

EDIT PARAMS EINI_1?

?

EXTRACT EINI_1?

SETENV (NLS_LANG=AMERICAN_AMERICA.AL32UTF8)?

USERID ogg,PASSWORD oracle?

RMTHOST 192.168.92.101,MGRPORT 7809?

RMTTASK REPLICAT,GROUP RINI_1?

TABLE test.test_ogg;

TABLE test.dep_ogg;

?

--参数介绍:?

EXTRACT EINI_1:说明这是EXTRACT进程,名字是EINI_1?

SETENV:环境变量,一定要设置和数据库字符集一样,否则可能会乱码?

USERID:数据库OGG用户?

PASSWORD:数据库用户OGG的密码?

RMTHOST:目标端地址,如果在/etc/hosts文件里已经设置解析,可以写主机名?

MGRPORT:目标端MGR管理进程监听的端口?

RMTTASK REPLICAT:目标端REPLICAT应用进程的组和名字?

TABLE:源端要初始化数据的表的名字 编辑好捕获进程EINI_1后,还需要在目标端配置REPLICAT应用进程,名字要和源端的捕获进程EINI_1里面RMTTASK REPLICAT参数配置的一样,也就是还需要在目标端配置RMTTASK REPLICAT RINI_1。?

?

2.17配置目标端初始化REPLICAT进程?

--目标端:?

--HANDLECOLLISIONS 配置dml

ADD REPLICAT RINI_1,SPECIALRUN

EDIT PARAMS RINI_1?

?

REPLICAT RINI_1?

SETENV (NLS_LANG=AMERICAN_AMERICA.AL32UTF8)?

ASSUMETARGETDEFS?

HANDLECOLLISIONS

USERID ogg,PASSWORD oracle

DISCARDFILE /ogg/dirrpt/RINIaa.dsc,PURGE?

MAP test.test_ogg,TARGET test.test_ogg;?

MAP test.dep_ogg,TARGET test.dep_ogg;?

?

--参数介绍:?

REPLICAT RINI_1:说明这是REPLICAT应用进程,名字叫RINI_1?

SETENV:语言变量,同捕获进程EINI_1?

ASSUMETARGETDEFS:告诉OGG目标端和源端需要同步的表的结构完全一致,不需要OGG去检查表的结构,包括表名、字段名、字段类型、字段长度等,如果目标端和源端同步的表的结构不一样,需要使用SOURCEDEFS参数,详见OGG官方文档。?

USERID、PASSWORD:同捕获进程EINI_1参数介绍?

DISCARDFILE:错误信息存放位置及命名规则?

MAP:源端捕获的表的名字?

TARGET:目标端同步的表的名字,可以不在同一SCHEMA。?

?

2.18初始化数据?

--启动源端的捕获进程,而目标端的应用进程RINI_1,不需要手动去启动

START EXTRACT EINI_1?

VIEW REPORT EINI_1?

?

--如果日志的最后部分出现ERROR,就需要去检查OGG的安装目录下的ggserr.log日志,这个日志相当于数据库的告警日志。?

Output to RINI_1:?

From Table SCOTT.EMP_OGG:?

# inserts: 14?

# updates: 0?

# deletes: 0?

# discards: 0?

From Table SCOTT.DEPT_OGG:?

# inserts: 4?

# updates: 0?

# deletes: 0?

# discards: 0?

REDO Log Statistics?

Bytes parsed 0?

Bytes output 3056?

?

2.19验证初始化数据?

--登录目标端数据库,查看初始化是否成功。?

select * from test.emp_ogg;?

select * from test.dep_ogg;?

?

--初始化之后,上文提到的初始化进程(EINI_1、RINI_1)自动停止,因为通常情况下初始化数据工作只会做一次。可以通过INFO命令查看进程的状态

--源端:?

INFO EXTRACT EINI_1?

?

--目标端:?

INFO REPLICAT RINI_1?

?

2.20源端和目标端配置OGG的检查点?

--此步骤不是必须的,但是为了让OGG网络中断、服务器宕机、掉电等在突发情况也能正确断点续传

--源端和目标端都需配置。?

EDIT PARAMS ./GLOBALS?

?

CHECKPOINTTABLE ogg.ggschkpt?

?

--需要使用OGG用户登录数据库,创建检查点表ogg.ggschkpt,此时需要退出OGG,重新登录,否则可能会遇到下面的错误。?

GGSCI (stream) 4> ADD CHECKPOINTTABLE?

ERROR: Missing checkpoint table specification.?

?

--退出OGG,重新登录,并使用OGG用户登录数据库,源端和目标端都需要执行。?

exit?

./ggsci?

DBLOGIN USERID ogg,PASSWORD oracle?

--只需要执行ADD CHECKPOINTTABLE命令,OGG会自动在ORACLE的OGG用户下创建检查点,源端和目标端都需要执行。?

ADD CHECKPOINTTABLE?

--若需要删除检查点表

--delete checkpointtable

?

--此时用OGG登录数据库,就可以看到OGG创建的检查点表

conn ogg/oracle?

select * from tab;?

?

/*

--若用expdp初始化数据

su - oracle

mkdir -p /home/oracle/dumpdir

sqlplus / as sysdba

create or replace directory dump as ‘/home/oracle/dumpdir‘;

grant read,write on directory dump to public;

?

--初始化数据(source)

select current_scn from v$database;

SELECT DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER? FROM DUAL;

?

--使用exp或expdp导出数据,对于导出用户需要具备DBMS_FLASHBACK包的执行权限

GRANT EXECUTE ON DBMS_FLASHBACK TO test;

?

exp system/[email?protected] file=test_SBDC_4ZBR2HA47OTD67UM.dmp log=test_SBDC_4ZBR2HA47OTD67UM.log tables=test.SBDC_4ZBR2HA47OTD67UM feedback=1000 flashback_scn=1102175

scp test_SBDC_4ZBR2HA47OTD67UM.dmp [email?protected]:/home/oracle

--delete from test.SBDC_4ZBR2HA47OTD67UM;

--commit;

imp system/[email?protected] file=test_SBDC_4ZBR2HA47OTD67UM.dmp log=test_SBDC_4ZBR2HA47OTD67UM.log tables=test.SBDC_4ZBR2HA47OTD67UM data_only=y feedback=1000

?

--或者用expdp

expdp ‘system/[email?protected]‘ directory=dump dumpfile=SBDC_4ZBR2HA47OTD67UM_1.dmp tables=test.SBDC_4ZBR2HA47OTD67UM flashback_scn=1102175

scp /home/oracle/dumpdir/SBDC_4ZBR2HA47OTD67UM_1.dmp [email?protected]:/home/oracle/dumpdir

--delete from test.SBDC_4ZBR2HA47OTD67UM;

--commit;

impdp ‘system/[email?protected]‘ directory=dump dumpfile=SBDC_4ZBR2HA47OTD67UM_1.dmp tables=test.SBDC_4ZBR2HA47OTD67UM content=data_only

*/

?

2.21源端配置捕获进程?

--现在已经可以配置数据同步了,下面在源端配置捕获进程。?

--参数介绍:?

--以上参数基本都在上文提过,这里不在重复,说下EXTTRAIL参数,EXTTRAIL参数是TRAIL队列文件存放的路径和命名格式,

--TRAIL文件可以理解为存放捕获进程捕获的日志文件。此时还需要将捕获进程EORA_1添加到OGG

--keycols若不制定则默认为所有列,仍可支持无主键的表update同步

--table IJX130355.T_BESNS_INTEGRAL_RG,keycols (LOGDATE,STUDENT_ID);

EDIT PARAMS EORA_1?

?

EXTRACT EORA_1?

SETENV (NLS_LANG=AMERICAN_AMERICA.AL32UTF8)?

USERID ogg,PASSWORD oracle?

EXTTRAIL /ogg/dirdat/aa?

TABLE test.test_ogg;?

TABLE test.dep_ogg;

?

--捕获进程从启动起开始捕获,捕获数据保存到TRAIL文件,及TRAIL文件的路径、命名格式,单个TRAIL文件最大大小。

ADD EXTRACT EORA_1,TRANLOG,BEGIN NOW?

ADD EXTTRAIL /ogg/dirdat/aa,EXTRACT EORA_1,MEGABYTES 5?

START EXTRACT EORA_1?

INFO EXTRACT EORA_1?

?

2.22源端配置PUMP传输进程?

--此步骤也是非必须的,如果不配置传输进程,OGG会通过EXTRACT进程传输TRAIL队列文件,但是和检查点队列一样,为了保证断点续传ORACLE建议配置PUMP传输进程。?

EDIT PARAMS PORA_1?

?

EXTRACT PORA_1?

SETENV (NLS_LANG=AMERICAN_AMERICA.AL32UTF8)?

PASSTHRU?

RMTHOST 192.168.92.101,MGRPORT 7809?

RMTTRAIL /ogg/dirdat/pa?

TABLE test.test_ogg;?

TABLE test.dep_ogg;?

?

--添加PUMP进程PORA_1到OGG,并指定本地的TRAIL文件。?

ADD EXTRACT PORA_1,EXTTRAILSOURCE /ogg/dirdat/aa?

INFO EXTRACT PORA_1?

--为PUMP进程PORA_1指定将本地TRAIL文件传输到目标端后保存成目标端TRAIL文件的名字。?

ADD RMTTRAIL /ogg/dirdat/pa,EXTRACT PORA_1,MEGABYTES 5?

START EXTRACT PORA_1?

INFO EXTRACT PORA_1?

--此时在目标端/ogg/dirdat/目录下,就会看到由源端PUMP进程PORA_1传输过来的TRAIL文件。?

SQL> ho ls -l /ogg/dirdat

pa000000?

?

DBLOGIN USERID ogg,PASSWORD oracle?

VIEW REPORT EORA_1

VIEW REPORT PORA_1

?

2.23目标端配置同步进程RORA_1。若报错表test.SYS_EXPORT_不存在,则添加 mapexclude test.SYS_EXPORT_*;

--HANDLECOLLISIONS? 配置dml同步

--ADD REPLICAT RORA_1,SPECIALRUN?

--add replicat rotomy,exttrail ./dirdat/rm,checkpointtable test.chkpt

--不需要追加checkpointtable ogg.CHECKTABLE,默认用前面创建的checkpointtable

add replicat RORA_1,exttrail /ogg/dirdat/pa

EDIT PARAMS RORA_1?

?

REPLICAT RORA_1?

SETENV (NLS_LANG=AMERICAN_AMERICA.AL32UTF8)?

USERID ogg,PASSWORD oracle?

HANDLECOLLISIONS?

ASSUMETARGETDEFS?

DISCARDFILE /ogg/dirrpt/RORA_aa.DSC,TARGET test.dep_ogg;?

?

--目标端编辑同步进程RORA_1后,就可以启动RORA_1进程。?

START REPLICAT RORA_1?

--alter replicat repfull,extseqno 1,extrba 0

--alter replicat RORA_1,extrba 0

?

INFO REPLICAT RORA_1

--ERROR OGG-00446 Invalid data source -1 in checkpoint file /u01/app/ogg/dirchk/RORA_1.cpr.

DBLOGIN USERID ogg,PASSWORD ogg?

VIEW REPORT RORA_1

--若报错无检查表,则创建

--ERROR OGG-00446 Checkpoint table ogg.CHECKTABLE does not exist.Please create the table or recreate the RORA_1 group using the correct table.

ADD CHECKPOINTTABLE ogg.CHECKTABLE

?

--查询进程状态

status pora_1

--查询进程传输数据信息

stats pora_1

--source process

INFO EXTRACT EORA_1?

INFO EXTRACT PORA_1?

VIEW REPORT EORA_1

VIEW REPORT PORA_1

?

info extract E1,showch

info extract E1,detail

?

--常用维护命令

alter EXTRACT EXT_TC etrollover

--ETROLLOVER needed to convert 6 digit checkpoint to 9 digits as well as GG version 12.2

alter ext E1 etrollover

info extract E1,detail

info extract E1,showch

alter ext P1,extseqno xx,extrba 0

--查询错误日志

tail -f ggserr.log

?

3. 验证OGG复制

--测试DML和DDL

insert into test.test_ogg select 2,‘n1‘ from dual;

commit;

?

insert into test.test_ogg select 3,‘n3‘ from dual;

commit;

?

update test.test_ogg set name=‘n2‘ where id=2;

commit;

?

delete from test.test_ogg t where id=2;

commit;

?

select * from test.test_ogg;

?

--

insert into test.dep_ogg select 2,‘d1‘ from dual;

commit;

?

insert into test.dep_ogg select 3,‘d3‘ from dual;

commit;

?

update test.dep_ogg set DEPNAME=‘d2‘ where depno=2;

commit;

?

delete from test.dep_ogg t where depno=2;

commit;

?

select * from test.dep_ogg;

?

------------------------------------------------------------------------------------------------

OGG配置文件—MANAGER

一、PORT

对于需要与远程进程要求动态服务的交互管理进程,使用PORT参数去指定一个TCP/IP端口号,常用于初始化加载复制或者采集进程。也可以使用默认的端口。请保证这些端口没有受到防火墙等设备的阻挡

port 7809

?

二、DYNAMICPORTLIST

使用DYNAMICPORTLIST参数去指定一个可用端口列表,它可使用于以下本地OGG进程对于与远程OGG进程通信的绑定。

采集器(Collector):与远程抽取进程通信进行获取输入数据。

复制器(Replicat):与远程抽取进程通信获取数据在初始化载入任务时。

过时抽取(Passive Extract):与远程收集器通信

GGSCI:输入远程命令

指定足够端口去容纳进程数的扩张不需要停止和重启管理器去将它们添加到列表里。你可以指定一个私有的端口,范围端口或者两者都可以。

<port>一端口号可以被分配的。最大的端口条目数是5000。

#指定多个端口,使用一个,分隔,比如:

dynamicportlist 7830,7833

#指定范围端口,使用-去分离第一个和最后一个端口。在-前后不要隔开它们。比如

dynamicportlist 7830-7835

#指定一范围端口加上一个独立端口,放置一个,在范围和独占端口之间,比如:

dynamicportlist 7830-7835,7839

?

三、AUTOSTART

当管理器启动时使用AUTOSTART参数去启动一些或多个抽取和复制进程。AUTOSTART确保没有进程组会被忽略并且在启动时候同步激活的。

你可以使用多个AUTOSTART语句在同个参数文件。在PASSIVE模式对于抽取组使用此参数,在位于并相关EXTRACT GROUP相关的目标系统的管理器。OGG将发送启动命令到源系统,如果AUTOSTART是在本地应用对于一PASSIVE EXTRACT组,它将被忽略的。

如果管理器遇到违反规定的事务导致重启,它将不会重启EXTRACT。而是将记录一个警告日志并通知你。这个日志使用 SEND EXTRACT的ETROLLOVER选项,这样它跳过导致错误的事务提高了日志的跟踪能力。

默认选项:NOT AUTOSTART

EXTRACT:抽取进程

REPLICAT:复制器进程

ER (Extract and Replicat):以上两者

一组名或者通配符指向的多个组。当通配符使用时,OGG重启指定进程类型的所有组,这些组在本地系统上满足通通符的匹配。但这些不能在PASSIVE模式下。

?

四、AUTORESTART

语法:AUTORESTART EXTRACT *,RETRIES <x>,WAITMINUTES <y>,RESETMINUTES <z>

RETRIES:尝试次数

WAITMINUTES:每次间隔时间长度

RESETMINUTES:多长时间后清零

?

五、PURGEOLDEXTRACTS

定期清理trail文件设置

语法:PURGEOLDEXTRACTS <path to the trail file>,USECHECKPOINTS,MINKEEPHOURS <"x" hours> MINKEEPFILES <"y" number of files>

?

六、REPORT & INFO & CRITICAL

表示MGR进程每隔 x 小时/分钟,检查EXTRACT的延迟情况

LAGREPORTHOURS/LAGREPORTMINUTES <x>?

如果超过了 y 小时/分钟,就把延迟作为信息记录到错误日志中

LAGINFOHOURS/LAGINFOMINUTES <y>

如果延迟超过了z 小时/分钟,则把它作为警告写到错误日志中

LAGCRITICALHOURS/LAGCRITICALMINUTES <z>

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读