首頁 >資料庫 >mysql教程 >OCP专题之网络

OCP专题之网络

WBOY
WBOY原創
2016-06-07 16:03:552026瀏覽

声明: 原创作品,出自 深蓝的blog 博客,欢迎转载,转载时请务必注明出处,否则追究版权法律责任。 深蓝的blog:http://blog.csdn.net/huangyanlong/article/details/39780805 枯燥的知识点介绍是漫天飞舞,我们不妨从中筛选出部分细节,带着问题来学习Orac

声明:原创作品,出自 “深蓝的blog” 博客,欢迎转载,转载时请务必注明出处,否则追究版权法律责任。

深蓝的blog:http://blog.csdn.net/huangyanlong/article/details/39780805

枯燥的知识点介绍是漫天飞舞,我们不妨从中筛选出部分细节,带着问题来学习Oracle体系知识,这样也许印象会更深刻吧。接下来的一段日子里,本人为了通过ocp考试,将会通过这种形式,开始oracle体系、备份、调优等一系列的学习梳理与练习,以下即是一个自我的总结,也作为网络上的简单分享。

基础知识,如果也能帮助到初学者,欣慰不已。

【不耻下问】

问题1:oracle网络是没有负载的,绘制简单的网络拓扑结构?

数据库由PGA、SGA、相关文件构成,当有用户发出请求时,会通过监听建立连接,生成server process进程,建立网络连接后,监听就不再起作用,一切交互都只会由server process来完成。绘制简单拓扑结构,如下图所示:

\

问题2:简述监听与数据库间的关系?

监听:对于oracle来说是一个独立的模块。

既可以先启动oracle,再启动监听,也可以先启动监听,再启动oracle。

问题3:监听和数据库间是否存在长连接?

监听和数据库之间是不存在长连接,这个要明确,只是体现出来的效果是:需要连接时监听可以找到数据库的位置,同样需要连接时数据库也可以找到监听的位置。给人的直观感觉是两者间似乎是存在着长连接的关系,但这并不存在。

问题4:简述客户端和实例是如何通过监听建立连接的?

因为监听知道数据库在具体的位置,便可以根据请求而建立连接。当用户连接监听时,因为监听是知道数据库的位置的,所以监听就会把用户的连接请求转发给实例(即数据库),实例会专门为连接启动一个server process,同时会把service process的地址告诉监听,监听会把server process地址告诉给客户端,客户端会直接发起对server process的连接请求,这时候客户端和oracle的实例正式建立起连接。

然后客户端会把用户名和密码交由server process,而server process会将用户名和密码传递给数据库来进行验证。验证成功后,就标志着这个连接正式建立了。

此后,客户端和数据库之间的会话全交由server process来完成,而监听已经完成了它的使命,不会再起作用了。更明确一点,监听只是在建立连接时才会起作用,监听是没有负载的,这也就与第1题中说的网络没有负载对应上了。

问题5:监听什么时候最容易出问题?

短时间内发起大量的请求。当有大量连接请求时,比如说短时间内出现上百个连接请求的时候,会超过监听的承载负荷,这段时间内通常是会出现延迟现象。这时候最直观的反应就是,连接数据库时会发现响应时间变长了。

问题6:建立监听后,如何立刻完成动态注册?

无配置启动监听后,需要60秒才能注册。如果想要立刻注册,需要在sqlplus下手工执行语句,如下:

SQL> alter system register;
System altered.

[oracle@hyl ~]$ lsnrctl status

--查询监听状态,你会发现已经完成了注册工作

问题7:监听涉及到的文件有哪些?

tnsnames.ora(客户端文件)、listener.ora(服务器端监听文件)、sqlnet.ora(这是个可选文件)。

问题8:配置监听时如何启动图形化?

在主机端或者远程使用X-manager、VNC等软件,可以调出oracle图形化界面,启动图形化之前,需要操作如下指令:

[root@hyldb ~]# xhost +

access control disabled, clients can connect from any host

\

[root@hyldb ~]# export DISPLAY=192.168.1.104:0.0

--把图形化界面引入到本地,这里的IP地址是用于远程调取图形化界的机器IP地址

[root@hyldb ~]# su - oracle

[oracle@hyldb ~]$ netca

如下出现配置监听图形化

\

接下来按照步骤逐步完成即可。

完成后,会自动生成一个listener.ora文件。

问题9:监听文件的路径是什么?

监听文件一般存在于oracle根目录下,可以通过如下路径找到:

[root@hyldb ~]# su - oracle

[oracle@hyldb ~]$ cd $ORACLE_HOME

[oracle@hyldb db_1]$ ls

apex deinstall jdev opmn slax

assistants demo jdk oracore sqldeveloper

bin diagnostics jlib oraInst.loc sqlj

ccr dv ldap ord sqlplus

cdata emcli lib oui srvm

cfgtoollogs EMStage log owb startup.log

clone has md owm suptools

config hs mesg perl sysman

crs ide mgw plsql timingframework

csmig install network precomp ucp

css instantclient nls racg uix

ctx inventory oc4j rdbms usm

cv j2ee odbc relnotes utl

dbs javavm olap root.sh wwg

dc_ocm jdbc OPatch scheduler xdk

[oracle@hyldb db_1]$ cd network

[oracle@hyldb network]$ ls

admin doc install jlib lib log mesg tools trace

[oracle@hyldb network]$ cd admin

[oracle@hyldb admin]$ ls

listener1410017PM0213.bak samples tnsnames1410017PM0719.bak

listener1410017PM0233.bak shrept.lst tnsnames.ora

listener1410017PM0719.bak tnsnames1410017PM0213.bak

listener.ora tnsnames1410017PM0233.bak

[oracle@hyldb admin]$ pwd

--使用pwd命令查看到全路径

/u01/app/oracle/product/11.2.0/db_1/network/admin

问题10:监听文件中需要注意的内容有哪些?

打开listener.ora文件,如下操作

[oracle@hyldb admin]$ vi listener.ora

LISTENER =

(DESCRIPTION_LIST =

(DESCRIPTION =

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

(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))

)

)

一般只需要注意如上几段信息即可,注意HOST的值为服务器主机的主机名,通常会设置为IP地址,如下格式:

LISTENER =

(DESCRIPTION_LIST =

(DESCRIPTION =

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

(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))

)

)

问题11:如何启动、关闭、查看监听?

[oracle@hyldb admin]$ lsnrctl start

--启动监听

LSNRCTL for Linux: Version 11.2.0.4.0 - Production on 04-OCT-2014 00:42:49
Copyright (c) 1991, 2013, Oracle.  All rights reserved.
Starting /u01/app/oracle/product/11.2.0/db_1/bin/tnslsnr: please wait...
TNSLSNR for Linux: Version 11.2.0.4.0 - Production
System parameter file is /u01/app/oracle/product/11.2.0/db_1/network/admin/listener.ora
Log messages written to /u01/app/oracle/diag/tnslsnr/hyldb/listener/alert/log.xml
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=hyldb)(PORT=1521)))
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=hyldb)(PORT=1521)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 11.2.0.4.0 - Production
Start Date                04-OCT-2014 00:42:49
Uptime                    0 days 0 hr. 0 min. 0 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /u01/app/oracle/product/11.2.0/db_1/network/admin/listener.ora
Listener Log File         /u01/app/oracle/diag/tnslsnr/hyldb/listener/alert/log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=hyldb)(PORT=1521)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
The listener supports no services
The command completed successfully 

[oracle@hyldb admin]$ lsnrctl status

--查看监听

LSNRCTL for Linux: Version 11.2.0.4.0 - Production on 04-OCT-2014 00:43:18
Copyright (c) 1991, 2013, Oracle.  All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=hyldb)(PORT=1521)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 11.2.0.4.0 - Production
Start Date                04-OCT-2014 00:42:49
Uptime                    0 days 0 hr. 0 min. 28 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /u01/app/oracle/product/11.2.0/db_1/network/admin/listener.ora
Listener Log File         /u01/app/oracle/diag/tnslsnr/hyldb/listener/alert/log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=hyldb)(PORT=1521)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
Services Summary...
Service "hyl" has 1 instance(s).
  Instance "hyl", status READY, has 1 handler(s) for this service...
Service "hylXDB" has 1 instance(s).
  Instance "hyl", status READY, has 1 handler(s) for this service...
The command completed successfully 

[oracle@hyldb admin]$ lsnrctl stop

--停止监听

LSNRCTL for Linux: Version 11.2.0.4.0 - Production on 04-OCT-2014 00:42:35
Copyright (c) 1991, 2013, Oracle.  All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=hyldb)(PORT=1521)))
The command completed successfully 

[oracle@hyldb admin]$ lsnrctl status

LSNRCTL for Linux: Version 11.2.0.4.0 - Production on 04-OCT-2014 00:42:45
Copyright (c) 1991, 2013, Oracle.  All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=hyldb)(PORT=1521)))
TNS-12541: TNS:no listener
 TNS-12560: TNS:protocol adapter error
  TNS-00511: No listener
   Linux Error: 111: Connection refused
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1521)))
TNS-12541: TNS:no listener
 TNS-12560: TNS:protocol adapter error
  TNS-00511: No listener
   Linux Error: 2: No such file or directory

问题11:如何实现启动监听后,立即完成注册?

启动监听后一般要过60秒才会完成注册,但可以在sqlplus中手工执行命令,使其立即完成注册,操作如下:

SQL> alter system register;

此命令会触发pmon进程去将实例名字动态注册到监听中去。

问题12:如何生成tnsnames.ora文件?

参考图形化配置的方法,可以使用netca命令,调出图形化配置选项,如下选择第三项即为配置tnsnames.ora文件,配置好后会自动生成一个tnsnames.ora文件。

\

\

\

\

\

选择进行测试一下,如下:

\

\

下面这个服务名可以任意取,与前面的数据库服务名是两个概念,请注意。

\

点击完成选项,完成tnsnames.ora文件的创建,如下图所示:

\

问题13:在添加tnsnames.ora时会要求填写数据库服务名,这个名字应该依据什么进行填写?

在sqlplus中使用如下命令,即可查看到服务名。

SQL> show parameter service

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
service_names                        string      hyl

问题14:如何查看1521端口的占用情况?

[root@hyldb ~]# netstat -tulnp|grep 1521

tcp 0 0 192.168.1.123:1521 0.0.0.0:* LISTEN 3473/tnslsnr

一般数据库服务器上本身会有不止一块网卡,通过命令可以查看到使用的哪一个网卡。

问题15:如何查看到tnsnames.ora文件及应该注意什么?

SQL> show parameter service

NAME                                 TYPE        VALUE

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

service_names                        string      hyl


注意这里上面的“HYL”是可以任意取得,而下面的SERVICE_NAME = hyl,这里的SERVICE_NAME必须要和数据库服务名完全一样。

问题16:客户端连接数据库书写格式是怎样及为何这样书写?

一般书写格式为username/password@servicename。

之所以这种格式书写,是因为当遇到@这个符号时,oracle会自动到tnsnames.ora文件中解析@后跟的字符串。通过tnsnames文件解析字符串,tnsnames.ora文件中包含IP地址、端口号、数据库服务名。也就是说,当客户端进行sqlplus书写格式登陆数据库时,oracle会根据@字符后的字符串去到tnsnames.ora文件中对应的字符串解析出IP地址、端口号、数据库服务名的信息。

问题17:当客户端无法连接oracle数据库时,如何进行排错?

(1)、查看客户端tnsnames.ora文件设置是否正确,检查service_name(参考问题13)是否与数据库端相同;

(2)、查看服务器段IP地址、端口号(参考问题14)是否正确;

(3)、客户端使用tnsping命令ping服务名,查看情况,如下代表可以解析成功:

[oracle@hyldb admin]$ tnsping beijing_daotian

TNS Ping Utility for Linux: Version 11.2.0.4.0 - Production on 04-OCT-2014 01:34:07
Copyright (c) 1997, 2013, Oracle.  All rights reserved.
Used parameter files:
Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.123)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = hyl)))
OK (10 msec)

这里要注意,tns可以ping成功,也可能存在其它问题致使无法连接oracle,如你使用了一个没有注册到监听的service_name,tnsping可以完成,但此情况是无法连接数据库的。

问题18:在oracle网络中几个文件涉及到了service_name这个概念,之间是怎样的关系?

tnsnames.ora中service_name和listener.ora(监听文件)中service_name是对应的,应该与oracle的service_name相一致。当客户端发出请求时,会根据tnsnames.ora中的service_name与数据库服务器端监听文件中的service_name进行比对,只有一致时才会完成解析工作,客户端同监听建立起连接。这样监听才会把连接转移到数据库实例上,而实现客户端与oracle建立连接。

问题19:静态注册、动态注册的区别?

静态注册需要手工在listener.ora文件中添加内容,如下:

SID_LIST_LISTENER =

(SID_LIST =

(SID_DESC =

(GLOBAL_DBNAME = 数据库服务名)

(ORACLE_HOME = /u01/app/oracle/product/10.2.0/db_1)

(SID_NAME = 数据库实例名)

)

)

注册后可以查看效果,按如下操作:

[oracle@hyldb admin]$ lsnrctl stop

[oracle@hyldb admin]$ lsnrctl start

[oracle@hyldb admin]$ lsnrctl status

--查看到其中标识有UNKNOWN代表静态注册的监听

LSNRCTL for Linux: Version 11.2.0.4.0 - Production on 04-OCT-2014 12:28:47
Copyright (c) 1991, 2013, Oracle.  All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=hyldb)(PORT=1521)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 11.2.0.4.0 - Production
Start Date                04-OCT-2014 12:28:16
Uptime                    0 days 0 hr. 0 min. 30 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /u01/app/oracle/product/11.2.0/db_1/network/admin/listener.ora
Listener Log File         /u01/app/oracle/diag/tnslsnr/hyldb/listener/alert/log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=hyldb)(PORT=1521)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
Services Summary...
Service "hyl" has 2 instance(s).
  Instance "hyl", status UNKNOWN, has 1 handler(s) for this service...
  Instance "hyl", status READY, has 1 handler(s) for this service...
Service "hylXDB" has 1 instance(s).
  Instance "hyl", status READY, has 1 handler(s) for this service...
The command completed successfully 

动态注册:

1、注意内容:配置local_litener参数,需要指定监听的host和port;

2、注册过程:如果监听先启动,实例后启动,实例会完成动态注册;如果实例先启动,监听后启动,需要使用SQL>alter system register;完成注册;

3、显示状态:如果实例的状态是nomount,监听会显示BLOCKED;如果实例状态是mount或open,监听会显示为READY。

静态注册:

1、注意内容:要配置相应的SID列表;

2、显示状态:静态注册,无论是否启动,都会显示为UNKNOWN状态。

两者的优势分别在于动态注册方便、静态注册稳定。

问题20:使用静态注册的原因是什么?

静态注册为了解决oracle动态注册不稳定的情况。同时也为解决针对于老版本oracle(如8i之前)数据库的连接时使用。

问题21:oracle的服务名、数据库名、实例名如何查看?

参照问题13,我们可以用类似的方法在sqlplus中查看到每个名字,操作如:

SQL> show parameter name

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
cell_offloadgroup_name               string
db_file_name_convert                 string
db_name                              string      hyl
db_unique_name                       string      hyl
global_names                         boolean     FALSE
instance_name                        string      hyl
lock_name_space                      string
log_file_name_convert                string
processor_group_name                 string
service_names                        string      hyl

由上表可以查看到数据库的服务名(service_name)为hyl,数据库名(db_name)为hyl,实例名(instance_name)为hyl。这里设置为了同一个名称,为了操作方便,但要注意这几个名词所代表的含义并不相同。service_name是可以任意改动的,但是如果你修改了service_name,你同样需要修改监听器、客户端文件中的service_name,否则将无法完成监听连接。同样,这里又想起一点,就是在静态注册时这个service_name是和GLOBAL_DBNAME相对应的。

问题22:通过连接方式判别客户端是否通过监听连接?

1、本地连接,不走监听,格式如:

sqlplus scott/tiger

sqlplus / as sysdba

sqlplus ‘/as sysdba’

2、客户端连接,需要监听

sqlplus scott/tiger@hyl

3、使用监听但无需tnsnames.ora连接方式,因为这种连接方式中IP地址、端口号、实例名均手工填写出来了,如下所示:

sqlplus scott/tiger@192.168.1.123:1521/hyl

【简而记之】

1. 独立性:监听是单独存在的模块;

2. 连接性:监听只在客户端建立连接时起作用,不存在负载;

3. 连接假象:监听和数据库间,没有长连接,只是彼此间都知道位置所在,在需要连接时可以及时建立连接;

4. 负荷性:监听是有负荷上限的,连接过多会导致延迟。

5. 客户端连接格式:username/password@service_name

【小试牛刀】

说明:以下题目来源于ocp11g考试大纲

题号:130.

Which two statements are true regarding listeners? (Choose two.)

A.Listeners use only the TCP/IP protocol.

B.Multiple listener processes can run simultaneously on a host.

C.Multiple database instances can be registered with a single listener.

D.The listener-related errors can be traced only at the administrative level.

E.Only one database instance can be registered with a single listener at any time.

Answer: BC

深蓝浅析:

A监听器只是一个TCP/IP协议,理解错误,还可以其它通信如IPC(本地间通信协议,此协议使用在本地连接数据库时,即使没有建立监听,也可以连接到数据库);

B一个主机上可以存在多个监听,正确;

C一个监听可以完成多个数据库的注册,正确;

D对于监听错误的分析,不仅是管理层,在用户层上同样可能引起监听错误,此项错误;

E与B矛盾,错误。

题号:131.

Which naming method uses the tnsnames.ora file to store the connect descriptor used by the client while connecting to the database instance from a remote machine?

A.host naming method

B.local naming method

C.external naming method

D.directory naming method

Answer: B

深蓝浅析:

客户端连接数据库,使用local naming method的方式,官方文档中明确的指出了。因为tnsnames.ora文件是需要在客户端连接端使用的文件。

题号:132.

The tnsnames.ora file has an entry for the service alias ORCL as follows:

ORCL =

( DESCRIPTION =

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

(CONNECT_DATA =

(SERVER = DEDICATED)

(SERVICE_NAME = orcl.oracle.com)

)

)

The TNSPING command executes successfully when tested with ORCL, but you are not able to connect to the database instance with the following command:

SQL> CONNECT scott/tiger@orcl

What could be the reason for this?

A.The listener is not running on the database node.

B.The TNS_ADMIN environmental variable is set to a wrong value.

C.The orcl.oracle.com database service is not registered with the listener.

D.The DEFAULT_DOMAIN parameter is set to a wrong value in the sqlnet.ora file.

Answer: C

深蓝浅析:

tnsping通代表对tnsnames.ora的解析是成功的,但如果tnsnames.ora中的service_name没有注册到listener.ora中去,仍然是不能连接数据库的。

题号:133.

Your database is open and the LISTENER listener is running. The new DBA of the system stops the listener by using the command:LSNRCTL> STOP

What happens to the sessions that are presently connected to the database instance?

A.The sessions are able to perform only queries.

B.The sessions are not affected and continue to function normally.

C.The sessions are terminated and the active transactions are rolled back.

D.The sessions are not allowed to perform any operations till the listener is started.

Answer: B

深蓝浅析:

监听只有在建立连接时才起作用,连接建立后,监听就完成了使命,之后的任务都交给了server process了。可以参看问题4。

题号:134.

View the Exhibit and examine the output.

 

Which two statements are true regarding the LISTENER2 listener? (Choose two.)

A.The ORCL instance is registered dynamically with the listener.

B.The ORCL instance is registered statically in the listener.ora file.

C.The number of current client connections handled by the service handler is two.

D.The total number of client connections handled so far by the service handler is two.

Answer: BD

深蓝浅析:

通过UNKNOWN可以知道这是静态注册,参考问题19,因此选B。通过established为2可以知道,目前建立了两个连接,因此选D。

题号:135.

In which situation would you use static database registration for a listener?

A.when multiple databases are to be registered with the listener

B.when DBAs need to connect remotely to start up the database instance

C.when users need to connect the database instance using the host naming method

D.when the database instance that is to be registered with the listener is configured in shared server mode

Answer: B

深蓝浅析:

为了实现远程启动数据库实例,此时需要通过静态数据库注册来完成连接数据库,因此选B。

题号:136.

You have two database servers SEMP and SACCT. The database in the SEMP server maintains the employee information and the database in the SACCT server maintains the accounts payable information.The employees submit the expense reports to the accounts payable department. A user of the accounts payable database wants to extract the employee information from the database in the SEMP server for cross-verification.

Which schema object enables the user to access the information from the remote database?

A.Cluster

B.Database link

C.Mapping table

D.Materialized view

Answer: B

深蓝浅析:

为了实现两个数据库数据的关联,这里需要使用Database link。

题号:137.

Your database instance is currently configured to support 1,500 connections. The Web application that uses the database allows a large number of users to work with the database simultaneously. Some users of the Web application do not interact with the server all the time.

You want to increase the scalability by configuring the database instance to handle more connections. As a DBA, which configuration would you set to support more than 1,500 connections at a time?

A.You would configure more listeners for the database.

B.You would configure the database in shared server mode to use the connection pooling feature.

C.You would increase the value of the PGA_AGGREGATE_TARGET initialization parameter that assigns more session memory to users.

D.You would decrease the value of the PRIVATE_SGA resource limit in the profiles used by the users to accommodate more session information.

Answer: B

深蓝浅析:

这里为了扩大用户连接数,DBA可以使用共享服务器模式,来建立一个连接池来实现连接比较多的用户的任务,但这种连接是以牺牲一部分性能为代价的。

声明:原创作品,出自 “深蓝的blog” 博客,欢迎转载,转载时请务必注明出处,否则追究版权法律责任。

深蓝的blog:http://blog.csdn.net/huangyanlong/article/details/39780805

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn