OCP课程61:管理II之复制数据库

课程目标:

  • 创建复制数据库的目的
  • 为复制数据库选择一种技术
  • 使用RMAN复制数据库
  • 使用RMAN备份复制数据库
  • 基于运行实例复制数据库

1、使用复制数据库

clipboard

? 使用副本数据库可执行以下任务:

– 测试备份和恢复过程

– 测试升级到新版本的Oracle数据库
– 测试应用程序的变化对数据库性能的影响

– 通过创建导出文件并将对象导入生产数据库来恢复对象

? 创建副本数据库:

– 使用RMAN 的DUPLICATE命令

– 在同一主机上或在不同的主机上

– 包含与源相同的内容或源的子集

– 对于基于备份的复制,是通过辅助通道执行的

– 对于活动的数据库复制,是通过目标通道执行的

使用副本数据库

副本数据库是你的目标数据库的副本,它具有一个新的唯一数据库标识符(DBID)。通过独立运行副本数据库(不依赖目标数据库)可执行以下任务:

? 测试备份和恢复过程。

?测试升级到新版本的Oracle数据库。
?测试应用程序的变化对数据库性能的影响。

? 创建包含副本数据库中对象的导出文件并将这些对象导入生产数据库,恢复不小心从目标数据库中删除的对象。尽管你可能发现闪回查询、闪回删除和闪回表是用来恢复对象的更简单快速的解决方案。

创建副本数据库:

? 可以使用RMAN 的DUPLICATE命令在同一主机上或不同的主机上创建副本数据库。

? 副本数据库可包含与源数据库相同的内容或仅包含源数据库的子集。

? 复制的主要工作是由辅助通道执行的。对于基于备份的复制,这些通道对应于目标主机上的辅助实例上的服务器会话。

? 对于活动数据库复制,由目标通道执行将数据文件副本推入到辅助实例的工作。

2、选择数据库复制技术

clipboard[1]

选择复制数据库的方法 - 始终连接到辅助实例:

可将源数据库复制到位于同一计算机或其它计算机上的目标数据库。与副本数据库关联的数据库实例称为辅助实例。所有复制方法都需要连接到辅助实例。此图表显示了以下数据库复制方法:

? 从活动数据库,连接到目标实例和辅助实例

? 从备份,连接到目标实例和辅助实例

? 从备份,连接到辅助实例,不连接到目标实例,但具有恢复目录连接

? 从备份,连接到辅助实例,不连接到目标实例和恢复目录

3、复制活动数据库

clipboard[2]

? 使用网络(不需要备份)

? 包括自定义SPFILE

? 通过Oracle Enterprise Manager 或RMAN 命令行

复制活动数据库

通过使用Oracle Enterprise Manager 或RMAN DUPLICATE命令的FROM ACTIVE DATABASE子句,可以指示源数据库直接将映像副本和归档日志副本复制到辅助实例。

此操作不需要使用备份。RMAN 作为TARGET连接到源数据库实例并作为AUXILIARY连接到辅助实例。

通过实例间的网络连接将数据库文件从源数据库复制到目标数据库或辅助实例。RMAN 随后使用“内存脚本”(仅包含在内存中)完成恢复并打开数据库。

4、使用目标连接复制一个数据库

clipboard[3]

? 连接到目标数据库(源数据库)

? 连接到辅助实例

? 可选,连接到恢复目录(或使用目标控制文件)

通过目标连接复制数据库

当通过目标数据库连接复制数据库时,RMAN 可从目标数据库控制文件或从恢复目录获取有关备份的元数据。

此图表描述了通过目标连接执行的基于备份的复制。RMAN 连接到源数据库实例和辅助实例。此外,RMAN 还可以连接到恢复目录数据库(图中未显示)。目标主机必须具有对创建副本数据库所需的RMAN 备份的访问权限。

5、不使用目标连接,使用恢复目录复制一个数据库

clipboard[4]

? 连接到备份元数据的恢复目录

? 连接到辅助实例,该实例必须具有对RMAN 备份的访问权限

在没有目标连接的情况下复制数据库

如果在复制数据库时没有连接到目标数据库,但具有恢复目录,则RMAN 将使用恢复目录获取有关备份的元数据。

此图表描述了没有目标连接时基于备份的复制。RMAN 连接到恢复目录数据库实例和辅助实例。目标主机必须具有对创建副本数据库所需的RMAN 备份的访问权限。

6、不使用恢复目录或者目标连接,复制数据库

clipboard[5]

连接到辅助实例,该实例必须具有对磁盘备份位置的访问权限

在没有恢复目录或目标连接的情况下复制数据库

如果在没有目标数据库连接且没有恢复目录的情况下复制数据库,则RMAN 将使用所有必需的备份和副本所在的备份位置。

此图表描述了在没有连接到目标数据库实例或恢复目录数据库实例的情况下执行的基于备份的复制。包含复制所需的所有备份或副本的磁盘备份位置必须可供目标主机使用。

7、创建一个基于备份的复制数据库

clipboard[6]

1. 创建辅助实例的Oracle 口令文件。

2. 建立到辅助实例的Oracle Net 连接。

3. 创建辅助实例的初始化参数文件。

4. 在NOMOUNT模式下启动辅助实例。

5. 装载或打开目标数据库。

6. 确保备份和归档重做日志文件可用。

7. 根据需要分配辅助通道。

8. 执行DUPLICATE命令。

了解以上基本步骤和RMAN 数据库复制过程非常重要。

如果你使用的是Oracle Enterprise Manager 界面,向导可帮助你执行大部分步骤。如果你使用命令行界面创建副本数据库,则需要手动执行这些步骤。你还可将EM 界面用作测试或示例,并以输出日志为基础编写自己的数据库复制脚本。

本示例中概括了创建副本数据库的基本步骤。

例子:创建复制数据库

环境:

192.168.247.141 stone

192.168.247.142 stonedp

(1)从目标数据库复制口令文件到辅助实例并重命名

[oracle@oeldb1 ~]$ scp /u01/app/oracle/product/11.2.0/dbhome_1/dbs/orapwstone oracle@192.168.247.142:/u01/app/oracle/product/11.2.0/dbhome_1/dbs/orapwstone

[oracle@oeldb2 ~]$ mv /u01/app/oracle/product/11.2.0/dbhome_1/dbs/orapwstone /u01/app/oracle/product/11.2.0/dbhome_1/dbs/orapwstonedp

并修改辅助实例的ORACLE_SID环境变量

[oracle@oeldb2 ~]$ echo $ORACLE_SID

stonedp

(2)配置Oracle Net

目标数据库:

[oracle@oeldb1 ~]$ cat /u01/app/oracle/product/11.2.0/dbhome_1/network/admin/listener.ora

# listener.ora Network Configuration File: /u01/app/oracle/product/11.2.0/dbhome_1/network/admin/listener.ora

# Generated by Oracle configuration tools.

SID_LIST_LISTENER =

  (SID_LIST =

    (SID_DESC =

      (GLOBAL_DBNAME = stone)

      (ORACLE_HOME = /u01/app/oracle/product/11.2.0/dbhome_1)

      (SID_NAME = stone)

    )

  )

LISTENER =

  (DESCRIPTION =

    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.247.141)(PORT = 1521))

  )

ADR_BASE_LISTENER = /u01/app/oracle

[oracle@oeldb1 ~]$ cat /u01/app/oracle/product/11.2.0/dbhome_1/network/admin/tnsnames.ora

# tnsnames.ora Network Configuration File: /u01/app/oracle/product/11.2.0/dbhome_1/network/admin/tnsnames.ora

# Generated by Oracle configuration tools.

STONEDP =

  (DESCRIPTION =

    (ADDRESS_LIST =

      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.247.142)(PORT = 1521))

    )

    (CONNECT_DATA =

      (SERVICE_NAME = stonedp)

    )

  )

辅助实例:

[oracle@oeldb2 ~]$ cat /u01/app/oracle/product/11.2.0/dbhome_1/network/admin/listener.ora

# listener.ora Network Configuration File: /u01/app/oracle/product/11.2.0/dbhome_1/network/admin/listener.ora

# Generated by Oracle configuration tools.

SID_LIST_LISTENER =

  (SID_LIST =

    (SID_DESC =

      (GLOBAL_DBNAME = stonedp)

      (ORACLE_HOME = /u01/app/oracle/product/11.2.0/dbhome_1)

      (SID_NAME = stonedp)

    )

  )

LISTENER =

  (DESCRIPTION =

    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.247.142)(PORT = 1521))

  )

ADR_BASE_LISTENER = /u01/app/oracle

[oracle@oeldb2 ~]$ cat /u01/app/oracle/product/11.2.0/dbhome_1/network/admin/tnsnames.ora

# tnsnames.ora Network Configuration File: /u01/app/oracle/product/11.2.0/dbhome_1/network/admin/tnsnames.ora

# Generated by Oracle configuration tools.

STONE =

  (DESCRIPTION =

    (ADDRESS_LIST =

      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.247.141)(PORT = 1521))

    )

    (CONNECT_DATA =

      (SERVICE_NAME = stone)

    )

  )

目标数据库上面进行测试:

[oracle@oeldb1 ~]$ tnsping stonedp

辅助实例上面进行测试:

[oracle@oeldb2 ~]$ tnsping stone

(3)在辅助实例创建初始化参数

根据目标库参数文件进行修改:

SQL> create pfile='/home/oracle/pfile.ora' from spfile;

[oracle@oeldb1 ~]$ scp pfile.ora oracle@192.168.247.142:/home/oracle

修改后的参数文件如下:

[oracle@oeldb2 ~]$ cat pfile.ora

*.audit_file_dest='/u01/app/oracle/admin/stonedp/adump'

*.audit_trail='db'

*.compatible='11.2.0.4.0'

*.db_block_size=8192

*.db_create_file_dest='/u01/app/oracle/oradata'

*.db_create_online_log_dest_1='/u01/app/oracle/oradata'

*.db_domain=''

*.db_flashback_retention_target=1440

*.db_name='stonedp'

*.db_recovery_file_dest='/u01/app/oracle/fast_recovery_area'

*.db_recovery_file_dest_size=5368709120

*.diagnostic_dest='/u01/app/oracle'

*.dispatchers='(PROTOCOL=TCP) (SERVICE=stonedpXDB)'

*.log_archive_format='%t_%s_%r.dbf'

*.memory_target=834666496

*.open_cursors=300

*.processes=150

*.remote_login_passwordfile='EXCLUSIVE'

*.undo_tablespace='UNDOTBS1'

创建spfile:

SQL> create spfile from pfile='/home/oracle/pfile.ora';

根据参数文件中参数对应的目录创建相关目录:

[oracle@oeldb2 ~]$ mkdir -p /u01/app/oracle/admin/stonedp/adump

(4)启动辅助实例到nomount

SQL> startup nomount pfile='/home/oracle/pfile.ora';

(5)在目标主机上面使用rman连接到目标数据库和辅助实例进行复制

[oracle@oeldb1 ~]$ rman target / auxiliary sys/123456@stonedp

RMAN> duplicate target database to stonedp from active database;

8、为辅助实例创建一个初始化参数文件

clipboard[7]

请按如下方式指定参数:

? DB_NAME

– 如果副本数据库和目标数据库在同一Oracle 主目录中,则它们的名称必须不同。

– 在DUPLICATE命令中使用相同的值。

? DB_BLOCK_SIZE

– 指定的值应与为目标数据库设置的值相同。

创建辅助实例的初始化参数文件

你必须为辅助实例创建文本初始化参数文件。文本初始化参数文件驻留的主机必须与用来执行DUPLICATE命令的RMAN 客户机驻留的主机是同一主机。

请注意下列每个参数的要求:

? DB_NAME:如果目标数据库和副本数据库在同一Oracle 主目录中,则必须将DB_NAME设置为不同的名称。如果它们在不同的Oracle 主目录中,则必须确保副本数据库名称不同于其Oracle 主目录中的其它名称。请确保执行DUPLICATE命令时使用的数据库名称与为此参数设置的名称相同。

? DB_BLOCK_SIZE:辅助数据库的块大小必须与目标数据库的块大小匹配。辅助数据库初始化参数文件中指定的值必须与目标数据库初始化参数文件中设置的值相同。如果没有在目标数据库的初始化参数文件中设置此参数,在辅助实例初始化参数文件中也不要设置它。

另外,请务必验证指定路径名的所有初始化参数的设置。请确认在副本数据库主机上可以访问所有指定的路径。

9、为目的数据库指定新的名字

clipboard[8]

可用的方法:

? SET NEWNAME命令

? CONFIGURE AUXNAME命令(对恢复集数据文件已弃用)

? 在DUPLICATE命令中指定DB_FILE_NAME_CONVERT参数

为目的数据库指定新名称

可以使用下列方法指定数据文件的新名称:

? 将SET NEWNAME FOR DATAFILE命令包含在RUN块中来指定数据文件的新名称。

? 使用CONFIGURE AUXNAME命令。CONFIGURE AUXNAME是SET NEWNAME的一种替代方法。区别是首次配置辅助名称后,其它DUPLICATE命令将重用所配置的设置。相对而言,每次执行DUPLICATE命令时必须重新发出SET NEWNAME。

注:对于恢复集数据文件,使用SET NEWNAME替换CONFIGURE AUXNAME。

? 随DUPLICATE命令指定DB_FILE_NAME_CONVERT参数。

10、使用SET NEWNAME语句

clipboard[9]

? SET NEWNAME子句用于为数据库或命名表空间中的所有文件指定默认名称格式。

? 默认名称用于RUN块中的DUPLICATE、RESTORE和SWITCH命令。

? 它使得你可以通过单个命令设置文件名称,而无需分别设置每个文件名称。

SET NEWNAME FORDATABASE

TO {NEW|'formatSpec'};

使用SET NEWNAME子句

你可以使用SET NEWNAME为命名表空间中的所有数据文件和数据库中的所有数据文件指定默认名称格式。

SET NEWNAME命令的优先顺序如下所示:

1.SET NEWNAME FOR DATAFILE和SET NEWNAME FOR TEMPFILE

2.SET NEWNAME FOR TABLESPACE

3.SET NEWNAME FOR DATABASE

示例:

RUN

{

SET NEWNAME FOR DATABASE TO '/u01/app/oracle/oradata/dupldb/%b';

DUPLICATE TARGET DATABASE TO dupldb

LOGFILE

GROUP 1 ('/u01/app/oracle/oradata/dupldb/redo01a.log',

'/u01/app/oracle/oradata/dupldb/redo01b.log') SIZE 50M REUSE,

GROUP 2 ('/u01/app/oracle/oradata/dupldb/redo02a.log',

'/u01/app/oracle/oradata/dupldb/redo02b.log') SIZE 50M REUSE,

GROUP 3 ('/u01/app/oracle/oradata/dupldb/redo03a.log',

'/u01/app/oracle/oradata/dupldb/redo03b.log') SIZE 50M REUSE;

}

11、用于SET NEWNAME的替换变量

clipboard[10]

SET NEWNAME的替代变量

发出SET NEWNAME FOR DATABASE或SET NEWNAME FOR TABLESPACE时,必须在TO 子句中指定替代变量以避免名称冲突。请至少指定以下替代变量中的一种:%b、%f和%U。%I和%N是可选变量。

12、指定用于文件命名的参数

clipboard[11]

或者指定下列参数来显式控制辅助数据库的文件命名:

? CONTROL_FILES

? DB_FILE_NAME_CONVERT

? LOG_FILE_NAME_CONVERT

CONTROL_FILES='/u01/app/oracle/oradata/aux/control01.ctl',

'/u01/app/oracle/oradata/aux/control02.ctl',

'/u01/app/oracle/oradata/aux/control03.ctl'

DB_FILE_NAME_CONVERT='/u01/app/oracle/oradata/orcl',

'/u01/app/oracle/oradata/aux'

LOG_FILE_NAME_CONVERT='/u01/app/oracle/oradata/orcl',

'/u01/app/oracle/oradata/aux'


指定用于文件命名的参数

执行DUPLICATE命令时,RMAN 会生成必需的数据库文件的名称。通过在辅助实例初始化参数文件中指定下列初始化参数,可以控制这些文件的命名:

? CONTROL_FILES:可以使用此参数指定控制文件的名称。如果未使用此参数设置名称,Oracle Server 会在默认控制文件目录中创建Oracle 管理的控制文件。

? DB_FILE_NAME_CONVERT:此参数用于指定辅助数据库的数据文件名。其格式为DB_FILE_NAME_CONVERT = 'string1', 'string2',其中string1是目标数据库文件名的模式,string2是辅助数据库文件名的模式。还可以指定DB_FILE_NAME_CONVERT参数作为DUPLICATE DATABASE命令的选项。

? LOG_FILE_NAME_CONVERT:此参数用于指定辅助数据库的重做日志文件名。其格式为LOG_FILE_NAME_CONVERT = 'string1', 'string2',其中string1是目标数据库文件名的模式,string2是辅助数据库文件名的模式。还可以使用DUPLICATE DATABASE命令的LOGFILE子句来指定重做日志文件名。

除了使用初始化参数控制文件命名之外,还可以使用下列方法重命名重做日志文件:

? 使用DUPLICATE命令的LOGFILE子句。

? 设置Oracle Managed Files 的初始化参数:DB_CREATE_FILE_DEST、DB_CREATE_ONLINE_DEST_n或DB_RECOVERY_FILE_DEST。

13、在NOMOUNT状态启动实例

clipboard[12]

? 在NOMOUNT模式下启动辅助实例。

? 根据用来启动实例的文本初始化参数文件创建服务器参数文件(SPFILE)。

SQL> startup nomount pfile='$HOME/auxinstance/initAUX.ora'

ORACLE instance started.

Total System Global Area 285212672 bytes

Fixed Size 1218992 bytes

Variable Size 92276304 bytes

Database Buffers 188743680 bytes

Redo Buffers 2973696 bytes

SQL> create spfile

2 from pfile='$HOME/auxinstance/initAUX.ora';

File created.


在NOMOUNT模式下启动实例

创建文本初始化参数文件后,通过调用SQL*Plus 可在NOMOUNT模式下启动辅助实例。

调用SQL*Plus 后,就会根据文本初始化参数文件创建服务器参数文件(SPFILE)。可以在启动实例前后执行CREATE SPFILE。应该在默认位置创建SPFILE,这样不需要在DUPLICATE命令中指定PFILE选项。RMAN 在复制过程中会关闭辅助实例,然后再重新启动它。因此,如果不使用SPFILE,就必须指定PFILE选项。

14、确保备份和归档日志文件可用

clipboard[13]

? 在副本主机上必须能访问所有目标数据库数据文件的备份。

? 备份可以是完全备份和增量备份的组合。

? 在副本主机上必须能访问恢复副本数据库所需的归档重做日志文件。

? 归档重做日志文件可以是:

– 介质管理器上的备份

– 映像副本

– 实际的归档重做日志文件

确保备份和归档重做日志文件可用

在副本主机上必须能访问还原数据文件所需的备份。你并不需要完整的数据库备份。RMAN 在复制过程中可使用单个数据文件的完全备份和增量备份的组合。

另外,还必须能访问将副本数据库恢复到期望的时间点所需的归档重做日志。这些归档重做日志文件可以是备份、映像副本或实际的归档重做日志。备份或副本可传送到副本数据库节点的本地磁盘上,或者通过网络文件系统(NFS) 之类的某种方式通过网络进行装载。

15、分配辅助通道

clipboard[14]

16、理解RMAN复制操作

clipboard[15]

当你执行DUPLICATE命令时,RMAN 会执行下列操作:

1A.为辅助实例创建服务器参数文件(对于活动数据库和使用目标连接执行的基本备份的复制),或:

1B.从备份中还原(对于备用数据库和没有目标连接的基于备份的复制)

2. 装载备份控制文件

3. 对于基于备份的复制:选择用于将数据文件还原到辅助实例的备份

4. 将目标数据文件还原到副本数据库

5. 使用所有可用的增量备份和归档重做日志文件执行不完全恢复

了解RMAN 复制操作

执行DUPLICATE命令时,RMAN 将执行示例中列出的操作。

1A.如果满足以下条件,RMAN 将为辅助实例创建默认服务器参数文件:

- 复制不涉及备用数据库。

- 不对服务器参数文件进行复制。

- 辅助实例不是使用服务器参数文件启动的。

1B. RMAN 从备份中还原-对于备用数据库和没有目标连接的基于备份的复制,始终如此。

2. RMAN 从活动数据库装载已还原或复制的备份控制文件。

3.对于基于备份的复制:RMAN 使用RMAN 资料档案库选择用于将数据文件还原到辅助实例的备份。

4. RMAN 还原并复制数据文件副本。

5. RMAN 使用增量备份和归档重做日志文件将数据文件恢复到非当前时间点。RMAN 必须执行数据库时间点恢复,即使不为复制提供显式时间点也是如此。因为源数据库中的联机重做日志文件未备份且无法应用于副本数据库,所以时间点恢复是必需的。副本数据库的最远恢复点是由源数据库归档的最近重做日志文件。

17、理解RMAN复制操作

clipboard[16]

6. 关闭辅助实例并以NOMOUNT模式重新启动它

7. 新建一个控制文件,然后控制文件在数据文件中创建并存储新的DBID

8. 通过RESETLOGS选项打开副本数据库

9. 为副本数据库创建联机重做日志文件

注:数据库复制过程在重新执行时尝试从故障点继续。

6. RMAN 关闭数据库实例并以NOMOUNT 模式重新启动它。

7. RMAN 新建一个控制文件,该控制文件然后在副本数据库的数据文件中创建并存储新的唯一数据库标识符DBID。

8. RMAN 通过RESETLOGS选项打开副本数据库。

9. RMAN 为副本数据库创建联机重做日志文件。

注:如果DUPLICATE DATABASE命令失败,可重新执行DUPLICATE DATABASE命令,复制过程尝试从故障点继续执行。

18、为DUPLICATE命令指定选项

clipboard[17]

指定DUPLICATE命令的选项

在执行DUPLICATE命令时根据需要指定其它选项。

SKIP READONLY:用于排除只读表空间数据文件。

SKIP TABLESPACE:用于从目标数据库中排除表空间。不能排除SYSTEM表空间或包含还原段或回退段的表空间。

TABLESPACE:用来包括目标数据库中的表空间。

NOFILENAMECHECK:用于防止RMAN 检查目标数据库数据文件是否与正在使用的副本数据库数据文件同名。当目标数据库和副本数据库的数据文件和重做日志文件使用相同的名称时,必须指定此选项。当创建副本数据库的主机具有与目标数据库主机一样的磁盘配置、目录结构和文件名时,通常使用此选项。如果这种情况下未指定NOFILENAMECHECK,RMAN 会返回错误。

OPEN RESTRICTED:用于在数据库打开之后自动启用RESTRICTED SESSION。

19、使用其他DUPLICATE命令选项

clipboard[18]

使用其它DUPLICATE命令选项

Oracle Database 11gR2 中引入了DUPLICATE命令的以下其它选项:

? NOREDO:NOREDO选项用于向RMAN 发出信号,指出在复制操作的恢复阶段不应用重做日志。在下列情况下应指定此选项:在备份时数据库处于NOARCHIVELOG模式,或者在复制操作过程中归档重做日志文件不可用。如果当前处于ARCHIVELOG模式的数据库正被复制到它在NOARCHIVELOG模式时的一个时间点,使用此选项非常合适。

如果正在执行无目标DUPLICATE,且该数据库处于NOARCHIVELOG模式,则必须使用此选项将数据库模式告知RMAN。如果未连接到目标数据库,RMAN 将无法确定模式。

? UNDO TABLESPACE:在非整体数据库复制过程中,RMAN 会检查所复制的所有表空间以确认不存在属于SYS用户的对象。SYSTEM、SYSAUX和还原段表空间不在此检查的范围内。但是,如果复制过程中未打开目标数据库,且未使用恢复目录,RMAN 将无法获取还原表空间的名称。所以必须使用UNDO TABLESPACE选项提供还原段表空间的名称。

20、使用EM克隆数据库

clipboard[19]

使用EM 克隆数据库

还可以使用Oracle Enterprise Manager (EM) 创建副本(克隆)数据库。从EM 主页,导航到Data Movement > Clone database(数据移动> 克隆数据库)。屏幕快照将显示“Clone Database: Source Type(克隆数据库: 源类型)”页面。可以选择下列位置来执行克隆操作:

? 正在运行的实例:可以指定克隆一个正在运行的实例。

? 登台区:在源主机和目标主机上指定的磁盘区。在此处创建并存储备份,然后将其放入目标登台区,并对该目标主机进行读取以创建克隆数据库。

? 现有备份:如果已有备份反映了要克隆的数据库所处的状态,则可以使用该位置。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/28536251/viewspace-2137474/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/28536251/viewspace-2137474/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值