>  기사  >  데이터 베이스  >  ZRM for MySQL 使用指南

ZRM for MySQL 使用指南

WBOY
WBOY원래의
2016-06-07 16:32:051518검색

MySQL是一个最常见和多功能的数据库软件,越来越多的用户选择了MySQL。MySQL支持从一个用户的应用程序到上百万用户的应用程序。遗憾的是它没有任何系统有效的管理和备份工具。大约30%-40%的MySQL数据库没有系统的备份,很多数据库管理用通过脚本来实现MySQL

  MySQL是一个最常见和多功能的数据库软件,越来越多的用户选择了MySQL。MySQL支持从一个用户的应用程序到上百万用户的应用程序。遗憾的是它没有任何系统有效的管理和备份工具。大约30%-40%的MySQL数据库没有系统的备份,很多数据库管理用通过脚本来实现MySQL数据库备份。

  一、什么是ZRM

  ZRM(Zmanda Recovery Manager for MySQL)是一个健壮MySQL备份和还原解决方案,具有自动化和灵活的特征。它可以非常方便数据库管理员完成备份和恢复工作。ZRM分为商业版和社区版。社区版是免费的,最新的发行版是MySQL-zrm-2.2.0。

  ZRM主要功能包括:

  1、根据你的需求定时备份
  2、集中备份MySQL,集中管理ZRM服务
  3、详细的备份报表输出
  4、通过默认提供的插件可以定制化备份方案
  5、本地备份或者远程备份MySQL数据库
  6、本地存储备份数据,通过SAN硬盘存储或者NAS/SAN存储

  下面的图显示了在本机运行的ZRM for MySQL备份两台MySQL-Server上多个mysql数据库

  备份的功能

  ZRM for MySQL可以备份被mysql服务器管理的多个数据库
  可以备份多台mysql服务器上的多个数据库
  可以备份单个数据库中的表
  可以对数据库进行热备
  根据MySQL表使用的不同的存储引擎支持多种不同的备份方式
  具有两种级别的备份:全备份和对数据库的增量备份
  可以使用mysqldump,mysqlhotcopy,snapshots(Linux LVM/Solaris ZFS)和MySQL replication作为不同的备份方式
  透明实现各种数据库表引擎数据库备份
  在ZRM备份服务器与数据库服务器之间支持SSL认证,可以通过Internet和防火墙安全备份。
  检验备份数据的完整性
  使用标准的工具如gzip,GPG等可以对备份镜像进行压缩或者加密
  灵活控制备份作业
  支持快照备份,并转换真实备份

  恢复的功能

  ZRM for MySQL使得恢复备份的数据变得很容易
  支持使用备份索引文件(index)记录备份过程信息
  它可以使用报表工具查看备份索引文件
  支持恢复完全备份和增量备份
  通过选择MySQL二进制日志中的时间或位置,可选择性的恢复误操作的数据,恢复点可以是二进制日志中时间点或位置
  ZRM for MySQL通过MySQL二进制日志可以很容易的过滤出对数据库操作的行为,可以帮助决定哪些被恢复,哪些不被恢复
  根据你所做的备份的类型,可以使用备份在本机恢复或者在不同的机器上进行恢复

  报告和计划任务能力

  ZRM for MySQL可以立即执行备份计划或者按天/按周/按月做备份计划任务
  它可以自动生成备份报告
  它具有预先设定的备份报告也可以用户自定义的备份报告
  它可以报告任何备份的统计或者这些统计的组合
  它支持HTML或者Text格式的报告
  它可以发送email告知备份的运行状态
  它还可以通过RSS feed的方式提供备份报告

  插件

  ZRM for MySQL提供插件来扩展工具功能,数据库管理员通过插件来定制数据库备份。ZRM提供了插件模版,使得创建插件更加容易
它提供了以下可以使用的插件:预先日程插件、预先备份插件、在备份之后插件、拷贝插件、二进制日志分析插件、快照插件。

  二、安装ZRM

  ZRM for MySQL套件是使用perl写的,所以使用环境必须支持perl,这个套件支持MySQL的版本有4.0.x(4.0.24或以上版本),4.1.x,5.x。

  在安装ZRM for MySQL时首先需要检查下列事项:

  1、MySQL的版本是否是被ZRM for MySQL支持的
  2、确认ZRM服务器和mysql服务器上存在mysql用户和组。同时MySQL服务进程是使用相同的用户和组启动的
  3、在MySQL服务器和ZRM服务器上的mysql用户的uid和gid要相同
  4、ZRM for MySQL需要用到mysqladmin、mysqlhotcopy、mysqldump、mysqlbinlog、mysql这些MySql客户端的命令,这些命令需要安装在ZRM for MySQL运行的服务器上
  5、MySQL ZRM必须的perl模块:perl-DBI、perl-DBD-MySQL、perl-XML-Parser

  安装需要的perl模块

yum install perl-XML-Parser perl-DBI perl-DBD-MySQL

  获取ZRM安装包

wget http://www.zmanda.com/downloads/community/ZRM-MySQL/2.2/RPM/MySQL-zrm-2.2.0-1.noarch.rpm

  安装ZRM

rpm  -ivh MySQL-zrm-2.2.0-1.noarch.rpm

  三、创建MySQL执行备份和恢复的用户

  推荐新建一个MySQL备份用户来代替root用户。ZRM需要的mysql数据备份用户和mysql数据恢复用户所需的最小权限分别为::

  备份用户:LOCK TABLES,SELECT,FILE,RELOAD,SUPER,SHOW VIEW

  还原用户:CREATE,DROP,INDEX,SHUTDOWN,INSERT,ALTER,SUPER,REPLICATION CLIENT,CREATE VIEW

  注:在MySQL5.x上执行逻辑备份时,SHOW VIEW and CREATE VIEW 权限是必须的。

  建立一个给ZRM用的备份用户

mysql>grant select,insert,update,create,file,index,drop,reload,shutdown,alter,super,lock tables,replication client,show view,create view on *.* to 'zrm_backup'@'192.168.1.%' identified by '000000';

  四、配置ZRM

  备份集

  ZRM for MySQL使用了”备份集”的功能来优化数据库备份。一个备份集包含的一套数据库或表,同一个备份集将使用同样的备份方式和同样的备份计划。每个备份集的名称在一个备份服务器上是唯一的。

  在全局配置文件/etc/mysql-zrm/mysql-zrm.conf中的参数会作用于所有的数据库,或被备份集中的配置文件参数所覆盖

  要指定备份集的备份参数,需要在备份集目录中添加mysql-zrm.conf配置文件。备份集目录里mysql-zrm.conf定义的参数可以覆盖全局配置文件中定义的。

  除了可以在全局配置文件(通常为/etc/mysql-zrm.conf)和备份集配置文件(通常为/etc/backupsetname/mysql-zrm.conf)中指定备份参数,还可以直接在备份命令中指定参数。当配置了同样的备份参数时,它们的优先级是这样的:备份命令行-备份集的配置文件-全局配置文件。也就是说备份集配置文件中的备份参数会覆盖全局配置文件中的备份参数,备份命令行中的备份参数会覆盖备份集配置文件和全局配置文件中的备份参数。

  在没有设置参数时,ZRM for MySQL采用默认的配置参数。

  多个备份集的好处

  1、根据MySQL数据应用及备份将花费的时间,创建多个备份组是非常明智的。同一个应用的多个数据库或表的备份应该在同一个备份组中。
  2、在一个备份集中,用户可以定义要备份的数据库/表,用户可以定义要备份的数据库,或要备份的表,或要备份的数据库和表。
  3、不同的备份集可以定义备份不同的数据库/表和不同的MySQL数据库备份参数。
  4、所有的备份集可以共享备份数据存储路径。
  
  常用备份集配置参数

  备份参数

  backup-level=0|1
  备份级别指完全备份和增量备份,0代表完全备份,1代表增量备份。默认为0

  backup-mode=raw|logical
  备份模式指逻辑备份和裸备份,裸备份包含真实的数据库文件。logical是通过mysqldump进行备份的文件,逻辑备份包含SQL语句(CREATE TABLE,INSERT)列表。逻辑备份恢复时需要重新执行备份的SQL语句,备份的数据可以很容易的移植到不同的系统平台和数据库平台(不是 MySQL)。默认为raw。

  backup-type
  备份类型指正常备份和快速备份,快速备份使用文件系统自己的快照备份,而不从快照卷复制数据。快速备份可以转换为正常备份。可以从快速备份和正常备份恢复数据。

  destination=/var/lib/mysql-zrm
  指定MySQL备份数据存放的位置,该参数可选,默认是备份服务器上的/var/lib/mysql-zrm目录。该目录应有足够的空 间来存储备份文件,否则备份时会报错。备份用户(通常为root用户)应对该目录具有写权限,并具有创建子目录的权限。

  retention-policy=#nD|nW|nM
  指备份数据保留的时间,可以按天(D),周(W),月(M),年(Y)。一般一个月按30天,一年按365天计算。 如:retention-policy为10M,指备份数据将会保留300天。该参数可选,默认保留时间为永远。

  compress
  该参数值为1表示压缩备份数据,默认为0.默认的压缩程序是gzip(GNU zip)。如果要指定其他的压缩程序,必须用compress-plugin参数指定。

  compress-plugin
  使用绝对路径指定压缩软件,用来压缩已经备份的数据文件。压缩程序必须支持-d选项来解压缩。只有当compress选项为1时,该选 项才有作用。该选项是可选的,默认为gzip程序。

  encrypt
  需要给备份数据文件加密时,需要使该选项置为1.ZRM for MySQL不支持密钥管理。加密程序必须要在encrypt-plugin选项中以绝对路径指定。默认数据文件不会加密,没有指定默认的加密程序。

  encrypt-plugin
  使用绝对路径指定加密软件所在的位置。如果encrypt选项设置为1,该选项必须指定。decrypt-option选项也必须指定。

  decrypt-option
  该选项指定要传递给加密程序的参数,指定解密用到的选项。默认是-d选项,如果是其他选项,或包含多个选项,则要指定多个选项组。

  replication
  当要备份的数据是MySQL复制结构的从服务器是,该选项为1.这样选项备份数据时,不影响生产库。ZRM for MySQL不能自动创建MySQL从服务器,它必须另外单独设置。

  snapshot-plugin
  指定执行快照备份的插件程序,默认为lvm-snapshot。该选项可选,裸备份时,使用快照备份必须制定指定该选项。可以为lvm-snapshot 或zfs-snapshot。如:/usr/share/mysql-zrm/plugins/lvm-snapshot.pl

  snapshot-size
  定义快照备份大小

  comment
  MySQL备份的注释,该注释有助于数据库管理员管理备份数据。可以再后续的报表中看到该注释。

  tmpdir
  以绝对路径指定备份时临时文件的存储位置,包括备份服务器和MySQL数据库服务器上。在备份时,备份服务器和数据库服务器中该目录应有充足的空间;恢复 时,备份服务器该目录也要有充足的空间。如果没有设置,默认为/tmp目录。

  备份组中的数据库/表

  备份时,可以指定单个或多个数据库/表。如果没有指定,默认为所有的数据库。

  all-databases
  如果要备份所有的数据库,该选项应设置为1。

  databases
  用空格隔开列出要备份的多个数据库,

  database
  该选项仅指定一个要备份的数据库。选项tables列出的数据表应属于该数据库。

  tables
  用空格隔开列出备份组中要备份的多个数据表,所有的数据表应属于database选项指定的数据库。要使该选项起作用,必须开启 database选项。ZRM for MySQL不会验证数据表是否属于database选项指定的数据库,当在数据库中找不到相应的表时,备份将会失败。

  MySQL服务参数

  user
  Mysql用户,用于ZRM for MySQL备份和还原。该用户应具有足够的备份及还原权限。参考MySQL备份用户了解更多的信息。如果该选项没有指定,会从my.cnf配置文件读取。

  password
  指定MySQL备份用户的登录密码。密码为明文,所有保证该配置文件的安全。如果该选项没有指定,会从my.cnf配置文件读取

  host
  指定将要备份的MySQL数据库服务器。如果该选项没有指定,会从my.cnf配置文件读取

  port
  MySQL连接端口,该选项可选,默认为3306。

  socket
  指定连接MySQL数据库的套接字接口,该选项可选。如:/var/lib/mysql/mysql.sock

  ssl-options
  连接MySQL服务器的SSL选项。要使用该选项要求MySQL服务器启用了SSL。该选项只有逻辑备份时使用。如:
  ssl-options=”–ssl –ssl-ca=/openssl/cacert.pem –ssl-cert=/openssl/client-cert.pem –ssl-key=/openssl/client-key.pem”

  routines
  逻辑备份时,启用该选项可以备份存储过程。默认不启用。

  default-character-set
  逻辑备份时,该选项指定备份字符集。默认为utf-8

  mysql-binpath
  MySQL命令所在目录。该选项为可选的。当MySQL命令不在/usr/bin目录下时,需要指定。默认按以下顺序搜索:/usr/bin:/usr /sbin:/sbin:/bin:/usr/ucb

  mysql-binlog-path
  MySQL二进制文件所在目录。在增量备份时,需要启用二进制日志。该选项为可选,默认为/var/lib/mysql目录。

  ZRM程序参数

  verbose
  启用冗长的日志输出,可以为0(精简)或1(冗长)。ZRM for MySQL日志文件一般为/var/log/mysql-zrm/mysql-zrm.log

  mailto
  在执行完备份命令后,会发送邮件到该邮件地址。一般为数据库管理员的邮件。该选项可选。

  html-reports
  在备份完成后,输出的预定义的备份报表。该选项只有在指定了html-report-directory或webserver-url选项时才起作用。如 果该选项没有起用,会产生预定义报表backup-status-info。可以用逗号(,)分隔指定多个预定义报表。

  html-report-directory
  在备份服务器上指定备份报表的输出目录。指定该目录后,备份报表会在每次备份后自动产生。html格式的报表将创建在html子目录,txt格式的报表将 创建在txt子目录中。该参数同样作用于mysql-zrm-report命令的-o选项。如果没有指定该参数,将会在当前工作目录创建报表目录。该参数和邮件通知参数无冲突。

  webserver-url
  定义访问html报表和RSS feed的URL。要使备份报表的RSS feed起作用,就必须定义rss-header-location参数。若前面启用的html-reports参数,则相应的报表就会产生。同时需要保证html-report-directory目录必须能被web服务器访问。如:http://www.mike.org.cn/reports/html

  rss-header-location
  用于指定rss所用的header文件,用户可以自定义该文件。有个模版头文件:/usr/share/mysql-zrm /plugins/RSS.header

  ZRM组件参数

  所有的组件都是可选的。

  copy-plugin
  以绝对路径定义复制组件,该组件用于在备份服务器和MySQL服务器直接互相传输文件。下面的情况需要使用该组件

  1、远程增量备份
  2、从远程服务器复制MySQL从服务器数据文件
  3、执行mysqlhotcopy时,从远程复制数据
  4、恢复数据到远程的MySQL数据库

  ssh-user
  定义使用SSH登录的用户,该选项只作用于ssh-copy.pl组件。MySQL服务应该也以该用户运行。该选项可选,默认为 mysql用户。

  remote-mysql-binpath
  指定远程MySQL服务器上mysql命令所在目录。如:/opt/lampp/bin。该选项只作用于ssh-copy.pl和 socket-copy.pl组件。如果没有指定,默认为/usr/bin

  socket-remote-port
  socket-copy.pl组件将要使用的服务端口。该选项只作用于socket-copy.pl组件。该选项可选,默认为端口25300.

  passfile
  GPG加密要用的短语密码。支持GPG加密的组件为:/usr/share/mysql-zrm/plugins/encrypt.pl

  pre-backup-plugin
  备份前要执行的脚本组件,该组件在每次备份前执行。在/usr/share/mysql-zrm/plugins目录中有一个预执行脚本组件的模版。

  pre-backup-plugin-options
  要传递到预执行组件的多个参数,用双引号指定。

  post-backup-plugin
  备份后要执行的脚本组件,该组件在每次备份后执行。在/usr/share/mysql-zrm/plugins目录中有一个后执行脚本组件的模版。

  post-backup-plugin-options
  要传递到后执行组件的多个参数,用双引号指定。

  pre-scheduler-plugin
  指定备份命令执行的时间,可以用该组件定义要延迟或跳过的备份命令,或者指定备份命令执行的条件,如服务器/某一程序开启时。

  五、实例

  创建备份集

  安装完后,/etc/mysql-zrm/是其配置文件的所在地。/etc/mysql-zrm/目录下有一个mysql-zrm.conf文件,这是最重要的配置文件。你也可以在/etc/mysql-zrm/目录下,创建一些目录,每一个目录就是一个备份集的名称。

  这里我们先创建一个测试用备份集

mkdir /etc/mysql-zrm/test
cp  /etc/mysql-zrm/mysql-zrm.conf /etc/mysql-zrm/test

  修改配置文件

vi /etc/mysql-zrm/test/mysql-zrm.conf
 
backup-level=0
backup-mode=logical
backup-type=regular
destination=/data0/backup/mysql/zrmtest
retention-policy=30D
compress=1
database="test"
user="root"
password=""
port=3306
socket=/tmp/mysql.sock
mysql-binpath="/usr/local/webserver/mysql/bin/"
mysql-binlog-path="/data0/mysql/binlog/"

  创建备份文件

  全备(逻辑)

#使用test备份集进行逻辑全备
mysql-zrm-backup  --backup-set  test
 
#查看生成的备份数据(在备份目录下生成了一个以备份集和备份日期为文件夹名的目录)
ls /data0/backup/mysql/zrmtest/test/20110530022130/
 
backup-data  index  zrm_checksum

  下面的例子我都直接在命令行修改对应参数来说明了,这样方便一些。

  全备(物理)

mysql-zrm-backup --backup-set test --backup-mode=raw
 
#查看生成的备份数据(物理备份会产生一个对应的备份目录,里面是所备份表的相关物理文件。)
ls test/20110530034948/
 
index  test  zrm_checksum

  增量备份

#查看生成的备份数据(增量与全备不同的地方是,增备备份的是二进制日志文件。)
mysql-zrm-backup --backup-set test --backup-level=1 --backup-mode=logical --database=test
 
ls test/20110530040430/
binlog.000041  index          zrm_checksum

  恢复备份数据

mysql-zrm-restore --backup-set test --source-directory=/data0/backup/mysql/zrmtest/test/20110530040430/

  注:这里以上面的增量备份恢复数据,其它同理。

  自动定时备份

  创建一个自动备份计划

#建立了一个每天凌晨1点执行test备份集的备份计划
mysql-zrm-scheduler --add --interval daily --start 01:00 --backup-set test
 
schedule:INFO: ZRM for MySQL Community Edition - version 2.2.0
Logging to /var/log/mysql-zrm/mysql-zrm-scheduler.log
DONE

  查询已创建的备份计划

mysql-zrm-scheduler --query
 
schedule:INFO: ZRM for MySQL Community Edition - version 2.2.0
Logging to /var/log/mysql-zrm/mysql-zrm-scheduler.log
 1 * * * /usr/bin/zrm-pre-scheduler --action backup --backup-set test --backup-level 0 --interval daily

  删除已创建的备份计划

mysql-zrm-scheduler --delete --interval daily --start 01:00
 
schedule:INFO: ZRM for MySQL Community Edition - version 2.2.0
 
Logging to /var/log/mysql-zrm/mysql-zrm-scheduler.log
 crontab entry deleted
DONE
 
mysql-zrm-scheduler --query
 
schedule:INFO: ZRM for MySQL Community Edition - version 2.2.0
Logging to /var/log/mysql-zrm/mysql-zrm-scheduler.log
No mysql-zrm related schedule entry found.

  查看备份报告

mysql-zrm-reporter --where backup-set=test --show backup-status-info
 
REPORT TYPE : backup-status-info 
 
          backup_set  backup_date                  backup_level  backup_status         backup_type       comment
-----------------------------------------------------------------------------------------------------------------------------
                test  2011年05月30日                       1  Backup succeeded      regular           ----
                      星期一 04时04分30秒
                test  2011年05月30日                       0  Backup succeeded      regular           ----
                      星期一 03时49分48秒

  从这个报告中我们可以看到备份的名字、备份时间、备份级别、备份的状态。

mysql-zrm-reporter --where backup-set=test --show backup-performance-info
 
REPORT TYPE : backup-performance-info 
 
          backup_set  backup_date                  backup_level     backup_size  backup_size_compressed     backup_time   backup_type       compress_encrypt_time
----------------------------------------------------------------------------------------------------------------------------------------------------------------
                test  2011年05月30日                       0         9.38 MB  2.42 MB                    00:00:01      regular           00:00:10

  这份报告中我们能看到备份的大小,压缩后的大小,备份所用时间等

  检验备份数据是否正确

mysql-zrm-verify-backup --backup-set test
 
verify-backup:INFO: ZRM for MySQL Community Edition - version 2.2.0
test:verify-backup:INFO: Verification successful

  远程备份

  ZRM远程备份数据库有两种方法

  1、使用远程socket连接
  
  配置远程mysql服务器

  获取ZRM客户端安装包

wget http://www.zmanda.com/downloads/community/ZRM-MySQL/2.2/RPM/MySQL-zrm-client-2.2.0-1.noarch.rpm

  安装ZRM客户端

rpm -ivh MySQL-zrm-client-2.2.0-1.noarch.rpm

  查看监听端口是否正常启动

netstat  -ln|grep 25300
tcp        0      0 0.0.0.0:25300               0.0.0.0:*                   LISTEN

  修改备份服务器ZRM的配置

  这里主要修改全局配置文件,以方便下面的备份集都可以使用。在上面配置的文件主要增加以下几项

vi /etc/mysql-zrm/mysql-zrm.conf
 
#执行远程拷贝的脚本
copy-plugin=/usr/share/mysql-zrm/plugins/socket-copy.pl
#远程mysql服务器上binlog的路径
remote-mysql-binpath="/usr/local/webserver/mysq/bin"
#远程client的端口,跟远程数据库上启动监听端口需一致
socket-remote-port="25300"

  测试:

mysql-zrm-backup --backup-set test  --backup-mode=logical --host=192.168.1.106
 
backup:INFO: ZRM for MySQL Community Edition - version 2.2.0
test:backup:INFO: START OF BACKUP
test:backup:INFO: PHASE START: Initialization
test:backup:INFO: The quick backup-type is supported only for snapshot backups. Setting backup-type to 'regular'
test:backup:INFO: backup-set=test
test:backup:INFO: backup-date=20110530061443
test:backup:INFO: mysql-server-os=Linux/Unix
test:backup:INFO: backup-type=regular
test:backup:INFO: host=192.168.1.106
......
test:backup:INFO: PHASE END: Running post backup plugin
test:backup:INFO: PHASE START: Cleanup
test:backup:INFO: PHASE END: Cleanup
test:backup:INFO: END OF BACKUP

  2、使用SSH连接

vi /etc/mysql-zrm/mysql-zrm.conf
 
#执行远程拷贝的脚本
copy-plugin=/usr/share/mysql-zrm/plugins/ssh-copy.pl
#远程mysql服务器上binlog的路径
remote-mysql-binpath="/usr/local/webserver/mysq/bin"
#指定SSH所用的用户
ssh-user="root"

  测试

# mysql-zrm-backup --backup-set test  --backup-mode=logical --host=192.168.1.107 --user=root
backup:INFO: ZRM for MySQL Community Edition - version 2.2.0
test:backup:INFO: START OF BACKUP
test:backup:INFO: PHASE START: Initialization
test:backup:INFO: The quick backup-type is supported only for snapshot backups. Setting backup-type to 'regular'
test:backup:INFO: backup-set=test
test:backup:INFO: backup-date=20110530071039
test:backup:INFO: mysql-server-os=Linux/Unix
test:backup:INFO: backup-type=regular
test:backup:INFO: host=192.168.1.107
test:backup:INFO: backup-date-epoch=1306710639
......
test:backup:INFO: Backup succeeded
test:backup:INFO: PHASE START: Running post backup plugin
test:backup:INFO: PHASE END: Running post backup plugin
test:backup:INFO: PHASE START: Cleanup
test:backup:INFO: PHASE END: Cleanup
test:backup:INFO: END OF BACKUP

  六、参考文档

  http://www.google.com
  http://www.wenzizone.cn/?p=237
  http://www.shubo.info/?m=20110322
  http://blog.wgzhao.com/2009/04/15/backup-remote-mysql-with-zrm.html  
  http://wiki.zmanda.com/index.php/Zmanda_Recovery_Manager_for_MySQL_Users_Manual
  http://wiki.zmanda.com/index.php/Zmanda_Recovery_Manager_for_MySQL_Man_pages
  http://www.mysqlsystems.com/2010/03/zmanda-for-mysql-backup_recovery.html
  http://bbs.chinaunix.net/viewthread.php?tid=1569522&extra=&page=1

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.