Mysql备份之Innobakcupex&Xtrabackup

Innobackupex工具介绍

    Xtrabackup是由percona开发的一个开源软件,是使用perl语言完成的脚本工具,能够非常快速地备份与恢复mysql数据库,且支持在线热备份(备份时不影响数据读写),此工具调用xtrabackup和tar4ibd工具,实现很多对性能要求并不高的任务和备份逻辑,可以说它是innodb热备工具ibbackup的一个开源替代品。
    Xtrabackup中包含两个工具:
1)xtrabackup只能用于热备份innodb,xtradb两种数据引擎表的工具,不能备份其他表
2)innobackupex:是一个对xtrabackup封装的perl脚本,提供了用于myisam(会锁表)和innodb引擎,及混合使用引擎备份的能力。主要是为了方便同时备份InnoDB和MyISAM引擎的表,但在处理myisam时需要加一个读锁。并且加入了一些使用的选项。如slave-info可以记录备份恢 复后,作为slave需要的一些信息,根据这些信息,可以很方便的利用备份来重做slave。
    Innobackupex比xtarbackup有更强的功能,它整合了xtrabackup和其他的一些功能,它不但可以全量备份/恢复,还可以基于时间的增量备份与恢复。innobackupex同时支持innodb,myisam。                  

一、innobackupex备份工具

基本选项

--compress:该选项表示压缩innodb数据文件的备份。
--compress-threads:该选项表示并行压缩worker线程的数量。--encrypt:该选项表示通过ENCRYPTION_ALGORITHM的算法加密innodb数据文件的备份,目前支持的算法有ASE128,AES192,AES256。
--encrypt-threads:该选项表示并行加密的worker线程数量。--encrypt-key:该选项使用合适长度加密key,因为会记录到命令行,所以不推荐使用。
--encryption-key-file:该选项表示文件必须是一个简单二进制或者文本文件,加密key可通过以下命令行命令生成:openssl rand -base64 24--user:该选项表示备份账号。
--password:该选项表示备份的密码。
--port:该选项表示备份数据库的端口。
--host:该选项表示备份数据库的地址。
--databases:该选项接受的参数为数据名,如果要指定多个数据库,彼此间需要以空格隔开;如:"xtra_test dba_test",同时,在指定某数据库时,也可以只指定其中的某张表。如:"mydatabase.mytable"。该选项对innodb引擎表无效,还是会备份所有innodb表。此外,此选项也可以接受一个文件为参数,文件中每一行为一个要备份的对象。
--tables-file:该选项表示指定含有表列表的文件,格式为database.table,该选项直接传给--tables-file。
--socket:该选项表示mysql.sock所在位置,以便备份进程登录mysql。
--no-timestamp:该选项可以表示不要创建一个时间戳目录来存储备份,指定到自己想要的备份文件夹。--slave-info:该选项表示对slave进行备份的时候使用,打印出master的名字和binlog pos,同样将这些信息以change master的命令写入xtrabackup_slave_info文件。可以通过基于这份备份启动一个从库。
--safe-slave-backup:该选项表示为保证一致性复制状态,这个选项停止SQL线程并且等到show status中的slave_open_temp_tables为0的时候开始备份,如果没有打开临时表,bakcup会立刻开始,否则SQL线程启动或者关闭知道没有打开的临时表。如果slave_open_temp_tables在--safe-slave-backup-timeount(默认300秒)秒之后不为0,从库sql线程会在备份完成的时候重启。
--rsync:该选项表示通过rsync工具优化本地传输,当指定这个选项,innobackupex使用rsync拷贝非Innodb文件而替换cp,当有很多DB和表的时候会快很多,不能--stream一起使用。--stream:该选项表示流式备份的格式,backup完成之后以指定格式到STDOUT,目前只支持tar和xbstream。
--defaults-file:该选项指定了从哪个文件读取MySQL配置,必须放在命令行第一个选项的位置。
--defaults-extra-file:该选项指定了在标准defaults-file之前从哪个额外的文件读取MySQL配置,必须在命令行的第一个选项的位置。一般用于存备份用户的用户名和密码的配置文件。
----defaults-group:该选项表示从配置文件读取的组,innobakcupex多个实例部署时使用。
--no-lock:该选项表示关闭FTWRL的表锁,只有在所有表都是Innodb表并且不关心backup的binlog pos点,如果有任何DDL语句正在执行或者非InnoDB正在更新时(包括mysql库下的表),都不应该使用这个选项,后果是导致备份数据不一致,如果考虑备份因为获得锁失败,可以考虑--safe-slave-backup立刻停止复制线程。
--tmpdir:该选项表示指定--stream的时候,指定临时文件存在哪里,在streaming和拷贝到远程server之前,事务日志首先存在临时文件里。在 使用参数stream=tar备份的时候,你的xtrabackup_logfile可能会临时放在/tmp目录下,如果你备份的时候并发写入较大的话 xtrabackup_logfile可能会很大(5G+),很可能会撑满你的/tmp目录,可以通过参数--tmpdir指定目录来解决这个问题。--incremental:该选项表示创建一个增量备份,需要指定--incremental-basedir。
--incremental-basedir:该选项表示接受了一个字符串参数指定含有full backup的目录为增量备份的base目录,与--incremental同时使用。
--incremental-dir:该选项表示增量备份的目录。--incremental-lsn:该选项表示指定增量备份的LSN,与--incremental选项一起使用。
--socket:该选项表示mysql.sock所在位置,以便备份进程登录mysql
 

常用选项:

--redo-only合并日志,改选项在prepare base full backup,往其中merge增量备份(不包括最后一个)时使用
--apply-log 准备还原(回滚日志),通过回滚未提交的事物及同步已经提交的事物至数据文件使数据文件处于一致性状态。
--copy-back 恢复数据
--incremental 目录名
--incremental-basedir =增量备份指定上一次备份的目录
--incremental-dir=目录名
--export 到处表信息   import导入表空间
--databases=“库名“ //可指定多个之间用空格分开,不指定默认是全部

解压解密:

--decompress:该选项表示解压--compress选项压缩的文件。
--parallel:该选项表示允许多个文件同时解压。为了解压,qpress工具必须有安装并且访问这个文件的权限。这个进程将在同一个位置移除原来的压缩/加密文件。
--decrypt:该选项表示解密通过--encrypt选项加密的.xbcrypt文件。

还原:

--copy-back:做数据恢复时将备份数据文件拷贝到MySQL服务器的datadir。

 

普通全量备份、全量恢复:

普通全量备份

##备份所有库,备份目录会生成以日期命名的文件夹

[root@localhost ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --password=root /root/mysql
[root@localhost ~]# ls /root/mysql
2019-04-29_18-11-31

 ##还原
1、先prepare,利用--apply-log,作用:通过回滚未提交的事物及同步已经提交的事物至数据文件处于一致状态
[root@localhost ~]# innobackupex --apply-log /root/mysql/2019-04-29_18-11-31/

2、copy,需要存放数据的目录为空
[root@localhost ~]# innobackupex --datadir=/var/lib/mysql  --copy-back  /root/mysql/2019-04-29_18-11-31/ (需指定恢复的目录)

3、修改数据目录的权限
[root@localhost ~]# chown -R mysql:mysql /var/lib/mysql

##备份所有库,指定备份目录
[root@localhost ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --password=root --socket=/tmp/mysql.sock  --no-timestamp   /root/mysql
[root@localhost ~]# ls /root/mysql
2019-04-29_18-11-31 ibdata1 performance_schema xtrabackup_checkpoints xtrabackup_logfile
backup-my.cnf mysql test xtrabackup_info

##还原同上

备份指定库、指定表,多个库用空格分开

##备份指定库,多个库用空格分开
[root@localhost ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --password=root --socket=/tmp/mysql.sock --no-timestamp --database="wsy test" /root/mysql
[root@localhost mysql]# ls
backup-my.cnf ibdata1 mysql test xtrabackup_checkpoints xtrabackup_info xtrabackup_logfile

##还原

1、先prepare,利用--apply-log,作用:通过回滚未提交的事物及同步已经提交的事物至数据文件处于一致状态
[root@localhost ~]# innobackupex --apply-log /root/mysql/

2、copy,因为是部分备份,不能直接用--copy-back,只能手动来复制需要的库,也要复制ibdata(数据字典)

cp -r test/ /var/lib/mysql/
cp -r wsy/ /var/lib/mysql/

3、修改权限

###备份指定表
备份不同库下不同表 [root@localhost
~]# innobackupex --defaults-file=/etc/my.cnf --user=root --password=root --no-timestamp --databases="wsy.student test.student" /root/mysql 备份一个库下面的表,支持正则,例:--include=‘^database[.]table’ [root@localhost ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --password=root --no-timestamp --include='test.student' /root/mysql ##还原 [root@localhost ~]# innobackupex --apply-log --export /root/mysql 生成如下文件: [root@localhost mysql]# ll test/ total 128 -rw-r--r-- 1 root root 426 Apr 29 21:42 student.cfg -rw-r--r-- 1 root root 16384 Apr 29 21:42 student.exp -rw-r----- 1 root root 8586 Apr 29 21:30 student.frm -rw-r----- 1 root root 98304 Apr 29 21:30 student.ibd

普通增量备份、恢复:

##全量备份,以单个库为例,也可备份全库
[root@localhost ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --password=root --no-timestamp --database="test"  /root/mysql

##增量备份1
[root@localhost ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --password=root --no-timestamp --database="test" --incremental /root/mysql1 --incremental-basedir=/root/mysql

##增量备份2
[root@localhost ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --password=root --no-timestamp --database="test" --incremental /root/mysql2 --incremental-basedir=/root/mysql1

##还原
1、先prepare全备
[root@localhost mysql]# innobackupex --incremental --apply-log --redo-only /root/mysql

2、prepare第一次增量
[root@localhost mysql]# innobackupex --incremental --apply-log --redo-only /root/mysql --incremental-dir=/root/mysql1

3、prepare第二次增量
[root@localhost mysql]# innobackupex --incremental --apply-log --redo-only /root/mysql --incremental-dir=/root/mysql2
  通过上面的增量恢复,就可以看到全量备份的目录里记录的有最新的lsn。

4、最后在prepare全量备份
[root@localhost mysql]# innobackupex  --apply-log --redo-only /root/mysql

5、copy,修改权限
部分备份可复制所需要的文件,在修改权限即可。

打包压缩备份:

   注:--compress不能和--stream=tar一起使用

##压缩备份

##压缩备份
[root@localhost ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --password=root  --parallel=3 --compress --compress-threads=3 --no-timestamp  /root/mysql
[root@localhost mysql]# ll
total 236
-rw-r----- 1 root root 369 Apr 29 23:54 backup-my.cnf.qp
-rw-r--r-- 1 root root 0 Apr 29 23:58 ibdata1
-rw-r----- 1 root root 206601 Apr 29 23:54 ibdata1.qp
drwx------ 2 root root 4096 Apr 29 23:54 mysql
drwx------ 2 root root 4096 Apr 29 23:54 performance_schema
drwx------ 2 root root 4096 Apr 29 23:54 test
drwx------ 2 root root 4096 Apr 29 23:54 wsy
-rw-r----- 1 root root 113 Apr 29 23:54 xtrabackup_checkpoints
-rw-r----- 1 root root 494 Apr 29 23:54 xtrabackup_info.qp
-rw-r----- 1 root root 447 Apr 29 23:54 xtrabackup_logfile.qp

##在prepare之前,需要先解压,需安装qpress
[root@localhost ~]# innobackupex --decompress /root/mysql/

##在prepare
[root@localhost ~]# innobackupex --apply-log  /root/mysql

##copy,修改权限

##打包备份

##打包备份
[root@localhost ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --password=root --stream=tar --no-timestamp /root/mysql 2>/root/mysqlbackup.log 1>/root/mysql/alldb.tar

##解压
[root@localhost mysql]# tar -xf alldb.tar

##还原,copy、修改权限


##打包压缩备份
innobackupex --defaults-file=/etc/my.cnf --user=root --password=root --socket=/tmp/mysql.sock --no-timestamp --stream=xbstream --compress --compress-threads=3 /root/mysql 2>/root/mysql.log 1>/root/mysql/alldb.xbstream

加密备份:

   说明:加密的几个参数,--encrypt、--encrypt-threads、--encrypt-key、--encryption-key-file。其中--encrypt-key、--encryption-key-file不能一起使用。encryption-key需要把加密的密码写到命令行。

##加密备份

##生成加密key:
[root@localhost ~]# openssl rand -base64 24  > /keyfile

##加密备份
[root@localhost ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --password=root --parallel=3 --compress --compress-threads=3 --no-timestamp --encrypt=AES256 --encrypt-key-file=/keyfile --encrypt-threads=3  /root/mysql

##解密(尚未尝试成功)
[root@localhost mysql]# for i in `find . -iname "*\.xbcrypt"`; do xbcrypt -d --encrypt-key-file=/home/zhoujy/keyfile --encrypt-algo=AES256 < $i > $(dirname $i)/$(basename $i .xbcrypt) && rm $i; done

##解压
[root@localhost ~]# innobackupex --decompress /root/mysql/

##prepare
[root@localhost ~]# innobackupex --apply-log  /root/mysql

##还原
[root@localhost ~]# innobackupex --copy-back  /root/mysql

 

 

 
 

 

二、xtrabackup备份工具

XtraBackup是现今为止唯一一款为InnoDB 和XtraDB提供热备的开源工具,这个工具有以下的有点:

(1)备份快速高效而且可靠

(2)备份过程可以做到事物处理不间断

(3)节省磁盘空间和网络带宽

(4)自动备份验证

(5)恢复速度快而高效


extrabackup参数说明:
--user:该选项表示备份账号
--password:该选项表示备份的密码
--port:该选项表示备份数据库的端口
--host:该选项表示备份数据库的地址
--tables=name:正则表达式匹配database.tablename。备份匹配的表
--incremental:该选项表示创建一个增量备份,需要指--incremental-basedir
--no-timestamp:该选项可以表示不要创建一个时间戳目录来存储备份,指定到自己想要的备份文件夹
--backup:创建备份并且放入--target-dir目录中
--target-dir=DIRECTORY:指定backup的目的地,如果目录不存在,xtrabakcup会创建。如果目录存在且为空则成功。不会覆盖已存在的文件。
--prepare:xtrabackup在一份通过--backup生成的备份执行还原操作,以便准备使用
--apply-log-only:prepare备份的时候只执行redo阶段,用于增量备份。
--parallel=#:指定备份时拷贝多个数据文件并发的进程数,默认值为1
--stream=name:将所有备份文件以指定格式流向标准输出,目前支持的格式有xbstream和tar
--datadir=DIRECTORY:backup的源目录,mysql实例的数据目录。从my.cnf中读取,或者命令行指定 --incremental-basedir 该选项表示接受了一个字符串参数指定含有full backup的目录为增量备份的base目录,与--incremental同时使用 --incremental-dir 该选项表示增量备份的目录,用于数据恢复时使用 --databases 数据库名 --apply-log-only:prepare备份的时候只执行redo阶段,用于增量备份
--defaults-extra-file :该选项指定了在标准defaults-file之前从哪个额外的文件读取MySQL配置,必须在命令行的第一个选项的位置。一般用于存备份用户的用户名和密码的配置文件。
--defaults-file=[MY.CNF]:唯一从给定文件读取默认选项,必须是个真实文件,必须在命令行第一个选项位置指定,可从配置文件读取mysql的datadir目录。
--compress:压缩所有输出数据,包括事务日志文件和元数据文件,通过指定的压缩算法,目前唯一支持的算法是quicklz.结果文件是qpress归档格式,每个xtrabackup创建的*.qp文件都可以通过qpress程序提取或者解压缩
--compress-threads=#:xtrabackup进行并行数据压缩时的worker线程的数量,该选项默认值是1。并行压缩('compress-threads')可以和并行文件拷贝('parallel')一起使用
 例如:--parallel=4 --compress --compress-threads=2'会创建4个IO线程读取数据并通过管道传送给2个压缩线程。
--stream=name:将所有备份文件以指定格式流向标准输出,目前支持的格式有xbstream和tar。
##compress不支持tar格式的压缩,不能连用
--xbstream:支持同时压缩和流式化。需要客服传统归档tar,cpio和其他不允许动态streaming生成的文件的限制,例如动态压缩文件,xbstream超越其他传统流式/归档格式的的优点是,并发stream多个文件并且更紧凑的数据存储(所以可以和--parallel选项选项一起使用xbstream格式进行streaming)

--encrypt:该选项表示通过ENCRYPTION_ALGORITHM的算法加密innodb数据文件的备份,目前支持的算法有ASE128,AES192,AES256

--encrypt-threads:该选项表示并行加密的worker线程数量。

--encryption-key-file:该选项表示文件必须是一个简单二进制或者文本文件,加密key可通过以下命令行命令生成:openssl rand -base64 24。
## 在备份中,备份账号和密码存放在/etc/mysql/xtrabackup.cnf中,用--defaults-extra-file选项指定,格式为:
[client]
user=root
password=root

   ##生成加密key:

[root@master ~]#openssl rand -base64 24 
[root@master ~]#echo -n "5V05Dm+aFiRxZ6+sjfplK0K2YlbOplZn" > keyfile

 

普通全量备份、全量恢复

###全量备份
1:指定--defaults-file
[root@master ~]#xtrabackup --defaults-file=/etc/my.cnf --user=root --password=root --backup --target-dir=/root/mysql
2:用--datadir取代--defaults-file [root@master ~]#xtrabackup --user=root --password=root --datadir=/data/mysql --parallel=5 --backup --target-dir=/root/mysql ###全量恢复 1)(关闭mysql)先prepare [root@master ~]#xtrabackup --prepare --target-dir=/root/mysql 2)在拷贝到数据库目录 [root@master ~]#cp -r /root/mysql/* /data/mysql 3)修改权限 [root@master ~]#chown -R mysql:mysql /data/mysql

--datadir :backup的源目录,mysql实例的数据目录。从my.cnf中读取,或者命令行指定。
--host:该选项表示备份数据库的地址。
--no-timestamp:该选项可以表示不要创建一个时间戳目录来存储备份,指定到自己想要的备份文件夹。
--backup:创建备份并且放入--target-dir目录中。
--parallel:指定备份时拷贝多个数据文件并发的进程数,默认值为1。
--compress:该选项表示压缩innodb数据文件的备份。
--compress-threads:该选项表示并行压缩worker线程的数量。
--stream:该选项表示流式备份的格式,backup完成之后以指定格式到STDOUT,目前只支持tar和xbstream。
--encrypt:该选项表示通过ENCRYPTION_ALGORITHM的算法加密innodb数据文件的备份,目前支持的算法有ASE128,AES192,AES256。
--encrypt-threads:该选项表示并行加密的worker线程数量。
--encryption-key-file:该选项表示文件必须是一个简单二进制或者文本文件,加密key可通过以下命令行命令生成:openssl rand -base64 24。

普通增量备份及还原:
###全量备份
[root@master ~]# xtrabackup  --user=root --password=root --datadir=/var/lib/mysql --parallel=3 --database="xtra_test"   --backup --target-dir=/root/mysqlbak
###增量备份
[root@master ~]#xtrabackup --user=root --password=root --datadir=/var/lib/mysql/ --backup --parallel=3 --databases="xtra_test" --target-dir=/root/mysqlbak2 --incremental-basedir=/root/mysqlbak
###还原
1、先prepare全备
xtrabackup --prepare --apply-log-only --target-dir=/root/mysqlbak

2、再prepare增量备份
xtrabackup --prepare --apply-log-only --target-dir=/root/mysqlbak --incremental-dir=/root/mysqlbak2

3、最后prepare 全备
xtrabackup --prepare --target-dir=/root/mysqlbak
4、最后copy、改权限。

 打包压缩备份

    注意:--compress不能和--stream=tar一起使用

##压缩备份
##压缩备份
[root@master ~]#xtrabackup --user=root --password=root --datadir=/var/lib/mysql/ --backup --parallel=3 --compress --compress-threads=5  --target-dir=/root/mysql  
#解压,在perpare之前需要安装qpress
网址:http://www.quicklz.com/
[root@master ~]#for f in `find ./ -iname "*\.qp"`; do qpress -dT2 $f $(dirname $f) && rm -f $f; done
#prepare全备
[root@master ~]#xtrabackup --prepare --target-dir=/root/mysql
#copy,改权限
 
 
##打包压缩备份
##打包压缩备份,compress不支持tar
[root@master ~]#xtrabackup --user=root --password=root --datadir=/var/lib/mysql/ --backup --parallel=3 --compress --compress-threads=5  --stream=xbstream --target-dir=/root/mysql >/root/mysql/alldb.xbstream
#解包
[root@master ~]#xbstream -x < alldb.xbstream

#解压
[root@master ~]#for f in `find ./ -iname "*\.qp"`; do qpress -dT2 $f $(dirname $f) && rm -f $f; done 

#prepare全备
[root@master ~]#xtrabackup --prepare --target-dir=/root/mysql

#copy,改权限
##第三方压缩备份
##第三方压缩备份:
 [root@master~]#xtrabackup --user=root --password=root --datadir=/var/lib/mysql/ --backup --parallel=3 --stream=tar --target-dir=/root/mysql | gzip /root/mysql/alldb.tar.gz

#解压:
[root@master~]#tar izxvf alldb.tar.gz

#prepare
[root@master~]#xtrabackup --prepare --target-dir=/home/zhoujy/xtrabackup

#copy,改权限

##加密备份

#压缩加密全量备份所有数据库
1:生成加密key:
[root@master~]#openssl rand -base64 24
把Key写到文件:
[root@master~]#echo -n "Ue2Wp6dIDWszpI76HQ1u57exyjAdHpRO" > keyfile 
2:压缩加密全量备份 [root@master~]#xtrabackup --user=root --password=root --datadir=/var/lib/mysql/ --backup --no-timestamp --compress --compress-threads=3 --parallel=5 --encrypt=AES256 --encrypt-key-file=/root/keyfile ----encrypt-threads=3 --target-dir=/root/mysql/ #还原 1:解密 [root@master~]#for i in `find . -iname "*\.xbcrypt"`; do xbcrypt -d --encrypt-key-file=/root/keyfile --encrypt-algo=AES256 < $i > $(dirname $i)/$(basename $i .xbcrypt) && rm $i; done 2:解压 [root@master~]#for f in `find ./ -iname "*\.qp"`; do qpress -dT2 $f $(dirname $f) && rm -f $f; done 3:prepare [root@master~]#xtrabackup --prepare --target-dir=/root/mysql/ 4:copy,改权限 [root@master~]#rsync -avrP /root/mysql/* /var/lib/mysql/
[root@master~]#chown -R mysql.mysql /var/lib/mysql

 

注:若备份数据量过大时,需备份命令放到后台执行,防止终端断开,命令终止备份失败,也可备份命令放到脚本中,放入后台运行!!!!。

##备份脚本

#!/bin/bash  
user='root'
password='root'
#database=prism1
my_config='/etc/my.cnf'
log='/root/mysql.log'
Time=`date +'%Y%m%d %H%M'`
backup_dir='/root/mysql'
name= echo "Start to backup at $Time" >> $log if [ ! -d "$backup_dir" ];then mkdir -p $backup_dir fi #innobackupex --defaults-file=$my_config --user=$user --password=$passwd --socket=/tmp/mysql.sock --stream=tar $backup_dir 2>$backup_dir/$log | gzip 1>$backup_dir/$name.tar.gz (加粗部分可省略)
xtrabackup
--defaults-file=/etc/my.cnf --user=$user --password=$password --backup --parallel=5 --compress --compress-threads=3 --stream=xbstream --target-dir=${backup_dir} 2>> $log 1> ${backup_dir}/alldb.xbstream if [ $? -eq 0 ];then echo "Backup is finish! at $Time" >> $log exit 0 else echo "Backup is Fail! at $Time" >> $log exit 1 fi

 [root@localhost ~]# sh mysqlbackup.sh &

 

 更多学习,可参考:

https://www.cnblogs.com/zhoujinyi/tag/xtrabackup/

转载于:https://www.cnblogs.com/wusy/p/10295661.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值