码迷,mamicode.com
首页 > 数据库 > 详细

Linux命令:MySQL系列之十四--MySQL备份与还原(xtrabackup工具重要章节)

时间:2017-06-14 16:22:10      阅读:187      评论:0      收藏:0      [点我收藏+]

标签:percona-xtrabackup

一、percona-xtrabckup安装
环境:redhat 6.0
数据库:mysql 5.5.28  (编译安装)

1,官网下载并安装(下载地址文章尾部)

[root@lamp ~]# rpm -ivh percona-xtrabackup-2.0.0-417.rhel6.x86_64.rpm 

warning: percona-xtrabackup-2.0.0-417.rhel6.x86_64.rpm: Header V4 DSA/SHA1 Signature, key ID cd2efd2a: NOKEY

error: Failed dependencies:

mysql is needed by percona-xtrabackup-2.0.0-417.rhel6.x86_64

提示安装percona-xtrabackup需要mysql(因为编译安装的路径与yum安装的目录不同所以需要通过yum安装mysql,但是不启用该方式安装的mysql)

[root@lamp ~]# yum install mysql

Loaded plugins: refresh-packagekit, rhnplugin

--> Running transaction check

---> Package mysql.x86_64 0:5.1.47-4.el6 set to be updated

--> Finished Dependency Resolution

...........

Installing:

 mysql                x86_64                5.1.47-4.el6                Server                889 k

Transaction Summary

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

Warning: RPMDB altered outside of yum.

  Installing     : mysql-5.1.47-4.el6.x86_64                                                    1/1 

Installed:

  mysql.x86_64 0:5.1.47-4.el6                                                                       

Complete!                  #yum安装mysql完成

[root@lamp ~]# rpm -ivh percona-xtrabackup-2.0.0-417.rhel6.x86_64.rpm   #再次执行rpm安装 

warning: percona-xtrabackup-2.0.0-417.rhel6.x86_64.rpm: Header V4 DSA/SHA1 Signature, key ID cd2efd2a: NOKEY

Preparing...                ########################################### [100%]

   1:percona-xtrabackup     ########################################### [100%]

# percona-xtrabackup 安装完成

[root@lamp ~]# rpm -ql percona-xtrabackup  #查看安装的相关目录 (绿色目录为主要使用目录及运行程序)

/usr/bin/innobackupex

/usr/bin/innobackupex-1.5.1

/usr/bin/xbstream

/usr/bin/xtrabackup

/usr/bin/xtrabackup_51

/usr/bin/xtrabackup_55

/usr/share/doc/percona-xtrabackup-2.0.0

/usr/share/doc/percona-xtrabackup-2.0.0/COPYING

/usr/share/percona-xtrabackup-test

/usr/share/percona-xtrabackup-test/bootstrap.sh

/usr/share/percona-xtrabackup-test/disabled

/usr/share/percona-xtrabackup-test/disabled/ib_include.sh

/usr/share/percona-xtrabackup-test/disabled/tar_compressed.sh

/usr/share/percona-xtrabackup-test/disabled/xb_lru_dump.sh

/usr/share/percona-xtrabackup-test/experimental

...............

[root@lamp ~]# innobackupex --help  #查看相关帮助

注意:
1,之前我安装的2.2.9,但是提示perl-DBI,perl-DBD-mysql的问题,一直无法解决,换成低版本的xtrabackup就可以。
2,如果提示mysql sock问题,在参数中指定sock的路径。

二、使用


备份
备份时无法指定备份名,每一个备份文件夹都是以时间来命名的,里面存放的是数据文件、日志文件,目录需存在,没有则先创建。

1,全量备份
[root@lamp ~]# innobackupex --user=root --password=redhat --host=127.0.0.1 /backup/

  #--user:指定mysql用户  --password:指定用户的密码  --host:指定主机(如果是本机,可以省略此选项)   /backup:指定备份至的目录

***如果要使用一个最小权限的用户进行备份,则可基于如下命令创建此类用户:

mysql > CREATE USER ‘bkpuser‘@‘localhost‘ IDENTIFIED BY ‘redhat‘; #创建用户bkpuser备份用户,并通过IDENTIFIED BY ‘password‘设定密码。

mysql > REVOKE ALL PRIVILEGES, GRANT OPTION FROM ‘bkpuser‘; #revoke取消ALL PRIVILEGES所有授权,GRANT OPTION授权选项从bkpuser用户中。及把bkpuser所有的

操作数据库的权限取消掉

mysql>GRANT RELOAD,LOCK TABLES,REPLICATION CLIENT ON *.* TO ‘bkpuser‘@‘localhost‘; 

#GRANT授权,RELOAD:重新加载的权限,LOCK TABLES:锁表的权限,REPLICATION CLIENT:

复制客户端的权限,ON *.*:对于那些数据有权限,TO:指定授权给那个用户。

mysql > FLUSH PRIVILEGES;  #刷新权限列表,使得权限生效。



1、执行一次完全备份

在备份的同时,innobackupex还会在备份目录中创建如下文件:

(1)xtrabackup_checkpoints ---该文件记录备份类型(如完全或增量)、备份状态(如是否已经为prepared状态)和LSN(日志系列号)范围信息,每个InnoDB页(通常为16K大小)都会包含一个

日志系列号,即LSN,LSN是整个数据库系统的系统版本号,每个页面相关的LSN能够表明此页面

最近是如何发生改变的。

(2)xtrabackup_binlog_info ---mysql服务器当前正在使用的二进制日志文件及至备份这一刻为止二进制日志事件的位置。

(3)xtrabackup_binlog_pos_innodb ---二进制日志文件及用于InnoDB或XtraDB表的二进制日志文件的当前positon。

(4)xtrabackup_binary  ---备份中用到的xtrabackup的可执行文件;

(5)backup-my.cnf  ---备份命令用到的配置选项信息;

在使用innobackupex进行备份时,还可以使用--no-timestamp选项来阻止命令自动创建一个以时间命名的目录;如此一来,innobackupex命令将会创建一个BACKUP-DIR目录来存储备份数据。

2、执行完全备份后的准备:

一般情况下,在完全备份后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。因此,此时数据文件仍处理不一致的状态。‘准备’的主要作用正是通过回滚未提交的事务及同步已经提交的事务至数据文件也使得数据文件处于一致性状态。

innobackupex命令的--apply-log选项可用于实现上述功能,如下面的命令;

[root@lamp ~]# innobackupex --apply-log /PATH/TO/BACKUP-DIR  #/PATH/TO/BACKUP-DIR为刚才执行完全备份所保存的目录。

如果执行正确,其 最后输出的几行信息通常如下:

xtrabackup: starting shutdown with innodb_fast_shutdown = 1

170610 17:26:33 InnoDB: Starting shutdown...

170610 17:26:46 InnoDB: Shutdown completed; log sequence number 92036620

170610 17:26:58 innobackupex: completed OK!

在实现“准备”的过程中,innobackupex通常还可以使用--use-memory选项来指定其可以使用的内存的大小,默认通常为100M。如果有足够的内存可用,可以多划分一些内存给prepare的过程,

以提高其完成的速度。

3、从一个完全备份中恢复数据

innobackupex 命令的--copy-back选项用于执行恢复操作,其通过复制所有数据文件相关的文件至mysql服务器DATADIR目录中来执行恢复过程,innobackupex通过backup-my.cnf来获取DATADIR目录的相关信息。



4,使用innobackupex进行增量备份

每个InnoDB的页面都会包含一个LSN信息,每当相关的数据发生改变,相关的页面的LSN就会自动增长,这正式InnoDB表可以进行增量备份的基础,即innobackupex通过备份上次完全备份之后发生改变的页面来实现。

要实现第一次增量备份,可以使用下面的命令进行:

# innobackupex --user=root --password=redhat --host=127.0.0.1 --incremental /backup --incremental-basedir=BASEDIR  #--user:指定用户,--password:指定密码,--host:指定需要备份的主机(如果备份本机可以省略此选项),--incremental:指定增量备份存放的目录,--incremental-basedir:指定完全备份的所在的目录。

[root@lamp ~]# innobackupex --user=root --password=redhat --

host=127.0.0.1  --incremental  /backup/ --incremental-basedir=/backup/2017-06-09_16-34-35/ 

***执行增量备份命令后,innobackuppex 命令会在/backup目录中创建一个新的以时间命名的目录以存放所有的增量备份数据,另外,在执行增量备份后再一次进行增量备份时,--incremental-basedir应该指向上一次的增量备份所在的目录。

需要注意的是,增量备份仅能用于InnoDB或xtraDB表,对于MyISAM表而言,执行增量备份时其实进行的是完全备份。

**准备**(prepare)增量备份与准备完全备份有着一些不同,尤其要注意的是:

(1)需要在每个备份(包括完全和各个增量备份)上,将已经提交的事务进行“重放”,“重放”之后,所有的备份数据将合并到完全备份上。

(2)基于所有的备份将未提交的事务进行“回滚”

于是,准备操作就变成了:

  1、先准备完全备份的操作:

[root@lamp ~]# innobackupex --apply-log --redo-only BASE-DIR #执行完全备份的准备,

BASE-DIR:是完全备份存放的路径,--redo-only:执行事务选择redo

  2、执行提交第一次增量备份的操作:

[root@lamp ~]# innobackupex -apply-log -redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR-1  #其中BASE-DIR:指的是完全备份所在的目录,而INCREMENTAL-DIR-1指的是第一次增量备份的目录

  3、执行提交第二次增量备份的操作:

[root@lamp ~]# innobackupex -apply-log -redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR-2  #其中BASE-DIR:指的是完全备份所在的目录,而INCREMENTAL-DIR-2指的是第二次增量备份的目录

 如果有多次增量备份,每一次备份完后都要执行如上准备操作,才可以用于后期的恢复操作。执行完整备份和多次增量备份准备工作后,所有数据都会保存在指定的完全备份BASE-DIR路径,后期恢复的时候

只要执行innobackupex --copy-back BASE-DIR  就可以把所有数据恢复回来。BASE-DIR为完全备份存放的目录。



5、导入或到处单张表:

默认情况下,InnoDB表不能通过直接复制表文件的方式再mysql服务器之间进行移植,及时使用innodb_file_per_table选项,而使用Xtrabackup工具可以实现此种功能,不过,此时需要“导出”表的mysql服务器启用了innodb_file_per_table选项(严格来说,是要“导出”的表在其创建之前,mysql服务

器就启用了innodb_file_per_table选项及每表一个表空间),并且“导入”表的服务器同时启用了innodb_file_per_table和

innodb_expand_import选项。

  (1)“导出”表

   导出表是在备份的prepare阶段进行的,因此,一旦完全备份完成,就可以在prepare过程中通过

--export选项将某表导出了;

[root@lamp ~]# innobackupex --apply-log --export /path/to/backup

#此命令会在每个innodb表的表空间创建一个以.exp结尾的文件,这些以.exp结尾的文件则可以用于导入至其他服务器。

  (2)“导出”表

    要在mysql服务器上导入来自于其他服务器的某innodb表,需要先在当前服务器上创建一个跟原来表表结构一致的表,而后才能实现将表导入:

 mysql> CREATE TABLE mytable (...) ENGINE=InnoDB;

然后将此表的表空间删除;

 mysql> ALTER TABLE mydatabase.mytable DISCARD TABLESPACE;

接下来,将来自于“导出”表的服务器的mytable表的mytable.ibd和mytable.exp文件复制到当前服务器的数据目录,然后使用如下命令将其“导入”;

mysql> ALTER TABLE mydatabase.mytable IMPORT TABLESPACE;



***************************************************************************************

实例:执行备份恢复过程及步骤

先执行一次完全备份操作:

[root@lamp ~]# innobackupex --user=root --password=redhat /backup #执行完全备份

InnoDB Backup Utility v1.5.1-xtrabackup; Copyright 2003, 2009 Innobase Oy

and Percona Inc 2009-2012.  All Rights Reserved.

This software is published under

..............................

170609 16:34:54  innobackupex: All tables unlocked

170609 16:34:54  innobackupex: Connection to database serve               r closed

innobackupex: Backup created in directory ‘/backup/2017-06-09_16-34-35‘

innobackupex: MySQL binlog position: filename ‘mysql-bin.000002‘, position 107

170609 16:34:54  innobackupex: completed OK!   #备份完成

[root@lamp ~]# ls /backup  #红色字体目录为刚才备份的数据目录

2017-06-09_16-34-35     incremental-2017-06-06-17-01-41.sql

full-backup-2017-06-06  master-2017-06-06.info

[root@lamp ~]#  cd /backup/2017-06-09_16-34-35/

[root@lamp 2017-06-09_16-34-35]# ls

backup-my.cnf  jiaowu  performance_schema  testdb                  xtrabackup_checkpoints

hellodb        mydb    stu                 xtrabackup_binary       xtrabackup_logfile

ibdata1        mysql   test                xtrabackup_binlog_info

[root@lamp ~]# innobackupex --apply-log --redo-only /backup/2017-06-09_16-34-35  #执行完全备份的准备,把相关事务写入到完全备份目录中。

InnoDB Backup Utility v1.5.1-xtrabackup; Copyright 2003, 2009 Innobase Oy

and Percona Inc 2009-2012.  All Rights Reserved.

This software is published under

..........................................

xtrabackup: starting shutdown with innodb_fast_shutdown = 1

170612 11:38:51  InnoDB: Starting shutdown...

170612 11:38:56  InnoDB: Shutdown completed; log sequence number 1631244

170612 11:38:56  innobackupex: completed OK!  #执行准备完成

然后把相关的二进制日志备份好,以备到时还原所用。

[root@lamp data]# cp -a mysql-bin.* /backup/  #复制二进制日志文件至备份目录 -a:复制文件时连带权限属性一起复制。

[root@lamp data]#  ls /backup/

2017-06-09_16-34-35     incremental-2017-06-06-17-01-41.sql  mysql-bin.000001  mysql-bin.000003      mysql-bin.000002    mysql-bin.index

[root@lamp data]# service mysqld stop  #停止mysqld服务

Shutting down MySQL..                                      [  OK  ]

[root@lamp data]# rm -rf ./*   #模拟mysqld数据目录丢失

[root@lamp data]# ls

[root@lamp data]# pwd

/mydata/data

[root@lamp data]# service mysqld start  #启动mysqld服务,此时由于数据丢失无法启动

Starting MySQL....The server quit without updating PID file[FAILED]a/data/lamp.pid).

[root@lamp ~]# innobackupex --copy-back /backup/2017-06-09_16-34-35/   #执行完全备份的数据恢复

(不用初始化数据库,可以直接执行数据恢复操作)

InnoDB Backup Utility v1.5.1-xtrabackup; Copyright 2003, 2009 Innobase Oy

and Percona Inc 2009-2012.  All Rights Reserved.

This software is published under

the GNU GENERAL PUBLIC LICENSE Version 2, June 1991.

IMPORTANT: Please check that the copy-back run completes successfully.

           At the end of a successful copy-back run innobackupex

           prints "completed OK!".

innobackupex: Starting to copy files in ‘/backup/2017-06-09_16-34-35‘

innobackupex: back to original data directory ‘/mydata/data‘

...............................................

innobackupex: in ‘/backup/2017-06-09_16-34-35‘

innobackupex: back to original InnoDB log directory ‘/mydata/data‘

innobackupex: Finished copying back files.

170612 14:46:18  innobackupex: completed OK!   #数据恢复完成

[root@lamp data]# pwd

/mydata/data

[root@lamp data]# ll  #恢复完成后数据目录的属主和属主都为root,所以需要更改数据目录的属主和属组。

total 28712

drwxr-xr-x. 2 root root     4096 Jun 12 14:46 hellodb

-rw-r-----. 1 root root 18874368 Jun 12 11:38 ibdata1

-rw-r--r--. 1 root root  5242880 Jun 12 14:46 ib_logfile0

-rw-r--r--. 1 root root  5242880 Jun 12 14:46 ib_logfile1

drwxr-xr-x. 2 root root     4096 Jun 12 14:46 jiaowu

drwxr-xr-x. 2 root root     4096 Jun 12 14:46 mydb

drwxr-xr-x. 2 root root     4096 Jun 12 14:46 mysql

drwxr-xr-x. 2 root root     4096 Jun 12 14:46 performance_schema

drwxr-xr-x. 2 root root     4096 Jun 12 14:46 stu

drwxr-xr-x. 2 root root     4096 Jun 12 14:46 test

drwxr-xr-x. 2 root root     4096 Jun 12 14:46 testdb

-rw-r--r--. 1 root root       24 Jun 12 14:46 xtrabackup_binlog_pos_innodb

-rw-r--r--. 1 root root       77 Jun 12 14:46 xtrabackup_checkpoints

[root@lamp data]# chown -R mysql:mysql /mydata/data  #修改目录的属主和属组,使得mysql用户有权限操作该目录下的所有文件,-R递归修改。

[root@lamp data]# ll

total 28712

drwxr-xr-x. 2 mysql mysql     4096 Jun 12 14:46 hellodb

-rw-r-----. 1 mysql mysql 18874368 Jun 12 11:38 ibdata1

-rw-r--r--. 1 mysql mysql  5242880 Jun 12 14:46 ib_logfile0

-rw-r--r--. 1 mysql mysql  5242880 Jun 12 14:46 ib_logfile1

drwxr-xr-x. 2 mysql mysql      4096 Jun 12 14:46 jiaowu

drwxr-xr-x. 2 mysql mysql     4096 Jun 12 14:46 mydb

drwxr-xr-x. 2 mysql mysql    4096 Jun 12 14:46 mysql

drwxr-xr-x. 2 mysql mysql     4096 Jun 12 14:46 performance_schema

drwxr-xr-x. 2 mysql mysql     4096 Jun 12 14:46 stu

drwxr-xr-x. 2 mysql mysql     4096 Jun 12 14:46 test

drwxr-xr-x. 2 mysql mysql    4096 Jun 12 14:46 testdb

-rw-r--r--. 1 mysql mysql       24 Jun 12 14:46 xtrabackup_binlog_pos_innodb

-rw-r--r--. 1 mysql mysql       77 Jun 12 14:46 xtrabackup_checkpoints

[root@lamp data]#  service mysqld start  #启动mysqld服务

Starting MySQL..                                           [  OK  ]

[root@lamp data]# mysql -uroot -p  #登录mysql客户端

Enter password: 

Welcome to the MySQL monitor.  Commands end with ; or \g.

Your MySQL connection id is 2

Server version: 5.5.28-log Source distribution

Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its

affiliates. Other names may be trademarks of their respective

owners.

Type ‘help;‘ or ‘\h‘ for help. Type ‘\c‘ to clear the current input statement.

mysql> SHOW DATABASES;    #完全备份的数据已经恢复。

+--------------------+

| Database           |

+--------------------+

| information_schema |

| hellodb            |

| jiaowu             |

| mydb               |

| mysql              |

| performance_schema |

| stu                |

| test               |

| testdb             |

+--------------------+

9 rows in set (0.00 sec)

mysql> SELECT * FROM tutors;  #查看表内容

+-----+--------------+--------+------+

| TID | Tname        | Gender | Age  |

+-----+--------------+--------+------+

|   1 | HongQigong   | M      |   93 |

|   2 | HuangYaoshi  | M      |   63 |

|   3 | Miejueshitai | F      |   72 |

|   4 | OuYangfeng   | M      |   76 |

|   5 | YiDeng       | M      |   90 |

|   6 | YuCanghai    | M      |   56 |

|   7 | Jinlunfawang | M      |   67 |

|   8 | HuYidao      | M      |   42 |

|   9 | NingZhongze  | F      |   49 |

+-----+--------------+--------+------+

9 rows in set (0.00 sec)

打开另一个终端连接,把二进制日志导出

[root@lamp ~]#mysqlbinlog /backup/mysql-bin.000001 > /tmp/test.sql #导出二进制日志文件至

/tmp目录下的test.sql以便实现及时点恢复


mysql> SET sql_log_bin=0;  #导入二进制日志文件时,先关闭二进制日志记录功能

Query OK, 0 rows affected (0.00 sec)

mysql> SOURCE /tmp/test.sql   #导入二进制日志文件test.sql到数据库 source相当于./

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

mysql> SELECT * FROM tutors;

+-----+--------------+--------+------+

| TID | Tname        | Gender | Age  |

+-----+--------------+--------+------+

|   1 | HongQigong   | M      |   93 |

|   2 | HuangYaoshi  | M      |   63 |

|   3 | Miejueshitai | F      |   72 |

|   4 | OuYangfeng   | M      |   76 |

|   5 | YiDeng       | M      |   90 |

|   6 | YuCanghai    | M      |   56 |

|   7 | Jinlunfawang | M      |   67 |

|   8 | HuYidao      | M      |   42 |

|   9 | NingZhongze  | F      |   49 |

+-----+--------------+--------+------+

9 rows in set (0.00 sec)

mysql> SET sql_log_bin=1;  #恢复完二进制日志后,千万别忘记把二进制日志记录功能打开。

Query OK, 0 rows affected (0.00 sec)


对于增量备份也可以通过增量备份准备把所有增量备份的数据都写入到完全备份保存的目录,到时候恢复只要直接回复完全备份的内容即可,当然下一次再次执行数据备份时,需再次做一次完全备份,然后再做增量备份。

**准备**(prepare)增量备份与准备完全备份有着一些不同,尤其要注意的是:

(1)需要在每个备份(包括完全和各个增量备份)上,将已经提交的事务进行“重放”,“重放”之后,所有的备份数据将合并到完全备份上。

(2)基于所有的备份将未提交的事务进行“回滚”

于是,准备操作就变成了:

  1、先准备完全备份的操作:

[root@lamp ~]# innobackupex --apply-log --redo-only BASE-DIR #执行完全备份的准备,

BASE-DIR:是完全备份存放的路径,--redo-only:执行事务选择redo

  2、执行提交第一次增量备份的操作:

[root@lamp ~]# innobackupex -apply-log -redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR-1  #其中BASE-DIR:指的是完全备份所在的目录,而INCREMENTAL-DIR-1指的是第一次增量备份的目录

  3、执行提交第二次增量备份的操作:

[root@lamp ~]# innobackupex -apply-log -redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR-2  #其中BASE-DIR:指的是完全备份所在的目录,而INCREMENTAL-DIR-2指的是第二次增量备份的目录

 如果有多次增量备份,每一次备份完后都要执行如上准备操作,才可以用于后期的恢复操作。执行完整备份和多次增量备份准备工作后,所有数据都会保存在指定的完全备份BASE-DIR路径,后期恢复的时候

只要执行innobackupex --copy-back BASE-DIR  就可以把所有数据恢复回来。BASE-DIR为完全备份存放的目录。


**************************************************************************************************


远程备份
压缩备份
[root@lamp ~]#  innobackupex  --user=root --password=redhat --host=127.0.0.1 --stream=tar /tmp | ssh root@10.1.2.208  "gzip - > /tmp/bak.tar.gz"
或者
[root@lamp ~]#  innobackupex  --user=root --password=redhat --host=127.0.0.1 --stream=tar /tmp | gzip | ssh root@10.1.2.208  " /tmp/bak.tar.gz"
--stream=tar:tar格式
gzip:压缩
非压缩备份
[root@lamp ~]# innobackupex  --user=root --password=redhat --host=127.0.0.1 --stream=tar /tmp | ssh root@10.1.2.208  "cat - > /tmp/bak.tar"


远程恢复
数据压缩的文件需要加上 “i”

[root@lamp ~]# tar -izxvf bak.tar.gz




percona-xtrabackup-2.0.0-417.rhel6.x86_64.rpm

下载地址:https://www.percona.com/downloads/XtraBackup/LATEST/


本文出自 “学linux历程” 博客,请务必保留此出处http://woyaoxuelinux.blog.51cto.com/5663865/1936634

Linux命令:MySQL系列之十四--MySQL备份与还原(xtrabackup工具重要章节)

标签:percona-xtrabackup

原文地址:http://woyaoxuelinux.blog.51cto.com/5663865/1936634

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