码迷,mamicode.com
首页 > 其他好文 > 详细

hot patching

时间:2016-10-15 00:05:28      阅读:287      评论:0      收藏:0      [点我收藏+]

标签:hot patching

Online Patching 说明

说明:该部分内容摘自OCP 050 教材

 

在Oracle 11g中提出了online patch(也叫hot patch)的特性;Hot patching允许我们在实例始终在线的情况下安装,启用或禁用一个修复补丁(fix)或者诊断补丁(diagnostic patches)。

 

使用热补丁可以安装、启用和禁用正在运行的活动Oracle 实例上的bug 修复或诊断补丁程序。使用热补丁是可在应用热补丁程序时避免停机的建议解决方案。Oracle 提供了使用opatch 命令行实用程序对任何Oracle 数据库进行热补丁的功能。如果代码的更改范围和复杂性都较小(例如,诊断补丁程序或小型bug 修复),则可提供热补丁程序。

 

2.1 安装热补丁程序

(1) 应用热补丁程序不需要关闭实例、重新链接Oracle二进制文件或重新启动实例。

(2) OPatch 可用于安装或卸载热补丁程序。

(3) OPatch 可以检测两个热补丁程序之间以及热补丁程序与常规补丁程序之间的冲突。

 

可以使用以下命令来确定某个补丁程序是否为热补丁程序:

opatch query -is_online_patch <patchlocation> or

opatch query <patch location> -all

注:

打过补丁的代码将作为动态/共享库提供,该库随后会被每个Oracle 进程映射至内存中。

(关于热补丁的机制可以参考1.2 节的内容。)

 

2.2 热补丁的优点

(1) 无停机时间,不中断业务

(2) 安装和卸载速度极快

(3) 与OPatch 集成:

检测冲突

在补丁程序清单中列出

在RAC 环境中工作

(4) 虽然不改变磁盘上的Oracle二进制文件,但热补丁程序在实例关闭和启动时都保持有效。

 

2.3 常规补丁和热补丁

常规补丁基本上要求关闭数据库实例。

热补丁不需要任何停机时间。在安装热补丁时,应用程序可以继续运行。

同样的,无需停机便可卸载已安装的热补丁程序。

 

常规补丁和热补丁的对比,如下图:

 技术分享


 

 

2.4 热补丁注意事项

(1)可能不是所有平台上都有热补丁程序。当前在以下平台上有热补丁程序:

– Linux x86

– Linux x86-64

– Solaris SPARC64

--这个具体可以参考:1.3 小节。

 

(2)要消耗一些额外的内存。

– 确切的内存数取决于:

— 补丁程序的大小

— 当前运行的Oracle 进程数

– 最小内存数:每个Oracle 进程大约占一个OS 页面

 

如:一个操作系统(OS) 页面在Linux x86 上一般为4 KB,在和Solaris SPARC64 上为8 KB。

在平均大约一千个Oracle 进程同时运行的情况下,这意味着一个小型的热补丁程序大约额外占用4 MB 内存。

 

 

(3) 在每个Oracle 进程安装或卸载热补丁程序之前,可能会有一段极短的延迟(几秒)。

 

(4) 并非所有bug 修复和诊断补丁程序都可用作热补丁程序。

极大部分诊断补丁程序可作为热补丁程序提供。对于bug 修复,则具体取决于其性质。并非每个bug 修复或诊断补丁程序都可用作热补丁程序。但热补丁工具的长期目标是为关键补丁程序更新提供热补丁功能。

 

(5) 不能在停机时间使用热补丁程序。

 

(6) 如果可能有停机时间,则应以常规补丁程序方式安装所有相关的bug 修复。

 

三. Online Patch 操作示例

测试环境是11.2.0.3:

SQL> select * from v$version;

 

BANNER

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

Oracle Database 11g Enterprise EditionRelease 11.2.0.3.0 - 64bit Production

PL/SQL Release 11.2.0.3.0 - Production

CORE   11.2.0.3.0      Production

TNS for Linux: Version 11.2.0.3.0 -Production

NLSRTL Version 11.2.0.3.0 – Production

 

 

Google了一下,找了一个对应版本的onlinepatch:

Oracle online patching for bug 13817131(backport for ORA-7445 near ksfqfcrx()+X during RMAN backups)

http://jakub.wartak.pl/blog/?p=624

 

这里用online patch:13817131的相关操作为例。

 

3.1 解压缩:

[oracle@dave u01]$ unzipp13817131_112030_Linux-x86-64.zip

Archive: p13817131_112030_Linux-x86-64.zip

  creating: 13817131/

  creating: 13817131/etc/

  creating: 13817131/etc/xml/

 inflating: 13817131/etc/xml/ShiphomeDirectoryStructure.xml 

 inflating: 13817131/etc/xml/GenericActions.xml 

  creating: 13817131/etc/config/

 inflating: 13817131/etc/config/inventory.xml 

 inflating: 13817131/etc/config/actions.xml 

 inflating: 13817131/etc/config/deploy.xml 

  creating: 13817131/online/

  creating: 13817131/online/files/

  creating: 13817131/online/files/hpatch/

 inflating: 13817131/online/files/hpatch/bug13817131.pch 

  creating: 13817131/online/etc/

  creating: 13817131/online/etc/xml/

 inflating: 13817131/online/etc/xml/GenericActions.xml 

 inflating: 13817131/online/etc/xml/ShiphomeDirectoryStructure.xml 

  creating: 13817131/online/etc/config/

 inflating: 13817131/online/etc/config/actions.xml 

 inflating: 13817131/online/etc/config/deploy.xml 

 inflating: 13817131/online/etc/config/inventory.xml 

  creating: 13817131/files/

  creating: 13817131/files/lib/

  creating: 13817131/files/lib/libserver11.a/

 inflating: 13817131/files/lib/libserver11.a/ksfq.o 

 inflating: 13817131/README.txt    

 

3.2 查看Patch 类型3.2.1 用树形结构看一下:如果是online patch,会有online 的目录:

[oracle@dave u01]$ ls

13817131 dave       dave2.trc  p13817131_112030_Linux-x86-64.zip  rcopy.sh     rename.sh

app      dave1.trc  nohup.out  rcopy.out                          rcopy.sh.out

[oracle@dave u01]$ tree 13817131

13817131

|-- etc

|  |-- config

|  |   |-- actions.xml

|  |   |-- deploy.xml

|  |   `-- inventory.xml

|  `-- xml

|      |-- GenericActions.xml

|      `-- ShiphomeDirectoryStructure.xml

|-- files

|  `-- lib

|      `-- libserver11.a

|          `-- ksfq.o

|-- online

|  |-- etc

|  |   |-- config

|  |   |   |-- actions.xml

|  |   |   |-- deploy.xml

|  |   |   `-- inventory.xml

|  |   `-- xml

|  |       |-- GenericActions.xml

|  |       `--ShiphomeDirectoryStructure.xml

|  `-- files

|      `-- hpatch

|          `-- bug13817131.pch

`-- README.txt

 

12 directories, 13 files

 

3.2.2 使用opatch 查看patch 类型:

[oracle@dave u01]$ mv 13817131/u01/app/oracle/product/11.2.0/db_1/OPatch

[oracle@dave u01]$ cd/u01/app/oracle/product/11.2.0/db_1/OPatch

[oracle@dave OPatch]$ ls

13817131 emdpatch.pl  jlib  opatch     opatch.ini  opatchprereqs

docs     fmw          ocm   opatch.bat opatch.pl

[oracle@dave OPatch]$ ./opatch query 13817131 -all

Invoking OPatch 11.2.0.1.7

 

Oracle Home       : /u01/app/oracle/product/11.2.0/db_1

Central Inventory : /u01/app/oraInventory

  from           : /etc/oraInst.loc

OPatch version    : 11.2.0.1.7

OUI version       : 11.2.0.3.0

Log file location :/u01/app/oracle/product/11.2.0/db_1/cfgtoollogs/opatch/opatch2012-10-09_19-00-40????.log

 

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

 Patch created on 25 Sep 2012, 08:46:37 hrsPST8PDT

 Needto shutdown Oracle instances: true

 Patch is roll-backable: true

 Patch is a "Patchset Update": false

 Patch is a rolling patch: true

 Patch has sql related actions: false

 Patch is an online patch: false

 Patch is a portal patch: false

 Patch is an "auto-enabled" patch:false

 

 Listof platforms supported:

  226: Linux x86-64

 

 Listof bugs to be fixed:

  13817131: OAM ORA-7445-[KSFQFCRX()+812] [SIGSEGV] [ADDR 0X8 ]

 

 Thispatch is a "singleton" patch.

 

 Thispatch belongs to the "db" product family

 

 Listof executables affected:

  ORACLE_HOME/bin/oracle

 

 Listof optional components:

  oracle.rdbms:  11.2.0.3.0

 

 Listof optional actions:

  Update /u01/app/oracle/product/11.2.0/db_1/lib/libserver11.a with/ksfq.o

   cd/u01/app/oracle/product/11.2.0/db_1/rdbms/lib

    ; make -f ins_rdbms.mk ioracleORACLE_HOME=/u01/app/oracle/product/11.2.0/db_1

 

 Possible XML representation of the patch:

<ONEOFF REF_ID="13817131"ROLLBACK="T" XML_INV_LOC="oneoffs/13817131/"ACT_INST_VER="11.2.0.3.0" INSTALL_TIME="2012.Oct.09 19:00:40CST">

  <DESC></DESC>

  <REF_LIST>

     <REF NAME="oracle.rdbms" VER="11.2.0.3.0"HOME_IDX="0"/>

  </REF_LIST>

  <BUG_LIST>

    <BUG>13817131</BUG>

  </BUG_LIST>

  <FILE_LIST/>

</ONEOFF>

 

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

 

OPatch succeeded.

 

这里显示为False。 用opatch is_online_patch 查看:

 

[oracle@dave OPatch]$ ./opatch query -is_online_patch 13817131

Invoking OPatch 11.2.0.1.7

 

Oracle Home       : /u01/app/oracle/product/11.2.0/db_1

Central Inventory : /u01/app/oraInventory

  from           : /etc/oraInst.loc

OPatch version    : 11.2.0.1.7

OUI version       : 11.2.0.3.0

Log file location :/u01/app/oracle/product/11.2.0/db_1/cfgtoollogs/opatch/opatch2012-10-09_19-02-47????.log

 

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

 Patch is an online patch: false

 

 

OPatch succeeded.

 

这里显示的还是为False,但实际上,我们的Patch 确实是online 的patch。

 

3.3 应用Patch并确认Online Patch 对内存的消耗:

安装online patch需要额外的消耗一些内存资源,所以这里我们验证一下:

 

--查看pmon 进程的内存消耗:

[oracle@dave 13817131]$ ps -ef|grep pmon|grep-v grep

oracle   2118     1  0 15:15 ?        00:00:13 ora_pmon_dave

 

[oracle@dave 13817131]$ pmap -d 2118 |tail -20

00007fb4ef13a000    1020 ----- 0000000000289000 008:00003libnnz11.so

00007fb4ef239000     264 rwx-- 0000000000288000 008:00003libnnz11.so

00007fb4ef27b000      12 rwx-- 0000000000000000 000:00000   [ anon ]

00007fb4ef28d000       4 rwxs- 0000000000000000 008:00003hc_dave.dat

00007fb4ef28e000       8 rwx-- 0000000000000000 000:00000   [ anon ]

00007fb4ef290000     864 r-x-- 0000000000000000 008:00003libskgxp11.so

00007fb4ef368000    1024 ----- 00000000000d8000 008:00003libskgxp11.so

00007fb4ef468000       8 rwx-- 00000000000d8000 008:00003libskgxp11.so

00007fb4ef46a000     392r-x-- 0000000000000000 008:00003 libcell11.so

00007fb4ef4cc000    1024 ----- 0000000000062000 008:00003libcell11.so

00007fb4ef5cc000      40 rwx-- 0000000000062000 008:00003libcell11.so

00007fb4ef5d6000       8 rwx-- 0000000000000000 000:00000   [ anon ]

00007fb4ef5d8000       4 r-x-- 0000000000000000 008:00003libodmd11.so

00007fb4ef5d9000    1024 ----- 0000000000001000 008:00003libodmd11.so

00007fb4ef6d9000       4 rwx-- 0000000000001000 008:00003libodmd11.so

00007fb4ef6da000       4 rwx-- 0000000000000000 000:00000   [ anon ]

00007ffff0261000     132 rwx-- 0000000000000000 000:00000   [ stack ]

00007ffff03f6000       4 r-x-- 0000000000000000 000:00000   [ anon ]

ffffffffff600000       4 r-x-- 0000000000000000 000:00000   [ anon ]

mapped: 958080K    writeable/private: 8056K    shared: 720900K

 

 

--安装Patch:

oracle@dave 13817131]$ opatch apply online -connectString dave:sys:oracle

Invoking OPatch 11.2.0.1.7

 

Oracle 中间补丁程序安装程序版本11.2.0.1.7

版权所有 (c) 2011, Oracle Corporation。保留所有权利。

 

 

Oracle Home       : /u01/app/oracle/product/11.2.0/db_1

Central Inventory : /u01/app/oraInventory

  from           : /etc/oraInst.loc

OPatch version    : 11.2.0.1.7

OUI version       : 11.2.0.3.0

Log file location :/u01/app/oracle/product/11.2.0/db_1/cfgtoollogs/opatch/opatch2012-10-09_19-10-51下午.log

 

 

补丁程序只应在 ‘-all_nodes‘ 模式下应用/回退。

将 RAC 模式转换为‘-all_nodes‘ 模式。

Applying interim patch ‘13817131‘ to OH‘/u01/app/oracle/product/11.2.0/db_1‘

Verifying environment and performingprerequisite checks...

 

是否继续? [y|n]

y

User Responded with: Y

All checks passed.

Backing up files...

 

正在为组件 oracle.rdbms, 11.2.0.3.0 打补丁...

The patch will be installed on activedatabase instances.

正在数据库 ‘dave‘ 上安装和启用联机补丁程序 ‘bug13817131.pch‘。

 

Patch 13817131 successfully applied

Log file location:/u01/app/oracle/product/11.2.0/db_1/cfgtoollogs/opatch/opatch2012-10-09_19-10-51下午.log

 

OPatch succeeded.

 

 

--查看alert log:

Tue Oct 09 19:11:05 2012

Patch file bug13817131.pch is out of syncwith oracle binary; performing fixup

Patch file bug13817131.pch has been syncedwith oracle binary

Patch bug13817131.pchInstalled - Update #1

Patch bug13817131.pchEnabled - Update #2

Tue Oct 09 19:11:07 2012

Online patch bug13817131.pch has beeninstalled

Online patch bug13817131.pch has beenenabled

 

--再次查看pmon 进程的内存:

[oracle@dave trace]$ ps -ef|grep pmon|grep-v grep

oracle   2118     1  0 15:15 ?        00:00:14 ora_pmon_dave

 

[oracle@dave trace]$ pmap -d 2118|tail -20

00007fb4ef239000     264 rwx-- 0000000000288000 008:00003libnnz11.so

00007fb4ef27b000      12 rwx-- 0000000000000000 000:00000   [ anon ]

00007fb4ef28c000       4 r-x-- 000000000c955000 008:00003oracle

00007fb4ef28d000       4 rwxs- 0000000000000000 008:00003hc_dave.dat

00007fb4ef28e000       8 rwx-- 0000000000000000 000:00000   [ anon ]

00007fb4ef290000     864 r-x-- 0000000000000000 008:00003libskgxp11.so

00007fb4ef368000    1024 ----- 00000000000d8000 008:00003libskgxp11.so

00007fb4ef468000       8 rwx-- 00000000000d8000 008:00003libskgxp11.so

00007fb4ef46a000     392r-x-- 0000000000000000 008:00003 libcell11.so

00007fb4ef4cc000    1024 ----- 0000000000062000 008:00003libcell11.so

00007fb4ef5cc000      40 rwx-- 0000000000062000 008:00003libcell11.so

00007fb4ef5d6000       8 rwx-- 0000000000000000 000:00000   [ anon ]

00007fb4ef5d8000       4 r-x-- 0000000000000000 008:00003libodmd11.so

00007fb4ef5d9000    1024 ----- 0000000000001000 008:00003libodmd11.so

00007fb4ef6d9000       4 rwx-- 0000000000001000 008:00003libodmd11.so

00007fb4ef6da000       4 rwx-- 0000000000000000 000:00000   [ anon ]

00007ffff0261000     132 rwx-- 0000000000000000 000:00000   [ stack ]

00007ffff03f6000       4 r-x-- 0000000000000000 000:00000   [ anon ]

ffffffffff600000       4 r-x-- 0000000000000000 000:00000   [ anon ]

mapped: 964344K    writeable/private: 8068K    shared: 720900K

 

--安装Patch 之前是:

mapped: 958080K    writeable/private: 8056K    shared: 720900K。

 

private 内存增加了 8k。

 

--并且安装之后,从pmon 进程的内存中,可以看到多出如下3个库文件:

 [oracle@davetrace]$ pmap -d 2118|grep 13817131

00007fb4ecf66000     168 r-x-- 0000000000000000 008:00003bug13817131.so

00007fb4ecf90000    1020 ----- 000000000002a000 008:00003bug13817131.so

00007fb4ed08f000      12 rwx-- 0000000000029000 008:00003bug13817131.so

 

3.4 使用oradebug 来禁用patch

 

在1.7 小节提到了2种Oracle 不推荐的,使用oradebug 来禁用online patch的方法。 我们这里测试一下。

 

(1)使用Oradebug

 

SQL> oradebug patch list

 

Patch File Name                                   State

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

bug13817131.pch                                  ENABLED

 

SQL> oradebugpatch disable bug13817131.pch

Statement processed.

SQL> oradebug patch list

 

Patch File Name                                   State

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

bug13817131.pch                                  DISABLED

 

注意,这种方法不会释放安装onlinepatch 时消耗的额外内存。

 

[oracle@dave trace]$ pmap -d 2118|tail-20    

00007fb4ef239000     264 rwx-- 0000000000288000 008:00003libnnz11.so

00007fb4ef27b000      12 rwx-- 0000000000000000 000:00000   [ anon ]

00007fb4ef28c000       4 r-x-- 000000000c955000 008:00003oracle

00007fb4ef28d000       4 rwxs- 0000000000000000 008:00003hc_dave.dat

00007fb4ef28e000       8 rwx-- 0000000000000000 000:00000   [ anon ]

00007fb4ef290000     864 r-x-- 0000000000000000 008:00003libskgxp11.so

00007fb4ef368000    1024 ----- 00000000000d8000 008:00003libskgxp11.so

00007fb4ef468000       8 rwx-- 00000000000d8000 008:00003libskgxp11.so

00007fb4ef46a000     392 r-x-- 0000000000000000 008:00003libcell11.so

00007fb4ef4cc000    1024 ----- 0000000000062000 008:00003libcell11.so

00007fb4ef5cc000      40 rwx-- 0000000000062000 008:00003libcell11.so

00007fb4ef5d6000       8 rwx-- 0000000000000000 000:00000   [ anon ]

00007fb4ef5d8000       4 r-x-- 0000000000000000 008:00003libodmd11.so

00007fb4ef5d9000    1024 ----- 0000000000001000 008:00003libodmd11.so

00007fb4ef6d9000       4 rwx-- 0000000000001000 008:00003libodmd11.so

00007fb4ef6da000       4 rwx-- 0000000000000000 000:00000   [ anon ]

00007ffff0261000     132 rwx-- 0000000000000000 000:00000   [ stack ]

00007ffff03f6000       4 r-x-- 0000000000000000 000:00000   [ anon ]

ffffffffff600000       4 r-x-- 0000000000000000 000:00000   [ anon ]

mapped: 964344K    writeable/private: 8068K    shared: 720900K

 

--使用oradebug enable patch:

SQL> oradebug patch enablebug13817131.pch

Statement processed.

SQL> oradebug patch list

 

Patch File Name                                   State

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

bug13817131.pch                                  ENABLED

 

 

(2)关闭实例并移除配置文件

 

Shutting the instancedown and removing the orapatch*.cfg file. Afterstopping the instance do the following:

cd $ORACLE_HOME/hpatch
rm orapatch$ORACLE_SID.cfg

--这里强调是关闭实例在操作,否则可能会出现其他意外情况。


Removing the orapatch*.cfg removes all of the online patches currentlyinstalled for the instance.

--该方法会移除所有online patch:

[oracle@dave db_1]$ cd hpatch/

[oracle@dave hpatch]$ pwd

/u01/app/oracle/product/11.2.0/db_1/hpatch

[oracle@dave hpatch]$ ls

bug13817131.pch  bug13817131.pchdave.fixup  bug13817131.so  orapatchdave.cfg

 

 

3.5 rollback patch

语法参考1.7 小节。

 

[oracle@dave db_1]$ opatch rollback -id 13817131 -connectString dave:sys:oracle

Invoking OPatch 11.2.0.1.7

 

Oracle 中间补丁程序安装程序版本11.2.0.1.7

版权所有 (c) 2011, Oracle Corporation。保留所有权利。

 

 

Oracle Home       : /u01/app/oracle/product/11.2.0/db_1

Central Inventory : /u01/app/oraInventory

  from           : /etc/oraInst.loc

OPatch version    : 11.2.0.1.7

OUI version       : 11.2.0.3.0

Log file location :/u01/app/oracle/product/11.2.0/db_1/cfgtoollogs/opatch/opatch2012-10-09_19-32-31下午.log

 

RollbackSession 从OH ‘/u01/app/oracle/product/11.2.0/db_1‘ 回退中间补丁程序‘13817131‘

 

补丁程序只应在 ‘-all_nodes‘ 模式下应用/回退。

将 RAC 模式转换为‘-all_nodes‘ 模式。

 

正在为组件 oracle.rdbms, 11.2.0.3.0 打补丁...

The patch will be removed from activedatabase instances.

正在数据库 ‘dave‘ 上禁用和删除联机补丁程序 ‘bug13817131.pch‘

 

RollbackSession 从产品清单中删除中间补丁程序 ‘13817131‘

Log file location:/u01/app/oracle/product/11.2.0/db_1/cfgtoollogs/opatch/opatch2012-10-09_19-32-31下午.log

 

OPatch succeeded.

 

 

--alert log信息:

Tue Oct 09 19:32:41 2012

Patch bug13817131.pch Disabled - Update #5

Patch bug13817131.pch Removed - Update #6

Tue Oct 09 19:32:44 2012

Online patchbug13817131.pch has been disabled

Online patchbug13817131.pch has been removed

 

--查看PMON进程对内存的消耗:

[oracle@dave trace]$ pmap -d 2118|tail-20    

00007fb4ef239000     264 rwx-- 0000000000288000 008:00003libnnz11.so

00007fb4ef27b000      12 rwx-- 0000000000000000 000:00000   [ anon ]

00007fb4ef28c000       4 r-x-- 000000000c955000 008:00003oracle

00007fb4ef28d000       4rwxs- 0000000000000000 008:00003 hc_dave.dat

00007fb4ef28e000       8 rwx-- 0000000000000000 000:00000   [ anon ]

00007fb4ef290000     864 r-x-- 0000000000000000 008:00003libskgxp11.so

00007fb4ef368000    1024 ----- 00000000000d8000 008:00003libskgxp11.so

00007fb4ef468000       8 rwx-- 00000000000d8000 008:00003libskgxp11.so

00007fb4ef46a000     392 r-x-- 0000000000000000 008:00003libcell11.so

00007fb4ef4cc000    1024 ----- 0000000000062000 008:00003libcell11.so

00007fb4ef5cc000      40 rwx-- 0000000000062000 008:00003libcell11.so

00007fb4ef5d6000       8 rwx-- 0000000000000000 000:00000   [ anon ]

00007fb4ef5d8000       4 r-x-- 0000000000000000 008:00003libodmd11.so

00007fb4ef5d9000    1024 ----- 0000000000001000 008:00003libodmd11.so

00007fb4ef6d9000       4 rwx-- 0000000000001000 008:00003libodmd11.so

00007fb4ef6da000       4 rwx-- 0000000000000000 000:00000   [ anon ]

00007ffff0261000     132 rwx-- 0000000000000000 000:00000   [ stack ]

00007ffff03f6000       4 r-x-- 0000000000000000 000:00000   [ anon ]

ffffffffff600000       4 r-x-- 0000000000000000 000:00000   [ anon ]

mapped: 964344K    writeable/private: 8068K    shared: 720900K

 

这里我们使用oradebugdisable 和opatch rollback 都不会释放安装online patch 消耗的额外内存。当然重启实例之后,这些内存自会释放。


hot patching

标签:hot patching

原文地址:http://11106335.blog.51cto.com/11096335/1862024

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!