最新线上MYSQL同步报错故障处理方法总结(必看篇)_mysql线上故障,百度、华为、京东、B站最新面试题汇集

最后

看完美团、字节、腾讯这三家的面试问题,是不是感觉问的特别多,可能咱们又得开启面试造火箭、工作拧螺丝的模式去准备下一次的面试了。

开篇有提及我可是足足背下了1000道题目,多少还是有点用的呢,我看了下,上面这些问题大部分都能从我背的题里找到的,所以今天给大家分享一下互联网工程师必备的面试1000题

注意不论是我说的互联网面试1000题,还是后面提及的算法与数据结构、设计模式以及更多的Java学习笔记等,皆可分享给各位朋友

最新“美团+字节+腾讯”一二三面问题,挑战一下你能走到哪一面?

互联网工程师必备的面试1000题

而且从上面三家来看,算法与数据结构是必备不可少的呀,因此我建议大家可以去刷刷这本左程云大佬著作的《程序员代码面试指南 IT名企算法与数据结构题目最优解》,里面近200道真实出现过的经典代码面试题

最新“美团+字节+腾讯”一二三面问题,挑战一下你能走到哪一面?

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

| 2 | BTV |

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

1 row in set (0.00 sec)

mysql> stop slave ;set global sql_slave_skip_counter=1;start slave;

Query OK, 0 rows affected (0.01 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

mysql> show slave status\G;

……

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

……

|

中继日志损坏

slave的中继日志relay-bin损坏。

1

2

3
|

Last_SQL_Error: Error initializing relay log position: I/O error reading the header from the binary log

Last_SQL_Error: Error initializing relay log position: Binlog has bad magic number;

It's not a binary log file that can be used by this version of MySQL

|

手工修复

**解决方法:**找到同步的binlog和POS点,然后重新做同步,这样就可以有新的中继日值了。

例子:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19
|

mysql> show slave status\G;

*************************** 1. row ***************************

Master_Log_File: mysql-bin.000010

Read_Master_Log_Pos: 1191

Relay_Log_File: vm02-relay-bin.000005

Relay_Log_Pos: 253

Relay_Master_Log_File: mysql-bin.000010

Slave_IO_Running: Yes

Slave_SQL_Running: No

Replicate_Do_DB:

Replicate_Ignore_DB:

Replicate_Do_Table:

Replicate_Ignore_Table:

Replicate_Wild_Do_Table:

Replicate_Wild_Ignore_Table:

Last_Errno: 1593

Last_Error: Error initializing relay log position: I/O error reading the header from the binary log

Skip_Counter: 1

Exec_Master_Log_Pos: 821

|

Slave_IO_Running :接收master的binlog信息

Master_Log_File
Read_Master_Log_Pos

Slave_SQL_Running:执行写操作

Relay_Master_Log_File
Exec_Master_Log_Pos

以执行写的binlog和POS点为准。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53
|

Relay_Master_Log_File: mysql-bin.000010

Exec_Master_Log_Pos: 821

mysql> stop slave;

Query OK, 0 rows affected (0.01 sec)

mysql> CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000010',MASTER_LOG_POS=821;

Query OK, 0 rows affected (0.01 sec)

mysql> start slave;

Query OK, 0 rows affected (0.00 sec)

mysql> show slave status\G;

*************************** 1. row ***************************

Slave_IO_State: Waiting for master to send event

Master_Host: 192.168.8.22

Master_User: repl

Master_Port: 3306

Connect_Retry: 10

Master_Log_File: mysql-bin.000010

Read_Master_Log_Pos: 1191

Relay_Log_File: vm02-relay-bin.000002

Relay_Log_Pos: 623

Relay_Master_Log_File: mysql-bin.000010

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

Replicate_Do_DB:

Replicate_Ignore_DB:

Replicate_Do_Table:

Replicate_Ignore_Table:

Replicate_Wild_Do_Table:

Replicate_Wild_Ignore_Table:

Last_Errno: 0

Last_Error:

Skip_Counter: 0

Exec_Master_Log_Pos: 1191

Relay_Log_Space: 778

Until_Condition: None

Until_Log_File:

Until_Log_Pos: 0

Master_SSL_Allowed: No

Master_SSL_CA_File:

Master_SSL_CA_Path:

Master_SSL_Cert:

Master_SSL_Cipher:

Master_SSL_Key:

Seconds_Behind_Master: 0

Master_SSL_Verify_Server_Cert: No

Last_IO_Errno: 0

Last_IO_Error:

Last_SQL_Errno: 0

Last_SQL_Error:

Ibbackup

|

各种大招都用上了,无奈slave数据丢失过多,ibbackup(需要银子)该你登场了。

Ibbackup热备份工具,是付费的。xtrabackup是免费的,功能上一样。

Ibbackup备份期间不锁表,备份时开启一个事务(相当于做一个快照),然后会记录一个点,之后数据的更改保存在ibbackup_logfile文件里,恢复时把ibbackup_logfile 变化的数据再写入到ibdata里。

Ibbackup 只备份数据( ibdata、.ibd ),表结构.frm不备份。

下面一个演示例子:

备份:ibbackup /bak/etc/my_local.cnf /bak/etc/my_bak.cnf

恢复:ibbackup --apply-log /bak/etc/my_bak.cnf

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91
|

[root@vm01 etc]# more my_local.cnf

datadir =/usr/local/mysql/data

innodb_data_home_dir = /usr/local/mysql/data

innodb_data_file_path = ibdata1:10M:autoextend

innodb_log_group_home_dir = /usr/local/mysql/data

innodb_buffer_pool_size = 100M

innodb_log_file_size = 5M

innodb_log_files_in_group=2

[root@vm01 etc]# ibbackup /bak/etc/my_local.cnf /bak/etc/my_bak.cnf

InnoDB Hot Backup version 3.0.0; Copyright 2002-2005 Innobase Oy

License A21488 is granted to vm01 (chunyang_he@126.com)

(--apply-log works in any computer regardless of the hostname)

Licensed for use in a computer whose hostname is 'vm01'

Expires 2012-5-1 (year-month-day) at 00:00

See [http://www.innodb.com]( ) for further information

Type ibbackup --license for detailed license terms, --help for help

Contents of /bak/etc/my_local.cnf:

innodb_data_home_dir got value /usr/local/mysql/data

innodb_data_file_path got value ibdata1:10M:autoextend

datadir got value /usr/local/mysql/data

innodb_log_group_home_dir got value /usr/local/mysql/data

innodb_log_files_in_group got value 2

innodb_log_file_size got value 5242880

Contents of /bak/etc/my_bak.cnf:

innodb_data_home_dir got value /bak/data

innodb_data_file_path got value ibdata1:10M:autoextend

datadir got value /bak/data

innodb_log_group_home_dir got value /bak/data

innodb_log_files_in_group got value 2

innodb_log_file_size got value 5242880

ibbackup: Found checkpoint at lsn 0 1636898

ibbackup: Starting log scan from lsn 0 1636864

120302 16:47:43 ibbackup: Copying log...

120302 16:47:43 ibbackup: Log copied, lsn 0 1636898

ibbackup: We wait 1 second before starting copying the data files...

120302 16:47:44 ibbackup: Copying /usr/local/mysql/data/ibdata1

ibbackup: A copied database page was modified at 0 1636898

ibbackup: Scanned log up to lsn 0 1636898

ibbackup: Was able to parse the log up to lsn 0 1636898

ibbackup: Maximum page number for a log record 0

120302 16:47:46 ibbackup: Full backup completed!

[root@vm01 etc]#

[root@vm01 etc]# cd /bak/data/

[root@vm01 data]# ls

ibbackup_logfile ibdata1

[root@vm01 data]# ibbackup --apply-log /bak/etc/my_bak.cnf

InnoDB Hot Backup version 3.0.0; Copyright 2002-2005 Innobase Oy

License A21488 is granted to vm01 (chunyang_he@126.com)

(--apply-log works in any computer regardless of the hostname)

Licensed for use in a computer whose hostname is 'vm01'

Expires 2012-5-1 (year-month-day) at 00:00

See [http://www.innodb.com]( ) for further information

Type ibbackup --license for detailed license terms, --help for help

Contents of /bak/etc/my_bak.cnf:

innodb_data_home_dir got value /bak/data

innodb_data_file_path got value ibdata1:10M:autoextend

datadir got value /bak/data

innodb_log_group_home_dir got value /bak/data

innodb_log_files_in_group got value 2

innodb_log_file_size got value 5242880

120302 16:48:38 ibbackup: ibbackup_logfile's creation parameters:

ibbackup: start lsn 0 1636864, end lsn 0 1636898,

ibbackup: start checkpoint 0 1636898

ibbackup: start checkpoint 0 1636898

InnoDB: Doing recovery: scanned up to log sequence number 0 1636898

InnoDB: Starting an apply batch of log records to the database...

InnoDB: Progress in percents: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 .....99

Setting log file size to 0 5242880

ibbackup: We were able to parse ibbackup_logfile up to

ibbackup: lsn 0 1636898

ibbackup: Last MySQL binlog file position 0 1191, file name ./mysql-bin.000010

ibbackup: The first data file is '/bak/data/ibdata1'

ibbackup: and the new created log files are at '/bak/data/'

120302 16:48:38 ibbackup: Full backup prepared for recovery successfully!

[root@vm01 data]# ls

ibbackup_logfile ibdata1 ib_logfile0 ib_logfile1

|

把ibdata1 ib_logfile0 ib_logfile1拷贝到从,把.frm也拷贝过去,启动MySQL后,做同步,那个点就是上面输出的:

ibbackup: Last MySQL binlog file position 0 1191, file name ./mysql-bin.000010
CHANGE MASTER TO MASTER_LOG_FILE=‘mysql-bin.000010’,MASTER_LOG_POS=1191;

Maatkit工具包
http://www.maatkit.org/

简介

maatkit是一个开源的工具包,为mysql日常管理提供了帮助。目前,已被Percona公司收购并维护。其中:

mk-table-checksum是用来检测master和slave上的表结构和数据是否一致。

mk-table-sync是发生主从数据不一致时,来修复的。

这两个工具包,没有在现网实际操作的经验,这里仅仅是新技术探讨和学术交流,下面展示下如何使用。

http://www.actionsky.com/products/mysql-others/maatkit.jsp

?

1

2

3

4

5

6

7
|

[root@vm02]# mk-table-checksum h=vm01,u=admin,p=123456 h=vm02,u=admin,p=123456 -d hcy -t t1

Cannot connect to MySQL because the Perl DBI module is not installed or not found.

Run 'perl -MDBI' to see the directories that Perl searches for DBI.

If DBI is not installed, try:

Debian/Ubuntu apt-get install libdbi-perl

RHEL/CentOS yum install perl-DBI

OpenSolaris pgk install pkg:/SUNWpmdbi

|

提示缺少perl-DBI模块,那么直接 yum install perl-DBI。

?

1

2

3

4
|

[root@vm02 bin]# mk-table-checksum h=vm01,u=admin,p=123456 h=vm02,u=admin,p=123456 -d hcy -t t1

DATABASE TABLE CHUNK HOST ENGINE COUNT CHECKSUM TIME WAIT STAT LAG

hcy t1 0 vm02 InnoDB NULL 1957752020 0 0 NULL NULL

hcy t1 0 vm01 InnoDB NULL 1957752020 0 0 NULL NULL

|

如果表数据不一致,CHECKSUM的值是不相等的。

解释下输出的意思:

DATABASE:数据库名
TABLE:表名
CHUNK:checksum时的近似数值
HOST:MYSQL的地址
ENGINE:表引擎
COUNT:表的行数
CHECKSUM:校验值
TIME:所用时间
WAIT:等待时间
STAT:MASTER_POS_WAIT()返回值
LAG:slave的延时时间

如果你想过滤出不相等的都有哪些表,可以用mk-checksum-filter这个工具,只要在后面加个管道符就行了。

?

1

2

3
|

[root@vm02 ~]# mk-table-checksum h=vm01,u=admin,p=123456 h=vm02,u=admin,p=123456 -d hcy | mk-checksum-filter

hcy t2 0 vm01 InnoDB NULL 1957752020 0 0 NULL NULL

hcy t2 0 vm02 InnoDB NULL 1068689114 0 0 NULL NULL

|

知道有哪些表不一致,可以用mk-table-sync这个工具来处理。

注:在执行mk-table-checksum时会锁表,表的大小取决于执行的快慢。

MASTER上的t2表数据:

SLAVE上的t2表数据:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17
|

mysql> select * from t2; mysql> select * from t2;

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

| id | name | | id | name |

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

| 1 | a | | 1 | a |

| 2 | b | | 2 | b |

| 3 | ss | | 3 | ss |

| 4 | asd | | 4 | asd |

| 5 | ss | +----+------+

+----+------+ 4 rows in set (0.00 sec)

5 rows in set (0.00 sec)

mysql> \! hostname;

mysql> \! hostname; vm02

vm01

[root@vm02 ~]# mk-table-sync --execute --print --no-check-slave --transaction --databases hcy h=vm01,u=admin,p=123456 h=vm02,u=admin,p=123456

INSERT INTO hcy.t2(id, name) VALUES ('5', 'ss') /*maatkit src_db:hcy src_tbl:t2 src_dsn:h=vm01,p=...,u=admin dst_db:hcy dst_tbl:t2

dst_dsn:h=vm02,p=...,u=admin lock:0 transaction:1 changing_src:0 replicate:0 bidirectional:0 pid:3246 user:root host:vm02*/;

|

它的工作原理是:先一行一行检查主从库的表是否一样,如果哪里不一样,就执行删除,更新,插入等操作,使其达到一致。表的大小决定着执行的快慢。

?

1

2

3

4

5

6

7

8
|

If C<--transaction> is specified, C<
LOCK
TABLES> is not used. Instead, lock

and unlock are implemented by beginning and committing transactions.

The exception is if L<"--lock"> is 3.

If C<--no-transaction> is specified, then C<
LOCK
TABLES> is used for any

value of L<"--lock">. See L<"--[no]transaction">.

When enabled, either explicitly or implicitly, the transaction isolation level

is set C<
REPEATABLE
READ> and transactions are started C<
WITH
CONSISTENT

SNAPSHOT>

|

MySQL复制监控

MySQL常见错误类型

1005:创建表失败
1006:创建数据库失败
1007:数据库已存在,创建数据库失败
1008:数据库不存在,删除数据库失败
1009:不能删除数据库文件导致删除数据库失败
1010:不能删除数据目录导致删除数据库失败
1011:删除数据库文件失败
1012:不能读取系统表中的记录
1020:记录已被其他用户修改
1021:硬盘剩余空间不足,请加大硬盘可用空间
1022:关键字重复,更改记录失败
1023:关闭时发生错误
1024:读文件错误
1025:更改名字时发生错误
1026:写文件错误
1032:记录不存在
1036:数据表是只读的,不能对它进行修改
1037:系统内存不足,请重启数据库或重启服务器
1038:用于排序的内存不足,请增大排序缓冲区
1040:已到达数据库的最大连接数,请加大数据库可用连接数
1041:系统内存不足
1042:无效的主机名
1043:无效连接
1044:当前用户没有访问数据库的权限
1045:不能连接数据库,用户名或密码错误
1048:字段不能为空
1049:数据库不存在
1050:数据表已存在
1051:数据表不存在
1054:字段不存在
1065:无效的SQL语句,SQL语句为空
1081:不能建立Socket连接
1114:数据表已满,不能容纳任何记录
1116:打开的数据表太多
1129:数据库出现异常,请重启数据库
1130:连接数据库失败,没有连接数据库的权限
1133:数据库用户不存在
1141:当前用户无权访问数据库
1142:当前用户无权访问数据表
1143:当前用户无权访问数据表中的字段
1146:数据表不存在
1147:未定义用户对数据表的访问权限
1149:SQL语句语法错误
1158:网络错误,出现读错误,请检查网络连接状况
1159:网络错误,读超时,请检查网络连接状况
1160:网络错误,出现写错误,请检查网络连接状况
1161:网络错误,写超时,请检查网络连接状况
1062:字段值重复,入库失败
1169:字段值重复,更新记录失败
1177:打开数据表失败
1180:提交事务失败
1181:回滚事务失败
1203:当前用户和数据库建立的连接已到达数据库的最大连接数,请增大可用的数据库连接数或重启数据库
1205:加锁超时
1211:当前用户没有创建用户的权限
1216:外键约束检查失败,更新子表记录失败
1217:外键约束检查失败,删除或修改主表记录失败
1226:当前用户使用的资源已超过所允许的资源,请重启数据库或重启服务器
1227:权限不足,您无权进行此操作
1235:MySQL版本过低,不具有本功能

复制监控脚本

参考原文修改。

原脚本

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150
|

#!/bin/bash

#

#check_mysql_slave_replication_status

#

#

#

parasum=2

help_msg(){

cat <<

help

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

+Error

Cause:

+you

must input $parasum parameters!

+1st

: Host_IP

+2st

: Host_Port

help

exit

}

[

$#

-ne ${parasum} ] && help_msg #若参数不够打印帮助信息并退出

export HOST_IP=$1

export HOST_PORt=$2

MYUSER
=
"root"

MYPASS
=
"123456"

MYSQL_CMD="mysql

-u$MYUSER -p$MYPASS"

MailTitle
=
""
#邮件主题

Mail_Address_MysqlStatus
=
"root@localhost.localdomain"
#收件人邮箱

time1=$(date +"%Y%m%d%H%M%S")

time2=$(date +"%Y-%m-%d

%H:%M:%S")

SlaveStatusFile=/tmp/salve_status_${HOST_PORT}.${time1}

#邮件内容所在文件

echo "--------------------Begin

at: "$time2

> $SlaveStatusFile

echo "" >>

$SlaveStatusFile

#get

slave status

${MYSQL_CMD}

-e "show

slave status\G" >>

$SlaveStatusFile #取得salve进程的状态

#get

io_thread_status,sql_thread_status,last_errno 取得以下状态值

IOStatus=$(cat $SlaveStatusFile|grep Slave_IO_Running|awk '{print

$2}')

SQLStatus=$(cat $SlaveStatusFile|grep Slave_SQL_Running

|awk '{print

$2}')

Errno=$(cat $SlaveStatusFile|grep Last_Errno

| awk '{print

$2}')

Behind=$(cat $SlaveStatusFile|grep Seconds_Behind_Master

| awk '{print

$2}')

echo "" >>

$SlaveStatusFile

if [

"$IOStatus" ==

"No" ]

|| [ "$SQLStatus" ==

"No" ];then #判断错误类型

if [

"$Errno" -eq 0

];then #可能是salve线程未启动

$MYSQL_CMD

-e "start

slave io_thread;start slave sql_thread;"

echo "Cause

slave threads doesnot's running,trying start slsave io_thread;start slave sql_thread;" >>

$SlaveStatusFile

MailTitle="[Warning]

Slave threads stoped on $HOST_IP $HOST_PORT"

elif [

"$Errno" -eq 1007

] || [ "$Errno" -eq 1053

] || [ "$Errno" -eq 1062

] || [ "$Errno" -eq 1213

] || [ "$Errno" -eq 1032

]\

||

[ "Errno" -eq 1158

] || [ "$Errno" -eq 1159

] || [ "$Errno" -eq 1008

];then #忽略此些错误

$MYSQL_CMD

-e "stop

slave;set global sql_slave_skip_counter=1;start slave;"

echo "Cause

slave replication catch errors,trying skip counter and restart slave;stop slave ;set global sql_slave_skip_counter=1;slave start;" >>

$SlaveStatusFile

MailTitle="[Warning]

总结

我们总是喜欢瞻仰大厂的大神们,但实际上大神也不过凡人,与菜鸟程序员相比,也就多花了几分心思,如果你再不努力,差距也只会越来越大。实际上,作为程序员,丰富自己的知识储备,提升自己的知识深度和广度是很有必要的。

Mybatis源码解析

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

at: "$time2

> $SlaveStatusFile

echo "" >>

$SlaveStatusFile

#get

slave status

${MYSQL_CMD}

-e "show

slave status\G" >>

$SlaveStatusFile #取得salve进程的状态

#get

io_thread_status,sql_thread_status,last_errno 取得以下状态值

IOStatus=$(cat $SlaveStatusFile|grep Slave_IO_Running|awk '{print

$2}')

SQLStatus=$(cat $SlaveStatusFile|grep Slave_SQL_Running

|awk '{print

$2}')

Errno=$(cat $SlaveStatusFile|grep Last_Errno

| awk '{print

$2}')

Behind=$(cat $SlaveStatusFile|grep Seconds_Behind_Master

| awk '{print

$2}')

echo "" >>

$SlaveStatusFile

if [

"$IOStatus" ==

"No" ]

|| [ "$SQLStatus" ==

"No" ];then #判断错误类型

if [

"$Errno" -eq 0

];then #可能是salve线程未启动

$MYSQL_CMD

-e "start

slave io_thread;start slave sql_thread;"

echo "Cause

slave threads doesnot's running,trying start slsave io_thread;start slave sql_thread;" >>

$SlaveStatusFile

MailTitle="[Warning]

Slave threads stoped on $HOST_IP $HOST_PORT"

elif [

"$Errno" -eq 1007

] || [ "$Errno" -eq 1053

] || [ "$Errno" -eq 1062

] || [ "$Errno" -eq 1213

] || [ "$Errno" -eq 1032

]\

||

[ "Errno" -eq 1158

] || [ "$Errno" -eq 1159

] || [ "$Errno" -eq 1008

];then #忽略此些错误

$MYSQL_CMD

-e "stop

slave;set global sql_slave_skip_counter=1;start slave;"

echo "Cause

slave replication catch errors,trying skip counter and restart slave;stop slave ;set global sql_slave_skip_counter=1;slave start;" >>

$SlaveStatusFile

MailTitle="[Warning]

总结

我们总是喜欢瞻仰大厂的大神们,但实际上大神也不过凡人,与菜鸟程序员相比,也就多花了几分心思,如果你再不努力,差距也只会越来越大。实际上,作为程序员,丰富自己的知识储备,提升自己的知识深度和广度是很有必要的。

Mybatis源码解析

[外链图片转存中…(img-WQLUiKEe-1715679503856)]

[外链图片转存中…(img-tF96p8tJ-1715679503857)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值