ICode9

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

基于 CentOS 6.5 搭建 Oracle 11g 数据库

2021-05-08 17:34:14  阅读:267  来源: 互联网

标签:11g CentOS 数据库 Oracle 6.5 oradata oracle ora11 root


文章目录


前言

犹记得刚毕业那会儿,我的第一份工作就是 IDC 运维。那个时候我的老大丢给我们新人一个任务,就是在 Linux 环境里面去搭建 Oracle 数据库。虽然在学校里也学了一些 Unix 和 Oracle 的课程,但是总的来说,对 Linux 的认知,几乎可以说是小白;而 Oracle 也是基于 Windows 环境去学习的,对于如何在 Linux 环境里面去部署 Oracle,刚入职场的我一脸懵逼。

印象比较深刻的是,看一些论坛和博客,好多 Linux 的命令都不知道是干嘛的,更不要说去使用。最尬的一点是,连 Oracle 软件都不知道在哪里下载,该下哪个版本(当时就记得有好几个包,也不知道哪个是。。。),最后还是一位网友的百度云拯救了我。

如今一路走来,回想起当初,还是觉得很好笑。我并不是一名 DBA,但是对于做运维的人来说,很多时候你没得选,让你去搭建和使用 Oracle,你就得去学习怎么搭建、怎么使用。甚至慢慢的,似乎自己都分不清自己是做运维的还是 DBA。

哈哈,长话短说,趁着工作还不是很忙的时候,把之前的一些笔记和文档稍微整理下,分享一篇如何在 Linux 环境中搭建 Oracle 的文章。如有不当之处,欢迎指正!


一、安装前说明

1.1. 系统环境说明

  • 操作系统版本:CentOS release 6.5 (Final)
  • 系统内核版本:2.6.32-431.el6.x86_64

1.2. 软件版本说明

对于 Oracle 11g 这个大版本的数据库而言,11.2.0.4 版本是相对来说比较稳定、且使用比较广泛的。因此,本文是以安装 Oracle 11.2.0.4 版本为例进行展开的。

安装 Oracle 11.2.0.4 版本的数据库,我们需要准备以下两个软件包。这是被分片压缩的两个文件,使用时我们会将其放在同一个目录下,并将两个压缩包解压到当前目录。

  • p13390677_112040_Linux-x86-64_1of7.zip
  • p13390677_112040_Linux-x86-64_2of7.zip

二、准备工作

2.1. 数据库目录规划

这里为了与系统盘(sda)区分开,我单独挂载了一块 200GB 的磁盘(sdb)作为数据盘来使用,并将其格式化为 ext4 文件系统挂载到了 “/oradata” 目录。所以,后面与 Oracle 有关的文件我都会放在这个目录下。

对象路径作用
/oradata/orasoft存放 Oracle 的软件包
ORACLE_BASE/oradata/app/oracleOracle 的基目录,需要在 .bash_profile 环境变量中指定
ORACLE_HOME/oradata/app/oracle/product/11.2.0Oracle 的家目录,需要在 .bash_profile 环境变量中指定

2.2. 系统环境调试

2.2.1. 关闭系统防火墙

[root@ora11 ~]# service iptables stop   //关闭防火墙。
[root@ora11 ~]# chkconfig iptables off   //禁用防火墙自启动服务。
[root@ora11 ~]# chkconfig --list |grep iptable

2.2.2. 关闭 SELinux

[root@ora11 ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
[root@ora11 ~]# cat /etc/selinux/config |grep -vE "^#|^$"
SELINUX=disabled
SELINUXTYPE=targeted
[root@ora11 ~]# reboot   //需要重启系统才能生效。

2.2.3. 添加主机名与 IP 地址映射

[root@ora11 ~]# echo "172.16.201.147   ora11" >> /etc/hosts   //主机名尽量不要有特殊字符。

2.2.4. 安装 Oracle 软件所需依赖包

配置本地 yum 源,安装所需的依赖包。关于如何配置本地 yum 源,参考我的另一篇博客:基于 CentOS 7.6 配置本地 YUM 源

[root@ora11 ~]# yum -y install binutils compat-libcap1 compat-libstdc++ gcc gcc-c++ glibc glibc-devel ksh libaio libaio-devel libgcc libstdc++ libstdc++-devel libXi libXtst make sysstat unixODBC unixODBC-devel

关于有些依赖包无法使用 yum 安装:

将上面的 yum 命令再执行一次,终端屏幕上将会输出哪些包是没有安装上的。譬如,在我的环境里面,提示了 “No package compat-libstdc++ available”,即表示 compat-libstdc++ 这个包没有安装上,我们需要进行单独安装。

首先,我们来检查下本地 yum 源里到底有没有提供这个包:

[root@ora11 ~]# yum search compat-libstdc++ --showduplicates   //显然,本地 yum 源里面是有这个包的。
Loaded plugins: fastestmirror, refresh-packagekit, security
Loading mirror speeds from cached hostfile
============================================================================== N/S Matched: compat-libstdc++ ==============================================================================
compat-libstdc++-296-2.96-144.el6.i686 : Compatibility 2.96-RH standard C++ libraries
compat-libstdc++-33-3.2.3-69.el6.i686 : Compatibility standard C++ libraries
compat-libstdc++-33-3.2.3-69.el6.x86_64 : Compatibility standard C++ libraries

那我们直接使用 yum 来进行安装:

[root@ora11 ~]# yum -y install compat-libstdc++

如果有些包本地 yum 源里确实没有提供,则需要我们自己去网上找到对应的包(有条件的建议使用 Google 去找,效率会比较高),然后使用 rpm 等命令进行安装。举个在 CentOS 7.6 安装 Oracle 11g 的例子。在 CentOS 7.6 系统里面,本地 yum 源就没有提供 compat-libstdc++ 这个包,那就需要像下面这样进行操作:

wget http://mirror.centos.org/centos/7/os/x86_64/Packages/compat-libstdc++-33-3.2.3-72.el7.x86_64.rpm   //前提是你的环境可以访问外网,否则还是老老实实下载、上传再安装。
rpm -ivh compat-libstdc++-33-3.2.3-72.el7.x86_64.rpm

2.2.5. 创建 Oracle 的用户组和用户

[root@ora11 ~]# groupadd oinstall
[root@ora11 ~]# groupadd dba
[root@ora11 ~]# useradd -g oinstall -G dba oracle
[root@ora11 ~]# id oracle
uid=500(oracle) gid=500(oinstall) groups=500(oinstall),501(dba)
[root@ora11 ~]# passwd oracle   //需要为 oracle 用户设置密码。

2.2.6. 创建 Oracle 的目录

[root@ora11 ~]# mkdir /oradata/app   //注意:关于 sdb 磁盘挂载到 /oradata 目录这个步骤我是没有写的,需要自己提前做。
[root@ora11 ~]# chown -R oracle:oinstall /oradata/app/
[root@ora11 ~]# chmod -R 775 /oradata/app/

2.2.7. 配置内核参数

特别声明:

实际生产环境里面,这些参数需要结合你分配的资源来进行设计,而不是一股脑的照搬下来!包括下面软硬件资源限制也是一样的。甚至,有些 DBA 为了去优化数据库的性能,还会添加一些大页的限制等等。

说这些只是为了表明一个问题,完全按照我博客里面这些参数去学习如何安装 Oracle 单实例数据库,应该是没什么问题的。但是,如果想更好的发挥出服务器的性能和数据库的性能,还需要了解这里面的参数是干嘛的,甚至还要学习一些其他的参数。

[root@ora11 ~]# vim /etc/sysctl.conf   //编辑内核参数文件,将下面的内核参数加入到文件中。

fs.aio-max-nr = 1048576
fs.file-max = 6815744
kernel.shmall = 2097152
kernel.shmmax = 536870912
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
net.ipv4.ip_local_port_range = 9000 65500
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048576

[root@ora11 ~]# sysctl -p   //使内核参数立即生效。

2.2.8. 配置软硬件资源限制

[root@ora11 ~]# vim /etc/security/limits.conf  //编辑资源限制文件,将下面的参数加入到文件中。 

oracle soft nproc 2047
oracle hard nproc 16384
oracle soft nofile 1024
oracle hard nofile 65536

2.3. 配置 oracle 用户环境变量

[root@ora11 ~]# vim /home/oracle/.bash_profile   //编辑环境变量文件,将下面的参数加入到文件中。

export PATH
unset USERNAME
export ORACLE_BASE=/oradata/app/oracle
export ORACLE_HOME=/oradata/app/oracle/product/11.2.0
export ORACLE_SID=orcl
export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
export PATH=/usr/sbin:$PATH:$ORACLE_HOME/bin

[root@ora11 ~]# source /home/oracle/.bash_profile   //使环境变量立即生效。

2.4. 上传并解压软件包

[root@ora11 ~]# mkdir /oradata/orasoft
[root@ora11 ~]# ll /oradata/orasoft/   //上传 oracle 软件包。
-rw-r--r-- 1 root root 1395582860 May  8 10:44 p13390677_112040_Linux-x86-64_1of7.zip
-rw-r--r-- 1 root root 1151304589 May  8 10:44 p13390677_112040_Linux-x86-64_2of7.zip

[root@ora11 ~]# cd /oradata/orasoft/
[root@ora11 orasoft]# unzip /u01/orasoft/p13390677_112040_Linux-x86-64_1of7.zip
[root@ora11 orasoft]# unzip /u01/orasoft/p13390677_112040_Linux-x86-64_2of7.zip

[root@ora11 ~]# chown -R oracle:oinstall /oradata/orasoft/
[root@ora11 ~]# chmod -R 775 /oradata/orasoft/

2.5. 启用远程图形化工具

由于安装 Oracle 数据库是需要调出图形化界面的,而在现实环境中,我们一般很难进入到机房直接使用显示器。当然,也可以配置 VNC 去打开远程图形化界面,但是,根据我自己的使用经验,往往在安装到最后几步的时候界面会卡住。

如果是物理服务器,当然还可以通过 BMC 带外控制台去调用桌面图形化,但是如果是虚拟机环境的话,带外就没得用啦。

经过几番踩坑,我发现 Xmanager 套件里面提供的 Xstart 工具,还是非常好用的。无论是物理机还是虚拟机,都可以直接拿来使用,并且也无需配置什么 “xhost +”、“export DISPLAY” 啥的。哎,不过呢,需要单独装两个依赖包去支持下。

执行下面这条语句,检查你的环境里面是否安装了这两个包,如果已经有了,那么恭喜你可以直接使用 Xstart。

[root@ora11 ~]# rpm -qa |grep -iE "xterm|libxaw"

很遗憾,我的环境里面是没有的,所以我需要单独去安装这两个包:

[root@ora11 ~]# yum search xterm libXaw --showduplicates   //本地 yum 源里面是有这两个包的,直接干就完了(多嘴一句,为了提高效率,也可以将这两个包提到前面安装数据库依赖包那里面去)。
Loaded plugins: fastestmirror, refresh-packagekit, security
Loading mirror speeds from cached hostfile
=================================================================================== N/S Matched: xterm ====================================================================================
xterm-253-1.el6.x86_64 : Terminal emulator for the X Window System

=================================================================================== N/S Matched: libXaw ===================================================================================
libXaw-devel-1.0.11-2.el6.i686 : Development files for libXaw
libXaw-devel-1.0.11-2.el6.x86_64 : Development files for libXaw
libXaw-1.0.11-2.el6.i686 : X Athena Widget Set
libXaw-1.0.11-2.el6.x86_64 : X Athena Widget Set

[root@ora11 ~]# yum -y install xterm libXaw   //直接使用 yum 安装。
[root@ora11 ~]# rpm -qa |grep -iE "xterm|libxaw"   //谨慎的我在安装完包以后会习惯性检查下。
xterm-253-1.el6.x86_64
libXaw-1.0.11-2.el6.x86_64

现在我们来启用 Xstart 工具

注意事项:

  • 用户名要写成 oracle 用户,不要写成 root 用户;
  • 命令写成:/usr/bin/xterm -ls -display $DISPLAY
    在这里插入图片描述
    在这里插入图片描述

三、安装过程说明

3.1. 安装数据库软件

步骤1:启动数据库安装程序。
在这里插入图片描述

步骤2:取消复选框,点击 Next 进行下一步,弹窗告警直接点击 Yes 忽略。
在这里插入图片描述
在这里插入图片描述

步骤3:选择 Skip software updates 跳过软件更新,点击 Next 进行下一步。
在这里插入图片描述

步骤4:选择 Install database software only 仅安装数据库软件。
在这里插入图片描述

步骤5:选择 Single instance database installation 安装单实例数据库,点击 Next 继续。
在这里插入图片描述

步骤6:产品语言默认是英文,点击 Next 继续。
在这里插入图片描述

步骤7:选择安装 Enterprise Edition 企业版,点击 Next 继续。
在这里插入图片描述

步骤8:指定 Oracle Base 和 Software Location 的路径(一般来说会根据环境变量文件自动读取出来)。
在这里插入图片描述

步骤9:创建 oraInventory 目录(环境变量中不需要写,安装过程中会自动创建)。
在这里插入图片描述

步骤10:默认即可,点击 Next 继续。
在这里插入图片描述

步骤11:安装前会有先决条件检查,一般都会提示一些告警或者错误(能解决尽量解决,不然安装会出问题)。
首先,可以点击 Fix & Check Again 解决一部分告警(这里说明下,为了操作简单,之前修改内核参数都是没有根据实际环境的资源配置进行修改的,所以这里会有很多关于内核参数的告警,当执行完 fix 以后,会自动进行调整)。
在这里插入图片描述
在这里插入图片描述

[root@ora11 ~]# sh /tmp/CVU_11.2.0.4.0_oracle/runfixup.sh   //执行 fix 脚本。
Response file being used is :/tmp/CVU_11.2.0.4.0_oracle/fixup.response
Enable file being used is :/tmp/CVU_11.2.0.4.0_oracle/fixup.enable
Log file location: /tmp/CVU_11.2.0.4.0_oracle/orarun.log
Setting Kernel Parameters...
The value for shmmni in response file is not greater than value of shmmni for current session. Hence not changing it.
The value for semmsl in response file is not greater than value of semmsl for current session. Hence not changing it.
The value for semmns in response file is not greater than value of semmns for current session. Hence not changing it.
The value for semmni in response file is not greater than value of semmni for current session. Hence not changing it.
kernel.sem = 250 32000 100 128
fs.file-max = 6815744
net.ipv4.ip_local_port_range = 9000 65500
net.core.rmem_default = 262144
net.core.wmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_max = 1048576
fs.aio-max-nr = 1048576

此时可以发现关于内核参数的告警都清除了,还需要安装两个依赖包:
在这里插入图片描述

[root@ora11 ~]# yum -y install elfutils-libelf-devel   //由于本地 yum 源有这个包,直接安装即可。
[root@ora11 ~]# rpm -ivh pdksh-5.2.14-30.x86_64.rpm --nodeps --force   //这个包可以从网上去下载下来,如果有提示依赖关系,加上后面的 nodeps 和 force 参数即可。

最后,再次点击 Check Again,会发现所有的告警都解决了;点击 Install 继续。
在这里插入图片描述
步骤12:安装进度条。
在这里插入图片描述
步骤13:按照弹框中的要求以 root 用户去执行下面两个脚本(脚本执行完以后记得返回点击 OK)。
在这里插入图片描述

[root@ora11 ~]# sh /oradata/app/oraInventory/orainstRoot.sh
[root@ora11 ~]# sh /oradata/app/oracle/product/11.2.0/root.sh

步骤14:至此,数据库软件安装成功。
在这里插入图片描述

3.2. 创建数据库

步骤1:在 Xstart 窗口执行 dbca 命令调用创建 DB 的程序,点击 Next 继续。
在这里插入图片描述

步骤2:选择 Create a Database 创建数据库,点击 Next 继续。
在这里插入图片描述

步骤3:默认 General Purpose or Transaction Processing,点击 Next 继续。
在这里插入图片描述

步骤4:根据环境变量中的 ORACLE_SID 名填写此处的全局数据库名称和 SID 字段。
在这里插入图片描述

步骤5:取消 Configure Enterprise Manager 复选框,点击 Next 继续。
在这里插入图片描述

步骤6:选择为所有的账户使用相同的密码,出现不符合密码复杂度的警告,可以点击 Yes 继续。
在这里插入图片描述
在这里插入图片描述

步骤7:默认即可(在这里可以选择使用文件系统还是 ASM 方式来存储数据文件,并指定数据文件存储路径)。
在这里插入图片描述

步骤8:默认闪回空间的大小是 4GB;没有备份的需求可以不启用 Archiving 归档。
在这里插入图片描述

步骤9:默认,点击 Next 继续。
在这里插入图片描述

步骤10:在这里我只修改了字符集,设置为简体中文(也可以调整 SGA、PGA 的大小等)。
在这里插入图片描述

步骤11:点击 Next 继续。
在这里插入图片描述

步骤12:点击 Finish 继续,在后面的弹框中点击 OK。
在这里插入图片描述
在这里插入图片描述

步骤13:显示数据库创建的进度条。
在这里插入图片描述

步骤14:数据库创建成功,点击弹框中的 Exit 退出。
在这里插入图片描述

3.3. 创建数据库监听

在 Xstart 窗口执行 netca 命令调用创建监听的程序。监听的配置比较简单,如果不需要修改默认的 1521 监听端口,几乎是一路 Next 下去,这里就不做过多的叙述了。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


四、几条简单的 SQL 语句说明

4.1. 如何登录到数据库

[root@ora11 ~]# su - oracle
[oracle@ora11 ~]$ sqlplus / as sysdba   //登录数据库。

SQL*Plus: Release 11.2.0.4.0 Production on Sat May 8 14:23:40 2021

Copyright (c) 1982, 2013, Oracle.  All rights reserved.


Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

4.2. 判断数据库是否正常运行

根据 ora_pmon 进程判断当前数据库是否在运行

[root@ora11 ~]# ps -ef |grep ora_pmon
oracle    35654      1  0 14:00 ?        00:00:00 ora_pmon_orcl   //表示数据库当前正在运行。
root      35870  30301  0 14:18 pts/2    00:00:00 grep ora_pmon

通过 SQL 查询判断当前数据库是否在运行

SQL> select open_mode from v$database;

OPEN_MODE
--------------------
READ WRITE   //当前数据库可读可写,即意味着正常运行。

SQL> select status from v$instance;

STATUS
------------
OPEN   //当前数据库实例是 OPEN 状态,即意味着正常运行。

4.3. 判断数据库监听是否正常运行

根据监听端口(Oralce 默认监听端口是 1521)来判断监听是否在运行

[root@ora11 ~]# netstat -anp |grep 1521
tcp        0      0 172.16.201.147:14055        172.16.201.147:1521         ESTABLISHED 35654/ora_pmon_orcl 
tcp        0      0 :::1521                     :::*                        LISTEN      35822/tnslsnr       
tcp        0      0 ::ffff:172.16.201.147:1521  ::ffff:172.16.201.147:14055 ESTABLISHED 35822/tnslsnr       
tcp        0      0 ::ffff:172.16.201.147:1521  ::ffff:172.16.201.147:14325 TIME_WAIT   -                   
unix  2      [ ACC ]     STREAM     LISTENING     132514 35822/tnslsnr       /var/tmp/.oracle/sEXTPROC1521

[root@ora11 ~]# lsof -i:1521
COMMAND   PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
oracle  35654 oracle   12u  IPv4 132677      0t0  TCP ora11:14055->ora11:ncube-lm (ESTABLISHED)
tnslsnr 35822 oracle    8u  IPv6 132508      0t0  TCP *:ncube-lm (LISTEN)
tnslsnr 35822 oracle   13u  IPv6 132678      0t0  TCP ora11:ncube-lm->ora11:14055 (ESTABLISHED)

通过查询监听状态来判断当前数据库监听是否在运行

[oracle@ora11 ~]$ lsnrctl status

LSNRCTL for Linux: Version 11.2.0.4.0 - Production on 08-MAY-2021 14:25:08

Copyright (c) 1991, 2013, Oracle.  All rights reserved.

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=ora11)(PORT=1521)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 11.2.0.4.0 - Production
Start Date                08-MAY-2021 14:13:07
Uptime                    0 days 0 hr. 12 min. 0 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /oradata/app/oracle/product/11.2.0/network/admin/listener.ora
Listener Log File         /oradata/app/oracle/diag/tnslsnr/ora11/listener/alert/log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=ora11)(PORT=1521)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
Services Summary...
Service "orcl" has 1 instance(s).
  Instance "orcl", status READY, has 1 handler(s) for this service...   //表示监听正常。
Service "orclXDB" has 1 instance(s).
  Instance "orcl", status READY, has 1 handler(s) for this service...
The command completed successfully

4.4. 查看数据文件、日志文件和控制文件的存储位置

通过 SQL 查询数据文件存储位置

SQL> select name from v$datafile;

NAME
--------------------------------------------------------------------------------
/oradata/app/oracle/oradata/orcl/system01.dbf
/oradata/app/oracle/oradata/orcl/sysaux01.dbf
/oradata/app/oracle/oradata/orcl/undotbs01.dbf
/oradata/app/oracle/oradata/orcl/users01.dbf

通过 SQL 查询日志文件存储位置

SQL> select member from v$logfile;

MEMBER
--------------------------------------------------------------------------------
/oradata/app/oracle/oradata/orcl/redo03.log
/oradata/app/oracle/oradata/orcl/redo02.log
/oradata/app/oracle/oradata/orcl/redo01.log

通过 SQL 查询控制文件存储位置

SQL> select name from v$controlfile;

NAME
--------------------------------------------------------------------------------
/oradata/app/oracle/oradata/orcl/control01.ctl
/oradata/app/oracle/fast_recovery_area/orcl/control02.ctl

总结

对于完全没有接触过 Linux 和 Oracle 的人来说,去做这样一件事情,我觉得还是有一定难度的。当然,如果为了更系统的去学习 Oracle 的部署安装、调试,建议可以去 Oracle 官网找一些官方技术文档,那里面会写得很详细。

这样一篇博客写下来,其实还是挺费时费力的,但是我思来想去,还是觉得花一些精力分享出来会比较好。一方面是对自己的一个知识总结;另一方面,随着云计算和大数据的潮流,以及去 IOE 和国产化的步伐,现在接触的产品和技术会越来越多,很长一段时间可能都不会去接触 Oracle 数据库,写一写 Oracle 相关的文章,权当留个纪念啦。


标签:11g,CentOS,数据库,Oracle,6.5,oradata,oracle,ora11,root
来源: https://blog.csdn.net/hffwj/article/details/104313807

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

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

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

ICode9版权所有