ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

如何实现两个数据库之间的同步

2021-06-07 14:07:44  阅读:196  来源: 互联网

标签:同步 数据库 Server 如何 发布 SQL 服务器



  1.   SyncNavigator是一款功能强大的数据库同步软件,适用于SQL SERVER, MySQL,具有自动/定时同步数据、无人值守、故障自动恢复、同构/异构数据库同步、断点续传和增量同步等功能,支持Windows xp以上所有操作系统,适用于大容量数据库快速同步。

    安装包下载地址:https://www.syncnavigator.cn/Setup.zip

    帮助文档地址:https://www.syncnavigator.cn/Help_zh-CN.chm

    Web文档地址:https://www.syncnavigator.cn/chm/index.htm


    SyncNavigator v8.6.2(数据库同步软件)下载地址


    SyncNavigator v8.6.2(数据库同步软件)下载地址


    创建第一个同步项目


    使用 HKROnline SyncNavigator 创建一个数据库同步项目。只需要通过简单的配置,创建完成后您可以随时执行数据库同步任务。

    1.点击 “SyncNavigator(Client)” 图标进入系统。

    2.在登录界面中输入连接到的服务器地址,点击 “确定” 按钮开始连接。

    下载网站:www.SyncNavigator.CN 
     客服QQ1793040
    ----------------------------------------------------------


    关于HKROnline SyncNavigator 注册机价格的问题

     

    HKROnline SyncNavigator 8.4.1 非破解版 注册机 授权激活教程

     

    最近一直在研究数据库同步的问题,在网上查了很多资料,也请教了很多人,找到了一种通过快照复制的方法。研究了一番后发现之前就是用的这个方法,效果不是很好,果断放弃。经过了一番寻觅和他人指点,最后从一位热心网友那里得知一款很好用的软件—— SyncNavigator。

    好东西就要拿出来跟大家分享,所以今天向大家介绍一下这款软件,及其一些使用方法。下面先看看它有什么强大的功能吧!

    SyncNavigator的基本功能:

    自动同步数据/定时同步数据
    无论是实时同步/24小时不间断同步,还是根据计划任务(每小时/每日/每周/等)定时自动同步都能完全胜任。

    完整支持 Microsoft SQL Server
    完整支持 Microsoft SQL Server 2000 2005 2008 数据库类型。并能在不同数据库版本之间相互同步数据。

    支持 MySQL 4.1 以上版本
    支持 MySQL 4.1 5.0 5.1 5.4 5.5。并能在不同数据库版本之间相互同步数据。

    无人值守和故障自动恢复
    当数据库故障或网络故障以后,无需人工干预(或操作)自动恢复同步并确保数据完全准确,可靠。

    同构数据库同步/异构数据库同步
    SQL Server to SQL Server, MySQL to MySQL, SQL Server to MySQL 等都能轻松实现。

    断点续传和增量同步
    当同步完成(或中断)后,再次同步时能继续上一次的位置增量同步,避免每次都需要从头开始的问题。

    创建一个同步项目

    安装完成后会有两个图标:

    1. 点击 "SyncNavigator (客户端)" 图标进入系统。

    2. 在登录界面中输入连接到的服务器地址,点击 "确定" 按钮开始连接。

    注意:这里不是登陆您的数据库,而是登陆到本软件的管理端。
    默认情况下直接点击 "连接" 按钮即可(本机默认已经安装)。
    默认服务器登录用户名为 "admin" 密码为空。
    本机服务器地址为 127.0.0.1 。
    您可以使用域名或者IP地址作为服务器地址。

    3. 切换到 "同步管理" 面板中点击 "新建" 按钮开始创建同步项目。

    4. 首先切换到 "来源数据库" 选项卡。填写同步的来源数据库信息。  (存放需要同步数据的数据库叫做来源数据库)

    一般情况下只需要输入数据库地址,数据库名称,登录用户名,登录密码。
    数据库地址: 来源数据所在机器的地址。可以是域名或者IP地址。
    数据库名称: 来源数据库名称。如果已经指定了默认的登录数据库可以为空。
    登录用户名: 登录数据库服务器使用的用户名。如果需要使用Windows账户登录请变更 "登录方式"
    连接测试: 测试输入的信息是否正确。如果连接失败则会返回具体错误信息。

    5. 切换到 "目标数据库" 选项卡。以相同的方式填写同步的目标数据库。

    目标数据可以像来源数据库那样选择已有的数据库,也可以通过本软件创建一个新的数据库,选择已有数据库步骤大致同上,新建数据库步骤如下:

    您只需要创建一个新的目标数据库,软件会自动创建最大兼容的表结构。
    如果您希望目标数据库与来源数据库表结构完全一致,您只需要在目标数据库创建一个空表结构即可。
    当您使用 MySQL 作为来源数据库时,同步的表至少需要一个主键。
    目标数据库不应包含外键约束,因为它可能导致部分数据无法同步。
    如果您的目标数据库与来源数据库结构(如字段类型,约束)不兼容,这可能导致部分数据无法同步。
    假设您设置来源库为 192.168.1.2 ,设置目标数据库为 192.168.1.3, 那么数据将从192.168.1.2 同步到 192.168.1.3。如果您的方向设置错误,可能会导致数据被覆盖。
    6. 切换到 "同步内容设置" 选项卡。选择需要同步的数据库表。

    如果需要设置每个表的具体内容可以点击 "详细设置" 按钮进行调整。
    您可以设置条件过滤。比如只查询评分大于90的表记录,或者隐藏不需要同步的字段。
    如果在这一个步骤未勾选任何表则不会同步任何内容。

    7. 点击 "确定"按钮完成项目设置。

    8. 切换到 "总控制台" 面板中选择需要开始同步的项目。点击 "开始" 按钮即可开始数据库同步。

    自动同步数据库数据

    使用 HKROnlineSyncNavigator 自动同步数据库数据。与谷歌日历、Hotmail日历等的操作非常类似,您只需要设置同步任务执行的时间系统便能在指定的时间自动运行。

    1. 在 "同步管理"面板中选择需要设置的项目,点击 "修改" 按钮开始设置。

  • 注意:这里不是登陆您的数据库,而是登陆到本软件的管理端。

  • 默认情况下直接点击 “连接” 按钮即可(本机默认已经安装)。

  • 默认服务器登录用户名为 “admin” 密码为空。

  • 本机服务器地址 = 127.0.0.1 。

  • 您可以使用域名或者IP地址作为服务器地址。如果指定了端口号可以使用 IP:Port 方式填写。

不同服务器数据库之间的数据操作

–创建链接服务器

execsp_addlinkedserver ‘ITSV ‘, ”, ‘SQLOLEDB ‘, ‘远程服务器名或ip地址 ‘

execsp_addlinkedsrvlogin ‘ITSV ‘, ‘false ‘,null, ‘用户名 ‘, ‘密码 ‘

–查询示例

select*fromITSV.数据库名.dbo.表名

–导入示例

select*into表 fromITSV.数据库名.dbo.表名

–以后不再使用时删除链接服务器

execsp_dropserver ‘ITSV ‘, ‘droplogins ‘

–连接远程/局域网数据(openrowset/openquery/opendatasource)

–1、openrowset

–查询示例

select*fromopenrowset( ‘SQLOLEDB ‘, ‘sql服务器名 ‘; ‘用户名 ‘; ‘密码 ‘,数据库名.dbo.表名)

–生成本地表

select*into表 fromopenrowset( ‘SQLOLEDB ‘, ‘sql服务器名 ‘; ‘用户名 ‘; ‘密码 ‘,数据库名.dbo.表名)

–把本地表导入远程表

insertopenrowset( ‘SQLOLEDB ‘, ‘sql服务器名 ‘; ‘用户名 ‘; ‘密码 ‘,数据库名.dbo.表名)

select*from本地表

–更新本地表

updateb

setb.列A=a.列A

fromopenrowset( ‘SQLOLEDB ‘, ‘sql服务器名 ‘; ‘用户名 ‘; ‘密码 ‘,数据库名.dbo.表名)asa innerjoin本地表 b

ona.column1=b.column1

–openquery用法需要创建一个连接

–首先创建一个连接创建链接服务器

execsp_addlinkedserver ‘ITSV ‘, ”, ‘SQLOLEDB ‘, ‘远程服务器名或ip地址 ‘

–查询

select*

FROMopenquery(ITSV, ‘SELECT * FROM 数据库.dbo.表名 ‘)

–把本地表导入远程表

insertopenquery(ITSV, ‘SELECT * FROM 数据库.dbo.表名 ‘)

select*from本地表

–更新本地表

updateb

setb.列B=a.列B

FROMopenquery(ITSV, ‘SELECT * FROM 数据库.dbo.表名 ‘) asa

innerjoin本地表 b ona.列A=b.列A

–3、opendatasource/openrowset

SELECT *

FROM opendatasource( ‘SQLOLEDB ‘, ‘Data Source=ip/ServerName;User ID=登陆名;Password=密码 ‘).test.dbo.roy_ta

–把本地表导入远程表

insertopendatasource( ‘SQLOLEDB ‘, ‘Data Source=ip/ServerName;User ID=登陆名;Password=密码 ‘).数据库.dbo.表名

select*from

用强制订阅实现数据库同步操作

大量和批量的数据可以用数据库的同步机制处理:

//

说明:

为方便操作,所有操作均在发布服务器(分发服务器)上操作,并使用推模式

在客户机器使用强制订阅方式。

有疑问联系作者:zlp321001@hotmail.com

测试通过

//

–1:环境

服务器环境:

机器名称: ZehuaDb

操作系统:Windows 2000Server

数据库版本:SQL 2000Server 个人版

客户端

机器名称:Zlp

操作系统:Windows 2000Server

数据库版本:SQL 2000Server 个人版

–2:建用户帐号

在服务器端建立域用户帐号

我的电脑管理->本地用户和组->用户->建立

UserName:zlp

UserPwd:zlp

–3:重新启动服务器MSSQLServer

我的电脑->控制面版->管理工具->服务->MSSQLServer 服务

(更改为:域用户帐号,我们新建的zlp用户 ./zlp,密码:zlp)

–4:安装分发服务器

A:配置分发服务器

工具->复制->配置发布、订阅服务器和分发->下一步->下一步(所有的均采用默认配置)

B:配置发布服务器

工具->复制->创建和管理发布->选择要发布的数据库(SZ)->下一步->快照发布->下一步->

选择要发布的内容->下一步->下一步->下一步->完成

C:强制配置订阅服务器(推模式,拉模式与此雷同)

工具->复制->配置发布、订阅服务器和分发->订阅服务器->新建->SQL Server数据库->输入客户端服务器名称(ZLP)->使用SQL Server 身份验证(sa,空密码)->确定->应用->确定

D:初始化订阅

复制监视器->发布服务器(ZEHUADB)->双击订阅->强制新建->下一步->选择启用的订阅服务器->ZLP->

下一步->下一步->下一步->下一步->完成

–5:测试配置是否成功

复制监视器->发布服务器(ZEHUADB)->双击SZ:SZ->点状态->点立即运行代理程序

查看:

复制监视器->发布服务器(ZEHUADB)->SZ:SZ->选择ZLP:SZ(类型强制)->鼠标右键->启动同步处理

如果没有错误标志(红色叉),恭喜您配置成功

–6:测试数据

–在服务器执行:

选择一个表,执行如下SQL

insertintoWQ_NEWSGROUP_S select’测试成功’,5

复制监视器->发布服务器(ZEHUADB)->SZ:SZ->快照->启动代理程序

->ZLP:SZ(强制)->启动同步处理

去查看同步的 WQ_NEWSGROUP_S 是否插入了一条新的记录

测试完毕,通过。

–7修改数据库的同步时间,一般选择夜晚执行数据库同步处理

(具体操作略) ????

/*

注意说明:

服务器一端不能以(local)进行数据的发布与分发,需要先删除注册,然后新建注册本地计算机名称

卸载方式:工具->复制->禁止发布->是在”ZehuaDb”上静止发布,卸载所有的数据库同步配置服务器

注意:发布服务器、分发服务器中的SQLServerAgent服务必须启动

采用推模式: “D:/Microsoft SQL Server/MSSQL/REPLDATA/unc” 目录文件可以不设置共享

拉模式:则需要共享~!

*/

少量数据库同步可以采用触发器实现,同步单表即可:

========================================================

配置过程中可能出现的问题,总结如下:(感谢作者: 余枫 提供的帮助)

========================================================

在SQL Server 2000里设置和使用数据库复制之前,应先检查相关的几台SQL Server服务器下面几点是否满足:

1、MSSQLserver和Sqlserveragent服务是否是以域用户身份启动并运行的(./administrator用户也是可以的)

如果登录用的是本地系统帐户local,将不具备网络功能,会产生以下错误:

进程未能连接到Distributor ‘@Server name’2、检查相关的几台SQL Server服务器是否改过名称(需要srvid=0的本地机器上srvname和datasource一样)

在查询分析器里执行:

usemaster

selectsrvid,srvname,datasource fromsysservers

如果没有srvid=0或者srvid=0(也就是本机器)但srvname和datasource不一样, 需要按如下方法修改:

USEmaster

GO

–设置两个变量

DECLARE@serverproperty_servername varchar(100),

@servername varchar(100)

–取得Windows NT 服务器和与指定的 SQL Server 实例关联的实例信息

SELECT@serverproperty_servername=CONVERT(varchar(100), SERVERPROPERTY(‘ServerName’))

–返回运行 Microsoft SQL Server 的本地服务器名称

SELECT@servername=CONVERT(varchar(100), @@SERVERNAME)

–显示获取的这两个参数

select@serverproperty_servername,@servername

–如果@serverproperty_servername和@servername不同(因为你改过计算机名字),再运行下面的

–删除错误的服务器名

EXECsp_dropserver @server=@servername

–添加正确的服务器名

EXECsp_addserver @server=@serverproperty_servername, @local=’local’

修改这项参数,需要重新启动MSSQLserver和Sqlserveragent服务才能生效。

这样一来就不会在创建复制的过程中出现18482、18483错误了。

3、检查SQL Server企业管理器里面相关的几台SQL Server注册名是否和上面第二点里介绍的srvname一样

不能用IP地址的注册名。

(我们可以删掉IP地址的注册,新建以SQL Server管理员级别的用户注册的服务器名)

这样一来就不会在创建复制的过程中出现14010、20084、18456、18482、18483错误了。

4、检查相关的几台SQL Server服务器网络是否能够正常访问

如果ping主机IP地址可以,但ping主机名不通的时候,需要在

winnt/system32/drivers/etc/hosts (WIN2000)

windows/system32/drivers/etc/hosts (WIN2003)

文件里写入数据库服务器IP地址和主机名的对应关系。

例如:

127.0.0.1 localhost

192.168.0.35 oracledb oracledb

192.168.0.65 fengyu02 fengyu02

202.84.10.193 bj_db bj_db

或者在SQL Server客户端网络实用工具里建立别名,例如:

5、系统需要的扩展存储过程是否存在(如果不存在,需要恢复):

sp_addextendedproc ‘xp_regenumvalues’,@dllname=’xpstar.dll’

go

sp_addextendedproc ‘xp_regdeletevalue’,@dllname=’xpstar.dll’

go

sp_addextendedproc ‘xp_regdeletekey’,@dllname=’xpstar.dll’

go

sp_addextendedproc xp_cmdshell ,@dllname=’xplog70.dll’

接下来就可以用SQL Server企业管理器里[复制]->右键选择

->[配置发布、订阅服务器和分发]的图形界面来配置数据库复制了。

下面是按顺序列出配置复制的步骤:

一、建立发布和分发服务器

[欢迎使用配置发布和分发向导]->[选择分发服务器]

->[使”@servername”成为它自己的分发服务器,SQL Server将创建分发数据库和日志]

->[制定快照文件夹]->[自定义配置]->[否,使用下列的默认配置]->[完成]

上述步骤完成后, 会在当前”@servername” SQL Server数据库里建立了一个distribion库和

一个distributor_admin管理员级别的用户(我们可以任意修改密码)

服务器上新增加了四个作业:

[代理程序历史记录清除: distribution ]

[分发清除: distribution ]

[复制代理程序检查 ]

[重新初始化存在数据验证失败的订阅 ]

SQL Server企业管理器里多了一个复制监视器, 当前的这台机器就可以发布、分发、订阅了。

我们再次在SQL Server企业管理器里[复制]->右键选择

->[配置发布、订阅服务器和分发],可以看到类似下图:

我们可以在 [发布服务器和分发服务器的属性]窗口

->[发布服务器]->[新增] ->[确定]

->[发布数据库]->[事务]/[合并]->[确定]

->[订阅服务器]->[新增] ->[确定]

把网络上的其它SQL Server服务器添加成为发布或者订阅服务器.

新增一台发布服务器的选项:

我这里新建立的JIN001发布服务器是用管理员级别的数据库用户test连接的,

到发布服务器的管理链接要输入密码的可选框, 默认的是选中的,

在新建的JIN001发布服务器上建立和分发服务器FENGYU/FENGYU的链接的时需要输入distributor_admin用户的密码

到发布服务器的管理链接要输入密码的可选框,也可以不选,

也就是不需要密码来建立发布到分发服务器的链接(这当然欠缺安全,在测试环境下可以使用)

新增一台订阅服务器的选项:

二、新建立的网络上另一台发布服务器(例如JIN001)选择分发服务器

[欢迎使用配置发布和分发向导]->[选择分发服务器]

->使用下列服务器(选定的服务器必须已配置为分发服务器) ->[选定服务器](例如FENGYU/FENGYU)

->[下一步]->[输入分发服务器(例如FENGYU/FENGYU)的distributor_admin用户的密码两次]

->[下一步]->[自定义配置]->[否,使用下列的默认配置]

->[下一步]->[完成]->[确定]

建立一个数据库复制发布的过程:

[复制]->[发布内容]->右键选择 ->[新建发布]

->[下一步]->[选择发布数据库]->[选中一个待发布的数据库]

->[下一步]->[选择发布类型]->[事务发布]/[合并发布]

->[下一步]->[指定订阅服务器的类型]->[运行SQL Server 2000的服务器]

->[下一步]->[指定项目]->[在事务发布中只可以发布带主键的表]->[选中一个有主键的待发布的表]

->[在合并发布中会给表增加唯一性索引和 ROWGUIDCOL 属性的唯一标识符字段[rowguid],默认值是newid()]

(添加新列将: 导致不带列列表的 INSERT语句失败,增加表的大小,增加生成第一个快照所要求的时间)

->[选中一个待发布的表]

->[下一步]->[选择发布名称和描述]->

->[下一步]->[自定义发布的属性]->[否,根据指定方式创建发布]

->[下一步]->[完成]->[关闭]

发布属性里有很多有用的选项:设定订阅到期(例如24小时)

设定发布表的项目属性:

常规窗口可以指定发布目的表的名称,可以跟原来的表名称不一样。

下图是命令和快照窗口的栏目

( SQL Server 数据库复制技术实际上是用insert,update,delete操作在订阅服务器上重做发布服务器上的事务操作

看文档资料需要把发布数据库设成完全恢复模式,事务才不会丢失

但我自己在测试中发现发布数据库是简单恢复模式下,每10秒生成一些大事务,10分钟后再收缩数据库日志,

这期间发布和订阅服务器上的作业都暂停,暂停恢复后并没有丢失任何事务更改 )

发布表可以做数据筛选,例如只选择表里面的部分列:

例如只选择表里某些符合条件的记录, 我们可以手工编写筛选的SQL语句:

发布表的订阅选项,并可以建立强制订阅:

成功建立了发布以后,发布服务器上新增加了一个作业: [失效订阅清除 ]

分发服务器上新增加了两个作业:

[JIN001-dack-dack-5 ]类型[REPL快照 ]

[JIN001-dack-3 ] 类型[REPL日志读取器 ]

上面蓝色字的名称会根据发布服务器名,发布名及第几次发布而使用不同的编号

REPL快照作业是SQL Server复制的前提条件,它会先把发布的表结构,数据,索引,约束等生成到发布服务器的OS目录下文件

(当有订阅的时候才会生成, 当订阅请求初始化或者按照某个时间表调度生成)

REPL日志读取器在事务复制的时候是一直处于运行状态。(在合并复制的时候可以根据调度的时间表来运行)

建立一个数据库复制订阅的过程:

[复制]->[订阅]->右键选择 ->[新建请求订阅]

->[下一步]->[查找发布]->[查看已注册服务器所做的发布]

->[下一步]->[选择发布]->[选中已经建立发布服务器上的数据库发布名]

->[下一步]->[指定同步代理程序登录]->[当代理程序连接到代理服务器时:使用SQL Server身份验证]

(输入发布服务器上distributor_admin用户名和密码)

->[下一步]->[选择目的数据库]->[选择在其中创建订阅的数据库名]/[也可以新建一个库名]

->[下一步]->[允许匿名订阅]->[是,生成匿名订阅]

->[下一步]->[初始化订阅]->[是,初始化架构和数据]

->[下一步]->[快照传送]->[使用该发布的默认快照文件夹中的快照文件]

(订阅服务器要能访问发布服务器的REPLDATA文件夹,如果有问题,可以手工设置网络共享及共享权限)

->[下一步]->[快照传送]->[使用该发布的默认快照文件夹中的快照文件]

->[下一步]->[设置分发代理程序调度]->[使用下列调度]->[更改]->[例如每五分钟调度一次]

->[下一步]->[启动要求的服务]->[该订阅要求在发布服务器上运行SQLServerAgent服务]

->[下一步]->[完成]->[确定]

成功建立了订阅后,订阅服务器上新增加了一个类别是[REPL-分发]作业(合并复制的时候类别是[REPL-合并])

它会按照我们给的时间调度表运行数据库同步复制的作业

查看它的历史记录运行情况,例图

在分发服务器的[复制监视器]->[发布服务器]->[发布名称]->[日志读取器]->右键选择->[代理程序历史记录], 例图:

(如果您的服务器已经用了SQL Server全文检索服务, 请不要修改MSSQLserver和Sqlserveragent服务的local启动。 会照成全文检索服务不能用。请换另外一台机器来做SQL Server 2000里复制中的分发服务器。) 修改服务启动的登录用户,需要重新启动MSSQLserver和Sqlserveragent服务才能生效。

四、删除已经建好的发布和定阅可以直接用delete删除按钮

我们最好总是按先删定阅,再删发布,最后禁用发布的顺序来操作。

如果要彻底删去SQL Server上面的复制设置, 可以这样操作:

[复制]->右键选择 [禁用发布]->[欢迎使用禁用发布和分发向导]

->[下一步]->[禁用发布]->[要在”@servername”上禁用发布]

->[下一步]->[完成禁用发布和分发向导]->[完成]

我们也可以用T-SQL命令来完成复制中发布及订阅的创建和删除, 选中已经设好的发布和订阅, 按属标右键

可以[生成SQL脚本]。(这里就不详细讲了, 后面推荐的网站内有比较详细的内容)

当你试图删除或者变更一个table时,出现以下错误

Server: Msg 3724, Level16, State 2, Line 1

Cannot dropthe table’object_name’because it isbeing used forreplication.

比较典型的情况是该table曾经用于复制,但是后来又删除了复制

处理办法:

select*fromsysobjects wherereplinfo >’0′

sp_configure ‘allow updates’, 1

go

reconfigurewithoverride

go

begintransaction

updatesysobjects setreplinfo =’0’wherereplinfo >’0′

committransaction

go

rollbacktransaction

go

sp_configure ‘allow updates’, 0

go

reconfigurewithoverride

go

疑问:

在合并复制配置完全后,如果同步代理停止了。我要在程序中去重新启动合并复制的同步代理。请问使用什么命令或存储过程呢?

解决办法:(朱二)

sp_start_job

指示 SQL Server 代理程序立即执行作业。

示例

下例启动名为 Nightly Backup的作业。

USEmsdb

EXECsp_start_job @job_name=’Nightly Backup

标签:同步,数据库,Server,如何,发布,SQL,服务器
来源: https://blog.51cto.com/u_14989677/2875613

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有