1. 首页 > 国产数据库教程 > TiDB教程 > 正文

tidb教程FG080-TiDB数据丢失损坏恢复方法

本文档风哥主要介绍TiDB数据丢失和损坏的恢复方法,包括数据丢失和损坏的类型、恢复原则、恢复工具、备份策略、恢复步骤、实战案例和最佳实践等,风哥教程参考TiDB官方文档备份恢复相关内容编写,适合DBA人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。更多视频教程www.fgedu.net.cn

Part01-基础概念与理论知识

1.1 数据丢失和损坏的类型

TiDB数据丢失和损坏的常见类型包括:

# 数据丢失和损坏的类型

## 1. 人为操作错误
– **误删除**:用户误删除表、数据或数据库
– **误修改**:用户错误修改数据
– **误 truncate**:用户误执行truncate操作
– **误 drop**:用户误执行drop操作

## 2. 硬件故障
– **磁盘故障**:磁盘物理损坏导致数据丢失
– **服务器故障**:服务器硬件故障导致数据丢失
– **存储故障**:存储系统故障导致数据丢失

## 3. 软件故障
– **数据库崩溃**:TiDB/TiKV/PD进程崩溃导致数据损坏
– **事务回滚失败**:事务回滚失败导致数据不一致
– **日志损坏**:redo/undo日志损坏导致数据不一致

## 4. 网络故障
– **网络分区**:网络分区导致数据不一致
– **网络中断**:网络中断导致数据传输失败
– **网络延迟**:网络延迟导致数据同步失败

## 5. 自然灾害
– **火灾**:火灾导致数据中心损坏
– **洪水**:洪水导致数据中心损坏
– **地震**:地震导致数据中心损坏
– **断电**:突然断电导致数据丢失
风哥提示:
## 6. 安全问题
– **黑客攻击**:黑客攻击导致数据删除或篡改
– **病毒感染**:病毒感染导致数据损坏
– **权限滥用**:权限滥用导致数据删除或篡改

1.2 恢复原则

TiDB数据恢复的基本原则:

恢复原则:

  • 优先保障数据安全:在恢复过程中确保数据的安全性和一致性
  • 最小化影响范围:尽量减少恢复过程对业务的影响
  • 分步骤恢复:按照合理的步骤逐步恢复数据
  • 备份优先:在进行恢复操作前,确保有最新的备份
  • 验证恢复结果:恢复完成后验证数据的完整性和一致性
  • 事后分析:分析数据丢失或损坏的原因,避免类似问题再次发生

1.3 恢复工具

TiDB数据恢复常用工具:

# 恢复工具

## 1. br(Backup & Restore)
– **全量备份**:备份整个集群的数据
– **增量备份**:备份自上次备份以来的变更数据
– **恢复**:从备份中恢复数据
– **查看备份**:查看备份信息

## 2. dumpling
– **逻辑备份**:导出数据为SQL或CSV格式
– **表级备份**:支持单表或多表备份
– **过滤备份**:支持按条件过滤数据

## 3. lightning
– **快速导入**:快速导入数据到TiDB
– **支持多种格式**:支持SQL、CSV、Parquet等格式
– **并行导入**:支持并行导入提高速度

## 4. tiup
– **集群管理**:部署、管理TiDB集群
– **备份管理**:管理备份任务
– **恢复管理**:管理恢复任务

## 5. MySQL工具
– **mysqldump**:MySQL逻辑备份工具
– **mysqlbinlog**:MySQL二进制日志工具
– **mysql**:MySQL客户端工具

## 6. 系统工具
– **rsync**:文件同步工具
– **cp**:文件复制工具
– **scp**:远程文件复制工具

1.4 备份类型

TiDB备份的常见类型:

# 备份类型

## 1. 全量备份
– **定义**:备份整个集群的所有数据
– **优点**:恢复速度快,数据完整
– **缺点**:备份时间长,占用空间大
– **适用场景**:定期完整备份,灾难恢复

## 2. 增量备份
– **定义**:备份自上次备份以来的变更数据
– **优点**:备份时间短,占用空间小
– **缺点**:恢复时需要先恢复全量备份,再恢复增量备份
– **适用场景**:日常备份,减少备份时间和空间

## 3. 逻辑备份
– **定义**:通过SQL语句导出数据
– **优点**:跨版本兼容,可编辑
– **缺点**:备份和恢复速度慢
– **适用场景**:小规模数据备份,跨版本迁移

## 4. 物理备份
– **定义**:直接备份数据文件
– **优点**:备份和恢复速度快
– **缺点**:跨版本兼容性差
– **适用场景**:大规模数据备份,快速恢复

## 5. 冷备份
– **定义**:在数据库关闭状态下进行备份
– **优点**:备份数据一致性好
– **缺点**:需要停机,影响业务
– **适用场景**:维护窗口,重要系统备份

## 6. 热备份
– **定义**:在数据库运行状态下进行备份
– **优点**:无需停机,不影响业务
– **缺点**:备份过程可能影响性能
– **适用场景**:生产环境,日常备份学习交流加群风哥QQ113257174

风哥提示:数据丢失和损坏是数据库运维中常见的问题,建立完善的备份和恢复机制是保障数据安全的关键。学习交流加群风哥微信: itpux-com

Part02-生产环境规划与建议

2.1 预防措施

为了避免数据丢失和损坏,生产环境中应采取以下预防措施:

# 预防措施

## 1. 硬件层面
– **服务器冗余**:使用冗余服务器配置
– **存储冗余**:使用RAID等冗余存储方案
– **电源备份**:配置UPS电源备份
– **温度控制**:确保服务器运行环境温度适宜

## 2. 软件层面
– **版本管理**:使用稳定版本的TiDB
– **补丁管理**:及时应用安全补丁和 bug 修复
– **配置管理**:使用合理的配置参数
– **权限管理**:严格控制数据库权限

## 3. 操作层面
– **操作规范**:制定并执行操作规范
– **审批流程**:建立重要操作的审批流程
– **操作日志**:记录所有数据库操作
– **培训**:对运维人员进行定期培训

## 4. 网络层面
– **网络冗余**:配置多网络路径
– **网络隔离**:将数据库网络与业务网络隔离
– **防火墙**:配置防火墙规则,限制访问
– **加密传输**:使用SSL/TLS加密数据传输

## 5. 监控层面
– **健康监控**:监控数据库健康状态
– **性能监控**:监控数据库性能指标
– **告警配置**:配置合理的告警阈值和通知机制
– **故障预测**:基于监控数据预测潜在故障

## 6. 备份层面
– **定期备份**:制定并执行定期备份计划
– **备份验证**:定期验证备份的有效性
– **备份存储**:将备份存储在异地或云存储
– **恢复演练**:定期进行备份恢复演练

2.2 备份策略

生产环境中应制定合理的备份策略:

# 备份策略

## 1. 备份频率
– **全量备份**:每周或每月进行一次全量备份
– **增量备份**:每天进行一次增量备份
– **日志备份**:实时备份二进制日志

## 2. 备份存储
– **本地存储**:备份到本地磁盘,用于快速恢复
– **异地存储**:备份到异地存储,用于灾难恢复
– **云存储**:备份到云存储,提高可靠性

## 3. 备份保留
– **全量备份**:保留最近3-6个月的全量备份
– **增量备份**:保留最近7-30天的增量备份
– **日志备份**:保留最近7-30天的日志备份

## 4. 备份验证
– **完整性验证**:验证备份文件的完整性
– **可恢复性验证**:定期测试备份的可恢复性
– **一致性验证**:验证备份数据的一致性

## 5. 备份自动化
– **定时任务**:使用crontab等工具自动化备份任务
– **监控告警**:监控备份任务的执行状态
– **报告生成**:生成备份执行报告

## 6. 灾难恢复计划
– **制定计划**:制定详细的灾难恢复计划
– **定期演练**:定期进行灾难恢复演练
– **文档更新**:及时更新灾难恢复文档

2.3 监控配置

生产环境中应配置以下监控项,及时发现数据丢失和损坏的风险:

# 监控配置

## 1. 数据完整性监控
– **校验和**:定期计算并验证数据校验和
– **一致性检查**:定期检查数据一致性
– **备份状态**:监控备份任务的执行状态

## 2. 存储监控
– **磁盘空间**:监控磁盘空间使用情况
– **磁盘I/O**:监控磁盘I/O性能
– **磁盘健康**:监控磁盘健康状态

## 3. 数据库监控
– **事务状态**:监控事务执行状态
– **日志状态**:监控日志写入状态
– **错误日志**:监控数据库错误日志

## 4. 告警配置
– **紧急告警**:数据丢失、备份失败、磁盘故障
– **警告告警**:磁盘空间不足、备份延迟、性能下降
– **通知渠道**:邮件、短信、企业微信等
– **告警升级**:设置告警升级机制

Part03-生产环境项目实施方案

3.1 恢复步骤

TiDB数据恢复的基本步骤:

# 恢复步骤

## 1. 评估损失
– **确定范围**:确定数据丢失或损坏的范围
– **分析原因**:分析数据丢失或损坏的原因
– **制定计划**:根据损失情况制定恢复计划

## 2. 准备恢复环境
– **停止服务**:必要时停止相关服务
– **备份当前数据**:备份当前状态的数据,以防恢复失败
– **准备备份**:准备需要的备份文件

## 3. 执行恢复
– **选择恢复方法**:根据情况选择合适的恢复方法
– **执行恢复操作**:按照恢复流程执行恢复操作
– **监控恢复过程**:实时监控恢复过程的状态

## 4. 验证恢复结果
– **数据完整性**:验证恢复数据的完整性
– **数据一致性**:验证恢复数据的一致性
– **业务功能**:验证业务功能是否正常
– **性能测试**:测试系统性能是否正常

## 5. 清理和总结
– **清理临时文件**:清理恢复过程中产生的临时文件
– **更新文档**:更新恢复操作文档
– **分析总结**:分析恢复过程中的问题和经验

3.2 恢复方法

TiDB数据恢复的常见方法:

# 恢复方法

## 1. 从备份恢复
– **全量备份恢复**:使用全量备份恢复整个集群
– **增量备份恢复**:先恢复全量备份,再恢复增量备份
– **逻辑备份恢复**:使用dumpling导出的SQL文件恢复

## 2. 从二进制日志恢复
– **PITR(Point-in-Time Recovery)**:恢复到指定时间点
– **基于位置恢复**:恢复到指定日志位置

## 3. 从TiKV副本恢复
– **利用Raft副本**:当一个TiKV节点数据损坏时,利用其他副本恢复
– **手动复制数据**:手动复制其他TiKV节点的数据文件

## 4. 误操作恢复
– **闪回(Flashback)**:使用FLASHBACK TABLE语句恢复误删除的表
– **时间点恢复**:使用备份和二进制日志恢复到误操作前的时间点

## 5. 数据修复
– **修复损坏的表**:使用CHECK TABLE和REPAIR TABLE语句
– **修复损坏的索引**:重建索引
– **修复损坏的数据**:使用UPDATE语句修复损坏的数据

3.3 恢复流程

TiDB数据恢复的详细流程:

# 恢复流程

## 1. 全量备份恢复流程
– **步骤1**:停止TiDB服务
“`bash
systemctl stop tidb
“`
– **步骤2**:使用br工具恢复全量备份
“`bash
br restore full –pd “192.168.1.10:2379” –storage “local:///tidb/backup/full”
“`
– **步骤3**:启动TiDB服务
“`bash
systemctl start tidb
“`
– **步骤4**:验证恢复结果
“`bash
mysql -h 192.168.1.10 -P 4000 -u root -p -e “SHOW DATABASES;”
“`

## 2. 增量备份恢复流程
– **步骤1**:停止TiDB服务
“`bash
systemctl stop tidb
“`
– **步骤2**:恢复全量备份
“`bash
br restore full –pd “192.168.1.10:2379” –storage “local:///tidb/backup/full”
“`
– **步骤3**:恢复增量备份
“`bash
br restore incremental –pd “192.168.1.10:2379” –storage “local:///tidb/backup/incremental” –last-backup “local:///tidb/backup/full”
“`
– **步骤4**:启动TiDB服务
“`bash
systemctl start tidb
“`
– **步骤5**:验证恢复结果
“`bash
mysql -h 192.168.1.10 -P 4000 -u root -p -e “SHOW DATABASES;”
“`

## 3. 逻辑备份恢复流程
– **步骤1**:使用dumpling导出数据
“`bash
tiup dumpling -h 192.168.1.10 -P 4000 -u root -p -B test -o /tidb/backup/logical
“`
– **步骤2**:使用lightning导入数据
“`bash
tiup lightning –pd “192.168.1.10:2379” –tidb-host 192.168.1.10 –tidb-port 4000 –tidb-user root –tidb-password password –input /tidb/backup/logical
“`
– **步骤3**:验证恢复结果
“`bash
mysql -h 192.168.1.10 -P 4000 -u root -p -e “SELECT * FROM test.table;”
“`

## 4. 闪回恢复流程
– **步骤1**:启用闪回功能
“`sql
SET GLOBAL tidb_enable_flashback = ON;
“`
– **步骤2**:执行闪回操作
“`sql
FLASHBACK TABLE test.table TO BEFORE DROP;
“`
– **步骤3**:验证恢复结果
“`sql
SELECT * FROM test.table;
“`

## 5. PITR恢复流程
– **步骤1**:停止TiDB服务
“`bash
systemctl stop tidb
“`
– **步骤2**:恢复全量备份
“`bash
br restore full –pd “192.168.1.10:2379” –storage “local:///tidb/backup/full”
“`
– **步骤3**:应用二进制日志到指定时间点
“`bash
br restore log –pd “192.168.1.10:2379” –storage “local:///tidb/backup/log” –start-time “2023-01-01 00:00:00” –end-time “2023-01-01 12:00:00”
“`
– **步骤4**:启动TiDB服务
“`bash
systemctl start tidb
“`
– **步骤5**:验证恢复结果
“`bash
mysql -h 192.168.1.10 -P 4000 -u root -p -e “SHOW DATABASES;”
“`

风哥提示:数据恢复是一项复杂的操作,需要谨慎执行,确保在恢复前做好充分的准备和备份。from tidb视频:www.itpux.com

Part04-生产案例与实战讲解

4.1 误删除数据恢复

# 误删除数据恢复

## 1. 环境信息
– **TiDB版本**:6.1.0
– **数据库**:test
– **表**:users
– **操作系统**:Oracle Linux 9.3

## 2. 故障现象
– **误操作**:用户执行了DELETE语句,删除了表中的所有数据
– **影响**:表users中的数据全部丢失

## 3. 故障分析
– **原因**:用户误执行了DELETE语句,没有添加WHERE条件
– **影响**:业务系统无法正常运行

## 4. 解决方案
– **步骤1**:检查是否启用了闪回功能
“`sql
SHOW GLOBAL VARIABLES LIKE ‘tidb_enable_flashback’;
“`
– **步骤2**:启用闪回功能(如果未启用)
“`sql
SET GLOBAL tidb_enable_flashback = ON;
“`
– **步骤3**:执行闪回操作,恢复到删除前的时间点
“`sql
FLASHBACK TABLE test.users TO TIMESTAMP ‘2023-01-01 12:00:00’;
“`
– **步骤4**:验证恢复结果
“`sql
SELECT COUNT(*) FROM test.users;
“`

## 5. 预防措施
– **权限控制**:限制用户的DELETE权限
– **操作审计**:记录所有DELETE操作
– **备份策略**:定期备份数据
– **操作规范**:制定并执行操作规范

4.2 数据损坏恢复

# 数据损坏恢复

## 1. 环境信息
– **TiDB版本**:6.1.0
– **数据库**:test
– **表**:orders
– **操作系统**:Oracle Linux 9.3

## 2. 故障现象
– **数据损坏**:表orders中的部分数据损坏,查询时出现错误
– **错误信息**:
“`
ERROR 1105 (HY000): region is unavailable
“`

## 3. 故障分析
– **原因**:TiKV节点数据文件损坏
– **影响**:无法查询表orders中的数据

## 4. 解决方案
– **步骤1**:检查TiKV节点状态
“`bash
pd-ctl -u http://192.168.1.10:2379 store
“`
– **步骤2**:找到损坏的Region
“`bash
pd-ctl -u http://192.168.1.10:2379 region –key “test.orders”
“`
– **步骤3**:使用br工具备份未损坏的数据
“`bash
br backup table –pd “192.168.1.10:2379” –db test –table orders –storage “local:///tidb/backup/table”
“`
– **步骤4**:重建表orders
“`sql
DROP TABLE IF EXISTS test.orders;
CREATE TABLE test.orders (…);
“`
– **步骤5**:恢复数据
“`bash
br restore table –pd “192.168.1.10:2379” –db test –table orders –storage “local:///tidb/backup/table”
“`
– **步骤6**:验证恢复结果
“`sql
SELECT * FROM test.orders;
“`

## 5. 预防措施
– **定期检查**:定期检查数据完整性
– **备份策略**:定期备份数据
– **监控告警**:监控TiKV节点状态
– **磁盘监控**:监控磁盘健康状态

4.3 磁盘故障数据恢复

# 磁盘故障数据恢复

## 1. 环境信息
– **TiDB版本**:6.1.0
– **TiKV节点**:3个(192.168.1.20, 192.168.1.21, 192.168.1.22)
– **操作系统**:Oracle Linux 9.3

## 2. 故障现象
– **磁盘故障**:192.168.1.20节点的磁盘损坏
– **影响**:该节点上的TiKV服务无法运行

## 3. 故障分析
– **原因**:磁盘物理损坏导致TiKV数据无法访问
– **影响**:集群仍然可用,但减少了一个TiKV节点,降低了高可用性

## 4. 解决方案
– **步骤1**:停止故障节点的TiKV服务
“`bash
systemctl stop tikv
“`
– **步骤2**:更换故障磁盘
– 物理更换磁盘
– 格式化新磁盘
– 挂载新磁盘到原路径
– **步骤3**:启动TiKV服务
“`bash
systemctl start tikv
“`
– **步骤4**:等待数据同步完成
“`bash
pd-ctl -u http://192.168.1.10:2379 store
“`
– **步骤5**:验证集群状态
“`bash
tiup cluster display fgedudb
“`

## 5. 预防措施
– **磁盘监控**:监控磁盘健康状态
– **冗余存储**:使用RAID等冗余存储方案
– **定期检查**:定期检查磁盘状态
– **备份策略**:定期备份数据

4.4 备份恢复实战

# 备份恢复实战

## 1. 环境信息
– **TiDB版本**:6.1.0
– **集群名称**:fgedudb
– **备份存储**:本地磁盘
– **操作系统**:Oracle Linux 9.3

## 2. 故障现象
– **全集群故障**:由于自然灾害,整个数据中心损坏
– **影响**:所有服务不可用

## 3. 故障分析
– **原因**:自然灾害导致数据中心损坏
– **影响**:业务系统完全不可用

## 4. 解决方案
– **步骤1**:在新环境中部署TiDB集群
“`bash
tiup cluster deploy fgedudb v6.1.0 topology.yaml
“`
– **步骤2**:停止TiDB服务
“`bash
tiup cluster stop fgedudb
“`
– **步骤3**:从异地备份恢复数据
“`bash
br restore full –pd “192.168.1.10:2379” –storage “s3://backup-bucket/full”
“`
– **步骤4**:启动TiDB服务
“`bash
tiup cluster start fgedudb
“`
– **步骤5**:验证恢复结果
“`bash
tiup cluster display fgedudb
mysql -h 192.168.1.10 -P 4000 -u root -p -e “SHOW DATABASES;”
“`

## 5. 预防措施
– **异地备份**:将备份存储在异地
– **多数据中心**:部署多数据中心架构
– **灾难恢复计划**:制定详细的灾难恢复计划
– **定期演练**:定期进行灾难恢复演练

Part05-风哥经验总结与分享

5.1 常见问题与解决方案

TiDB数据恢复的常见问题与解决方案:

# 常见问题与解决方案

## 1. 备份失败
– **问题**:备份过程中出现错误,导致备份失败
– **解决**:
– 检查备份存储是否可用
– 检查网络连接是否正常
– 检查数据库状态是否正常
– 查看备份日志,分析失败原因

## 2. 恢复失败
– **问题**:恢复过程中出现错误,导致恢复失败
– **解决**:
– 检查备份文件是否完整
– 检查目标环境是否满足要求
– 查看恢复日志,分析失败原因
– 尝试使用不同的恢复方法

## 3. 数据不一致
– **问题**:恢复后数据不一致
– **解决**:
– 检查备份文件的完整性
– 验证恢复过程是否正确
– 使用一致性检查工具检查数据
– 从更早的备份重新恢复

## 4. 恢复时间过长
– **问题**:恢复过程时间过长,影响业务
– **解决**:
– 使用物理备份代替逻辑备份
– 增加恢复过程的并行度
– 优化恢复环境的性能
– 考虑使用增量备份减少恢复时间

## 5. 备份空间不足
– **问题**:备份过程中出现空间不足错误
– **解决**:
– 清理备份存储中的旧备份
– 使用压缩备份减少空间占用
– 增加备份存储的容量
– 调整备份策略,减少备份频率

## 6. 权限不足
– **问题**:备份或恢复过程中出现权限不足错误
– **解决**:
– 确保执行备份和恢复的用户有足够的权限
– 检查备份存储的权限设置
– 检查数据库用户的权限设置

## 7. 网络问题
– **问题**:备份或恢复过程中出现网络错误
– **解决**:
– 检查网络连接是否正常
– 增加网络超时时间
– 使用本地备份存储减少网络依赖
– 优化网络配置

## 8. 版本兼容性
– **问题**:备份和恢复的TiDB版本不兼容
– **解决**:
– 确保备份和恢复的TiDB版本相同
– 使用逻辑备份跨版本恢复
– 风哥教程参考官方文档的版本兼容性说明

5.2 最佳实践

TiDB数据恢复的最佳实践:

最佳实践:

  • 定期备份:制定并执行定期备份计划
  • 备份验证:定期验证备份的有效性
  • 异地存储:将备份存储在异地,用于灾难恢复
  • 多备份策略:同时使用全量备份和增量备份
  • 恢复演练:定期进行备份恢复演练
  • 监控告警:配置备份和恢复的监控告警
  • 文档化:编写详细的备份和恢复文档
  • 权限控制:严格控制备份和恢复的权限
  • 操作规范:制定并执行备份和恢复的操作规范
  • 培训:对运维人员进行定期培训,提高数据恢复能力

5.3 恢复技巧

TiDB数据恢复的实用技巧:

# 恢复技巧

## 1. 快速定位问题
– **检查日志**:查看数据库错误日志,定位问题原因
– **检查备份**:确认备份是否可用
– **评估损失**:确定数据丢失的范围和影响

## 2. 选择合适的恢复方法
– **根据损失情况选择**:根据数据丢失的范围和原因选择合适的恢复方法
– **根据备份情况选择**:根据可用的备份选择合适的恢复方法
– **根据时间要求选择**:根据业务对恢复时间的要求选择合适的恢复方法

## 3. 恢复前准备
– **备份当前数据**:在恢复前备份当前状态的数据,以防恢复失败
– **准备恢复环境**:确保恢复环境满足要求
– **测试备份**:在恢复前测试备份的有效性

## 4. 恢复操作
– **有序操作**:按照预定的恢复流程逐步操作
– **监控过程**:实时监控恢复过程的状态
– **记录操作**:记录恢复过程中的每一步操作

## 5. 恢复后验证
– **数据完整性**:验证恢复数据的完整性
– **数据一致性**:验证恢复数据的一致性
– **业务功能**:验证业务功能是否正常
– **性能测试**:测试系统性能是否正常

## 6. 预防措施
– **定期备份**:
“`bash
# 定期执行全量备份
tiup br backup full –pd “192.168.1.10:2379” –storage “local:///tidb/backup/full”

# 定期执行增量备份
tiup br backup incremental –pd “192.168.1.10:2379” –storage “local:///tidb/backup/incremental”
“`
– **备份验证**:
“`bash
# 验证备份文件的完整性
tiup br validate –storage “local:///tidb/backup/full”
“`
– **监控配置**:
“`bash
# 配置Prometheus监控备份状态
vim /tidb/app/prometheus/prometheus.yml
“`
– **灾难恢复计划**:
“`bash
# 定期进行灾难恢复演练
tiup cluster deploy test-cluster v6.1.0 topology.yaml
tiup br restore full –pd “192.168.1.10:2379” –storage “local:///tidb/backup/full”
“`

## 7. 常见错误处理
– **备份失败**:检查存储、网络和数据库状态
– **恢复失败**:检查备份文件、目标环境和恢复过程
– **数据不一致**:验证备份完整性,重新恢复
– **恢复时间过长**:优化恢复方法和环境

风哥提示:数据恢复是数据库运维中重要的技能,建立完善的备份和恢复机制是保障数据安全的关键。更多视频教程www.fgedu.net.cn

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息