资讯专栏INFORMATION COLUMN

Fastore数据库备份恢复和日常维护

IT那活儿 / 3721人阅读
Fastore数据库备份恢复和日常维护
上篇文章给大家具体讲解了Fastore数据库部署安装,这篇文章再展开给大家讲解下Fastore数据库备份恢复和日常维护,希望能对你们有所帮助,创作不易,如果喜欢请点个关注支持一下!

备份恢复


一、备份恢复概述

1. 备份模式
1.1 基线备份
在数据库运行前或数据迁移时,将数据通过各种手段镜像拷贝到备份媒质上。
1.2 动态备份
在数据库运行过程中,使用运行在数据库中的备份工具对数据库进行备份。
动态备份通过配置的定时任务触发。
2. 备份方法
2.1 全量备份:
当FaStore运行正常时,将共享内存中数据库拷贝到磁盘。全量备份通过gmbar工具备份持久化文件(Redo日志文件和Data文件)。
2.2 逻辑备份
当FaStore运行正常时,将共享内存中数据库表定义和表数据以文本方式导出。逻辑备份通过gmdcp工具备份表定义和表数据。
3. 恢复模式
3.1 基线恢复
业务系统的数据库损坏,不能通过故障定位、动态恢复等手段修复的情况下而采用基线恢复至最近一次基线状态,并根据实际情况采用动态恢复将业务系统恢复至最近一次备份前的状态。
3.2 动态恢复
业务系统的数据库或业务程序因客观因素,例如误操作等,损坏单个或多个数据,根据实际情况进行动态恢复将业务系统恢复至最近一次备份前的状态。

二、全量备份

全量备份是指按一定时间隔保留数据库的多个历史备份,当持久化文件异常、误操作时恢复数据库。
1. 使用场景
建议每天定时自动触发进行一次全量备份。需要手工执行全量备份的典型场景如下:
1.1 数据库升级前。
1.2 误操作丢失用户数据。
FaStore运行正常时,持久化文件(Redo日志文件和Data文件)损坏。
FaStore运行正常时,持久化文件(Redo日志文件和Data文件)无法使用。
2. 备份原则
备份原则如下:
  • 各历史备份目录按日期存放。
  • 建议保留多份备份文件。
  • 在业务闲时进行备份。
3. 备份对象
Redo日志文件和Data文件。其中Data文件存放在Data目录,Redo日志文件存放在Redo目录,Data目录路径和Redo目录路径在配置文件“${GMDB_HOME}/config/server.ini”中配置。如果“DATA_PATH”和“REDO_PATH”配置项值为空,则“DATA_PATH”和“REDO_PATH”默认值为“${GMDB_HOME}/data”和“${GMDB_HOME}/redo”。
4. 备份操作

4.1 创建备份目录:

假设备份目录为“backup_dir”,“backup_dir”目录的空闲空间需要大于Data目录和Redo目录使用空间的总和。
mkdir /backup_dir

4.2 检查gmserver进程是否正常:

gmp系统显示类似如下信息,表明gmserver进程运行正常。
UID        PID  PPID %CPU START TTY          TIME CMD
gmdb     20240     1 32.4 00:39 pts/6    00:55:12 gmserver
4.3 备份数据库:
“backup_path”为备份目录“backup_dir”的绝对路径,“-c”表示采用压缩方式备份。
gmbar -b /backup_dir -c
<97 fastore11 [gmdb1] /home/gmdb1>gmbar -b /backup_dir -c
Backup device ... [100%].
Backup redolog ... [100%].
Backup database to /backup_dir success.

4.4 检查备份文件:

ls -l /backup_dir
<98 fastore11 [gmdb1] /home/gmdb1>ls -l /backup_dir
total 0
drwx------ 1 gmdb1 onip 44 Sep 15 16:03 gmdb_data_bak

三、逻辑备份

1. 逻辑备份
逻辑备份是指将数据库中表定义和表数据以文本方式导出,当数据库存储数据异常时,恢复数据。
2. 使用场景
建议每天定时自动触发进行一次逻辑备份。需要手工执行逻辑备份的典型场景如下:
  • >>数据库升级时涉及表定义变更。
  • >>数据库存储数据异常。
  • >>手工检查用户数据。
3. 备份原则
备份原则如下:
  • >>各历史备份目录按日期存放。
  • >>建议保留多份备份文件。
  • >>在业务闲时进行备份。
4. 备份对象
共享内存中数据库的表定义和表数据。
5. 备份操作

5.1 创建备份目录:

假设备份目录为“txt_backup_dir_date”,“txt_backup_dirdate”目录的空闲空间大于内存数据库总大小。
mkdir txt_backup_dir

5.2 检查gmserver进程是否正常:

gmp系统显示类似如下信息,表明gmserver进程运行正常。
UID        PID  PPID %CPU START TTY          TIME CMD
gmdb     20240     1 32.4 00:39 pts/6    00:55:12 gmserver
5.3 备份数据库:
gmdcp -c /as dba -e -p /backup_dir/txt_backup_dir
注:-c参数输入连接串,-e参数指定导出操作,-p参数指定到处目录,可根据参数指定导入导出操作以及多带带导出表结构表数据等。
<114 fastore11 [gmdb1] /backup_dir/txt_backup_dir>gmdcp -c /as dba -e -p /backup_dir/txt_backup_dir
Start to export definition...
Export definition of user "sysman" successfully.
Export definition of table "sys.fastore_jobs" successfully.
Export definition successfully.
Start to export data...
Export "sys.fastore_jobs" successfully.
Export data successfully.
All job finished, total time 0.154 seconds.

5.4 检查文件是否存在:

<115 fastore11 [gmdb1] /backup_dir/txt_backup_dir>ls -l
total 8
-rw------- 1 gmdb1 onip 558 Sep 15 16:13 gmdb.sql
-rw------- 1 gmdb1 onip 386 Sep 15 16:13 sys.fastore_jobs.sql
-rw------- 1 gmdb1 onip 0 Sep 15 16:13 sys.fastore_jobs.unl
四、全量恢复
1. 全量恢复:
全量恢复是指将全量备份生成的持久化文件(Redo日志文件和Data文件)导入到数据库,恢复数据库。
2. 使用场景:
执行全量恢复的典型场景如下:
  • >>数据库升级失败。
  • >>数据库升级成功后,系统运行异常回滚。
  • >>持久化文件(Redo日志文件和Data文件)正常,共享内存不存在。
3. 恢复对象:
全量备份生成的持久化文件(Redo日志文件和Data文件)。
4. 恢复操作:

4.1 以安装用户登录主机停止数据库:

stopdb.sh

4.2 检查gmserver是否停止:

gmp
gmadm -s gmserver ----强制停止命令

4.3 备份Data目录和Redo目录

Data目录路径和Redo目录路径在配置文件“${GMDB_HOME}/config/server.ini”中配置。如果“DATA_PATH”和“REDO_PATH”配置项值为空,则“DATA_PATH”和“REDO_PATH”默认值为“${GMDB_HOME}/data”和“${GMDB_HOME}/redo”。

4.4 清除共享内存:

gmadm -d -force
4.5 系统显示类似如下信息,表明共享内存已经删除。
Successfully delete shared memory.

4.6 恢复数据库:

gmbar -r backup_path -force
backup_path为全量备份文件所在路径,-force表示不显示提示信息,强制恢复。
系统显示类似如下信息,表明数据库恢复成功。
load device ... [100%] Flush device ... [100%].
Copy redolog ... [100%].
Rebuild redolog ... [100%].
Restore from file succeed.

4.7 启动数据库:

startdb.sh

4.8 检查gmserver进程:

gmsql /as dba "exit;" | grep "Successfully CONNECT to DB"
系统显示类似如下信息,则表示启动成功,否则请等待10秒再执行命令检查。
Successfully CONNECT to DB.

4.9 检查数据库准确性

五、逻辑恢复

1. 逻辑恢复
逻辑恢复是指将逻辑备份生成的表定义和表数据文件导入到数据库,恢复数据。
2. 使用场景
逻辑恢复的典型场景如下:
  • >>数据库升级成功后导入变更的表定义和表数据。

  • >>共享内存中存储数据异常。

3. 恢复对象:
逻辑备份生成的表定义和表数据文件。
4. 恢复操作:

4.1 以安装用户登录主机停止数据库:

stopdb.sh

4.2 检查gmserver是否停止:

gmstat -s | grep "open"
系统未显示任何信息,则表示gmserver进程已经停止,否则请等待10秒,再执行命令检查。
如果gmserver进程仍然在运行,应停止业务进程访问数据库,并停止gmserver进程。如果需要强制停止gmserver进程,可以执行如下命令。
gmadm -s gmserver

4.3 备份Data目录和Redo目录:

Data目录路径和Redo目录路径在配置文件“${GMDB_HOME}/config/server.ini”中配置。如果“DATA_PATH”和“REDO_PATH”配置项值为空,则“DATA_PATH”和“REDO_PATH”默认值为“${GMDB_HOME}/data”和“${GMDB_HOME}/redo”。

4.4 删除共享内存:

gmadm -d -force
系统显示类似如下信息,表明共享内存已经删除。
Successfully delete shared memory.

4.5 启动数据库:

startdb.sh

4.6 检查gmserver进程是否启动正常。

gmsql /as dba "exit;" | grep "Successfully CONNECT to DB"
系统显示类似如下信息,则表示启动成功,否则请等待10秒再执行命令检查。
Successfully CONNECT to DB.

4.7 恢复数据库:

gmdcp -c /as dba -i -p txt_backup_dir_20150130
txt_backup_dir_20150130为逻辑备份文件所在路径。
系统显示类似如下信息,表明数据库恢复成功。
Start to import definition ...
Import definition of entire DB successfully.
Import definition successfully.
Start to import data...
Import data successfully.
All job finished, total time 0.124 seconds.

4.8 检查数据库准确性


日常维护


一、管理用户

1. 创建账户

1.1 启动gmsql

<127 fastore11 [gmdb1] /home/gmdb1>gmsql
gmsql V200R005C52SPC230 - Production on Apr 10 2020
SQL>

1.2 使用sys用户链接数据库

SQL>connect sys/Admin123 ipc;
Connected through DB ...
Successfully CONNECT to DB.(IPC)

1.3 创建用户账号:

如果你想创建只有查询权限的帐户user_read,并预设其密码为User_read1(密码要符合规则,否则会执行失败,详细请参见密码规则),可在gmsql中输入CREATE USER user_read IDENTIFIED BY User_read1;
然后执行。如果成功,则显示如下信息。
SQL>CREATE USER user_read IDENTIFIED BY User_read1;
SQL Executed Successfully

2. 修改密码

1.1 sys密码管理:

登录sys用户:在gmsql中输入connect sys/password ipc
修改sys密码:如果新密码为Newpwd123,则在gmsql中输入password sys
SQL>password sys
Old password:********
New password:********
Retype new password:********
Password changed successfully.
测试密码连接:CONNECT sys/Newpwd123 ipc;
1.2 普通用户密码管理:
登录sys用户:在gmsql中输入connect sys/password ipc
修改用户密码:如果你想将用户user_read的密码改为User_read2,则在gmsql中输入password sys
测试密码连接:CONNECT user_read/User_read2 ipc;

3. 锁定账户

登录sys用户:在gmsql中输入connect sys/password ipc;
锁定用户:ALTER USER user_read ACCOUNT LOCK;

4. 解锁账户

登录sys用户:在gmsql中输入connect sys/password ipc;
解锁用户:ALTER USER user_read ACCOUNT UNLOCK;

5. 删除账户

登录sys用户:在gmsql中输入connect sys/password ipc;
删除用户:DROP USER user_read;

6. 审计账户

登录sys用户:在gmsql中输入connect sys/password ipc;
审计账户:假如你要对用户帐户的DML操作进行审计,可在gmsql中输入ALTER USER user_read SET AUDIT DML ON;,然后执行。

二、管理权限

1. 创建角色

1.1 前提条件:
  • FaStore数据库默认的管理员帐户为sys,仅sys用户具有创建角色的权限。
  • 角色和用户不允许同名。
  • 角色名不允许为系统关键字,参见语法约定。
  • 角色名称最长为30个字符,可以包含大小写字母、数字及下划线,首字符必须为字母。
  • 角色名不区分大小写。
  • 新创建角色默认无任何权限。
1.2 登录sys用户:在gmsql中输入connect sys/password ipc;
1.3 创建角色:CREATE ROLE rolename;
1.4 查看角色:SELECT * FROM sys.SYSROLES;

2. 授予系统权限给用户或自定义角色

2.1 背景信息:
  • FaStore数据库默认的管理员帐户为sys,仅sys用户具有授予系统权限的权限。
  • 系统权限和角色可同时授予用户。
  • 即使有写权限也不能对系统表进行写操作。
  • 授予已拥有权限不会失败。
2.2 登录sys用户:在gmsql中输入connect sys/password ipc;
2.3 授予系统权限给用户:
GRANT sys_prives1,sys_privs2, ... TO username1,username2, ...;
2.4 授予系统权限给自定义角色:
GRANT sys_prives1,sys_privs2, ... TO rolename1,rolename2, ...;
2.5 查询角色“roletest”和用户“usertest”拥有的系统权限表信息:
SELECT * FROM SYSDBPRIVS WHERE GRANTEE = ‘ROLETEST’;SELECT * FROM SYSDBPRIVS WHERE GRANTEE = ‘usertest’;
注:授予多个系统权限时采用逗号分隔并且不能重复。授予多个用户和自定义角色时采用逗号分隔并且不能重复。用户名和自定义角色名可交叉。

3. 授予对象权限给用户或自定义角色

3.1 背景信息:
  • 授予对象权限需要有GRANT ANY OBJECT PRIVILEGE权限。
  • 即使有写权限也不能对系统表进行写操作。
  • 一次只能授予一个对象。
  • 授予已存在权限不会失败。
  • 不能同时授予对象权限和系统权限。
  • 不支持授予所有schema对象的语法,即GRANT select on userA.* to userB。
3.2 登录sys用户:在gmsql中输入connect sys/password ipc;
3.3 授予表或视图的对象权限:GRANT obj_prives1,obj_privs2, ... ON obj_name TO username1,username2,rolename1,rolename2, ...;
3.4 授予其他对象权限:GRANT obj_prives1,obj_privs2, ... ON obj_keyword obj_name TO username1,username2,rolename1,rolename2, ...;
3.5 查询对象权限表“SYSOBJPRIVS”:SELECT * FROM SYSOBJPRIVS;
注:obj_name指对象名称,obj_keyword指对象关键词。授予多个对象权限时采用逗号分隔并且不能重复。授予多个用户和自定义角色时采用逗号分隔并且不能重复。用户名和自定义角色名可交叉。

4. 授予角色给用户

4.1 背景信息:
  • FaStore数据库默认的管理员帐户为sys,仅sys用户具有授予角色的权限。
  • GMDB不支持将角色授予角色。
  • 角色和系统权限可同时授予给用户。
4.2 登录sys用户:在gmsql中输入connect sys/password ipc;
4.3 授予角色给用户:Grant rolename1,rolename2, ... to username1,username2, ...;
注:授予多个角色时采用逗号分隔并且不能重复。授予多个用户时采用逗号分隔并且不能重复。
4.4 查询用户角色表信息:SELECT * FROM SYSUSERROLES;

5. 撤销用户和自定义角色的系统权限

5.1 背景信息:
  • FaStore数据库默认的管理员帐户为sys,仅sys用户具有撤销系统权限的权限。
  • 撤销用户和角色的权限后,该用户和角色用户新建句柄将不再具有已经撤销的系统权限,对当前句柄无影响。
  • 撤销的系统权限必须为用户或自定义角色所拥有,否则会撤销失败。
  • 系统权限和角色可以同时撤销。
5.2 登录sys用户:在gmsql中输入connect sys/password ipc;
5.3 撤销用户的系统权限:
REVOKE sys_prives1,sys_privs2, ... from username1,username2, ...;
5.4 撤销自定义角色的系统权限:
REVOKE sys_prives1,sys_privs2, ... from rolename1,rolename2, ...;
注:撤销多个系统权限时采用逗号分隔并且不能重复。撤销多个用户和自定义角色时采用逗号分隔并且不能重复。用户名和自定义角色名可交叉。

6. 撤销用户和自定义角色的对象权限

6.1 背景信息:
  • 撤销对象权限需要有GRANT ANY OBJECT PRIVILEGE权限。
  • 即使有写权限也不能对系统表进行写操作。
  • 一次只能撤销一个对象的权限。
  • 不能同时撤销对象权限和系统权限。
  • 撤销不存在的权限或者不属于用户或角色的权限会失败。
  • 撤销用户和自定义角色的对象权限后,该用户和角色用户新建句柄将不再具有已经撤销的对象权限,对当前句柄无影响。
6.2 登录sys用户:在gmsql中输入connect sys/password ipc;
6.3 撤销表或视图的对象权限:REVOKE obj_prives1,obj_privs2, ... ON obj_name FROM username1,username2,rolename1,rolename2, ...;
6.4 撤销其他对象权限:REVOKE obj_prives1,obj_privs2, ... ON obj_keyword obj_name FROM username1,username2,rolename1,rolename2, ...;
注:obj_name指对象名称,obj_keyword指对象关键词。撤销多个对象权限时采用逗号分隔并且不能重复。撤销多个用户和自定义角色时采用逗号分隔并且不能重复。用户名和自定义角色名可交叉。

7. 撤销用户角色

登录sys用户:在gmsql中输入connect sys/password ipc;
撤销用户角色:Revoke rolename1,rolename2, ... from username1,username2, ...;

8. 删除角色

登录sys用户:在gmsql中输入connect sys/password ipc;
删除角色:DROP ROLE role_del;
注:删除角色时,系统会提示将会撤销该角色下的所有权限并且不能回滚,需要进行确认。

三、管理对象

1. 管理表空间

1.1 概述:

1.1.1 表空间描述
表空间(tablespace)是数据库的逻辑划分。数据库将数据存放在数据文件中。在其内部,数据库将不同的数据分开存储,这些逻辑划分称为表空间。从物理角度来看,表空间将数据存储在一个或多个数据文件中。一个数据库通常包含了若干表空间,一个表空间通常对应若干个数据文件。
1.1.2 数据文件
数据文件位于磁盘中,用于存放逻辑结构、管理信息、业务数据。数据文件在创建、修改表空间时由数据库自动生成。
1.1.3 数据文件有下列特征:
  • 一个数据文件对应一个表空间。
  • 数据文件创建之后,既不能改变它的大小,也不能删除它。
  • 一个表空间由一个或多个数据文件组成。
  • 可以向已有的表空间里增加新的数据文件。
  • 数据文件的大小范围是:56KB~4032MB。
  • 数据文件的命名规则:可包含字母、数字、下划线。不能以点号开头。
1.1.4 表空间类型
PERM:系统默认会创建名为USER和SYSTEM的PERM类型表空间,用于存放用户数据库对象的持久化信息(比如表和索引)和系统表的持久化信息。用户如果要在创建对象时未指定表空间,则默认存储在USER表空间。
UNDO:存储用户表的UNDO持久化信息,表空间名为UNDO。
TEMP_UNDO:存储临时表的UNDO信息,表空间名为TEMP_UNDO。
TEMP:存储临时表信息,表空间名为TEMP。
HASH:存放索引的哈希桶信息,表空间名为HASH。
TEMP_HASH:存储临时表索引的哈希桶信息,表空间名为HASH_TEMP。
REP:存储RT表(Replication Table)信息,表空间名为REP。
REP_UNDO:存储RT表的UNDO信息,表空间名为REP_UNDO。

1.2 创建表空间

1.2.1 前提条件:
  • FaStore数据库服务已正常运行。
  • 已启动gmsql工具,并通过有CREATE SESSION和CREATE TABLESPACE权限的帐户连接到用户库。
  • 当前的操作系统用户要拥有相应目录的读写权限,该目录用于存放数据文件。
1.2.2 登录一个用户gmsql;connect user_read/User_read1 192.168.56.111:8500;
1.2.3 创建表空间:CREATE TABLESPACE MYTBS ON (mytbs.dat SIZE 64k);
1.2.4 查看表空间:SELECT * FROM V$TABLESPACE WHERE NAME =MYTBS;

1.3 扩容表空间

1.3.1 前提条件:
  • FaStore数据库服务已正常运行。
  • 已启动gmsql工具,并通过有CREATE SESSION和CREATE TABLESPACE权限的帐户连接到用户库。
  • 当前的操作系统用户要拥有相应目录的读写权限,该目录用于存放数据文件。
1.3.2 检查表空间大小是否不足:
SELECT NAME,(SPACE_SIZE-SPACE_FREE_SIZE)/SPACE_SIZE SPACE_USED FROM v$tablespace;
1.3.3 给表空间增加数据文件:
ALTER TABLESPACE tablespace_name ADD DATAFILE datafile_name SIZE size_num K|M|G;

1.4 缩减表空间

1.4.1 前提条件:

  • 在创建数据库之后,不支持在线缩小表空间,用户可以通过重建数据库对表空间整改,实现缩小表空间。
  • 双机监控和业务都已经正常停止。
1.4.2 物理备份数据
  • 创建数据备份目录。
% mkdir ${GMDB_HOME}/gmdb_data_bak_4_tbs
  • 触发完成checkpoint。
% gmsql /as dba "checkpoint;exit;"
  • 备份数据。
% gmbar -b ${GMDB_HOME}/gmdb_data_bak_4_tbs -c
1.4.3 逻辑备份数据
  • 创建数据备份目录。
% mkdir ${GMDB_HOME}/gmdb_data_bak_4_tbs_lg
  • 导出数据库:由于备份数据量大,备份文件所在磁盘文件空间大小大于备份数据量大小。导出时间因不同环境(包括现场数据量、服务器性能等因素)耗时不同。
gmdcp -c /as dba -e -n 5 -p ${GMDB_HOME}/gmdb_data_bak_4_tbs_lg
1.4.4 调整表空间
  • 停止数据库
stopdb.sh
  • 清除共享内存
gmadm -d -force
  • 删除“DATA_PATH”和“REDO_PATH”配置项对应目录下的所有文件
查看server.ini文件中“DATA_PATH”和“REDO_PATH”配置项的值。如果“DATA_PATH”和“REDO_PATH”配置项值为空,则“DATA_PATH”和“REDO_PATH”默认值为“${GMDB_HOME}/data”和“${GMDB_HOME}/redo”。
  • 启动FaStore,检查gmserver进程是否启动正常
startdb.sh;gmsql /as dba "exit;" | grep "Successfully CONNECT to DB";
  • 删除“FASTORE_JOBS”表
gmsql /as dba "drop table FASTORE_JOBS;exit;"
  • 整改表空间大小
cd ${GMDB_HOME}/gmdb_data_bak_4_tbs_lg
cp gmdb.sql gmdb.sql.bak
使用VI编辑器编辑“gmdb.sql”,根据整改目标对CREATE TABLESPACE、CREATE TEMPORARY TABLESPACE和ALTER TABLESPACE语句的表空间文件名以及表空间大小进行修改。修改完成后,保存退出VI编辑器
  • 恢复数据
gmdcp -c /as dba -i -n 5 -p ${GMDB_HOME}/gmdb_data_bak_4_tbs_lg
  • 在备机执行全量同步
gmbar -rnet -force

2. 管理表

清理表碎片:
如果想要手动清理该表的碎片,可在gmsql中输入VACUUM TABLE TBL;
如果要手动清理所有表的碎片,可在gmsql中输入VACUUM TABLE ALL;


本 文 原 创 来 源:IT那活儿微信公众号(上海新炬王翦团队)

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/129716.html

相关文章

  • 【干货】云计算的7大常用功能

    摘要:下文介绍了云计算用于提高实现业务目标的能力的几种情况。测试和开发云的最佳使用场景可能是测试和开发环境。大数据和分析云计算可以实现的优势之一,就是可以使用大量结构化和非结构化数据,利用获取业务价值的优势。  事实证明,云计算可以降低成本、提高灵活性和弹性,以及优化资源利用,从而提高竞争力。下文介绍了云计算用于提高实现业务目标的能力的几种情况。  1.基础结构即服务(IaaS)和平台即服务(Pa...

    mochixuan 评论0 收藏0
  • 云计算的运维管理问题

    摘要:运行监控云计算的运维管理应从数据中心的日常监控人手,对日常维护管理事件管理变更管理以及应急预案管理等进行全方位的日常监控,以提前发现问题并消除隐患。自动化管理已然成为了当前云计算运维管理的一个必然发展趋势。从而有效实现云计算运维管理的改进。云计算在企业运营中的基本工作原理是将计算分布在大量分布式计算机中,从而使企业数据中心的运行和互联网更为相似。通过云计算的运维管理,企业不仅能够实现对IT资...

    CoderBear 评论0 收藏0

发表评论

0条评论

IT那活儿

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<