
# 数据库基本信息采集器
采集数据库的基础信息，包括数据库版本、字符集、数据库大小、性能数据、数据库部分配置信息、表对象的统计信息（包括表使用到的数据类型、主键字段的数据类型、无主键表信息、LOB表信息、大数据表信息以及分区表和大分区信息）、集合对象统计信息（仅适用MongoDB。 包含索引个数超过10的集合、无_id索引的集合、含TTL索引集合、名称含非法字符的集合），以及Schema维度的统计信息。
#### 约束与限制
- 当前支持MySQL 5.7及以上、PostgreSQL 11及以上、Microsoft SQL Server 2008以上（不包含2008）和MongoDB 4.0及以上数据库版本采集。需要目标数据库防火墙开放数据库端口（MySQL默认为3306，PostgreSQL默认为5432，SQL Server默认为1433、MongoDB默认为27017）。
- 确保SQL Server启用"混合身份验证模式"，如果只启用了 Windows身份验证，SQL无法登录。
- 当前不支持加密连接数据库的信息进行采集。
- 在对数据库资源进行规格评估时，建议使用[在线调研方式](https://support.huaweicloud.com/usermanual-mgc/mgc_03_0030.html)采集实例信息。通过手工导入的数据库实例资源如果缺少节点信息，将导致目的端规格评估时无法推荐对应节点，从而影响评估准确性。如果需要进行风险评估，推荐通过迁移中心 Agent离线采集数据库实例信息，并以手工导入方式添加至MgC。
 
#### 参数配置说明
表1数据库基本信息采集器参数配置说明 
| 参数               | 必选 | 配置说明                                                                                                                                                      |
|:---|:---|:---|
| db_instance_name | 否  | 输入连接数据库时的初始数据库名称，连接MySQL时默认值为mysql，连接PostgreSQL时默认值为postgres，连接Microsoft SQL Server时默认值为master，连接MongoDB时默认为admin。                                        |
| output_path      | 否  | 自定义的采集结果输出文件路径。如 C:\\MgC-Agent\\test。 默认路径C:\\MgC-Agent\\data\\collection-result\\agent_collector_database_all_basic_info。 |
| user_selector    | 否  | 输入待采集范围，用英文逗号分隔，默认值为空，表示采集整库的所有数据。连接MySQL、MongoDB时表示数据库列表，连接PostgreSQL、Microsoft SQL Server时表示数据库内的模式列表。                                                  |
   
#### MySQL数据库凭证授权操作
数据库采集器需要连接到数据库并查询系统视图获取信息，请确保提供的用户具有相关权限，可参考如下步骤准备和授权：
1. 登录数据库服务器。打开终端（Linux）或命令提示符（Windows），进入MySQL客户端安装目录或配置MySQL环境变量。执行以下命令登录数据库： 
   ```
   mysql -u <user> -p
   ```
   -- user：数据库用户名。该用户需要有创建用户与授权的权限，通常情况下，**只有** **数据库管理员（如 root 用户）会被赋予这些权限**。建议联系数据库管理员进行以下创建与授权操作。
   图1MySQL 命令行界面   
   ![](https://support.huaweicloud.com/tg-mgc/zh-cn_image_0000002374056104.png "点击放大")
   
   
2. 登录数据库成功后，执行以下命令，创建用户：
   
   ```
   CREATE USER '<db-user>'@'<host>' IDENTIFIED BY '<db-password>';
   ```
   - --db-user：需替换为实际创建的用户名，对应mgc-agent中凭证的用户名。
   
   - --host：指定允许登录的主机，@'\<host\>'可省略，省略时的默认值是@%，您可以指定迁移中心Agent服务器所在的IP地址为host。示例：
     - %：允许从任意主机登录（包括远程）；
     
     - localhost：仅允许从数据库服务器本机登录；
     
     - 192.168.1.%：允许从指定网段（如192.168.1.x）的主机登录；
     
     - 192.168.1.252：仅允许192.168.1.252的主机登录；
      
   
   - --db-password: db-user的密码，对应mgc-agent中凭证的密码。
   
   
   
   
3. 进行数据库授权。参考以下两种方式并结合实际需求选择指定数据库授权或所有数据库授权。 
   - 执行以下命令进行指定数据库授权，采集器默认使用mysql数据库进行测试连接，若没有以下权限测试连接将失败。
     ```
     GRANT SELECT ON mysql.* TO '<db-user>'@'<host>';
     GRANT PROCESS ON *.* TO '<db-user>'@'<host>';
     GRANT SELECT ON <database-name>.* TO '<db-user>'@'<host>';
     ```
     -- process权限用于指定用户可以查看information_schema所有的表。
     --db-user：数据库用户名，步骤[2]中创建的用户。
     --@'\<host\>'：指定允许登录的主机，与步骤[2]创建的值保持一致，不填默认为@%。
     --database-name：对待采集的数据库名称。
     
   
   - 执行以下命令进行所有数据库授权：
     ```
     GRANT PROCESS ON *.* TO '<db-user>'@'<host>';
     GRANT SELECT ON *.* TO '<db-user>'@'<host>';
     ```
     --db-user：数据库用户名，步骤[2]中创建的用户。
     --@'\<host\>'：指定允许登录的主机，与步骤[2]创建的值保持一致，不填默认为@%。
     
   
   
   
   
4. 执行以下命令，刷新权限： 
   ```
   FLUSH PRIVILEGES;
   ```
   
   
5. 执行以下命令，查看用户是否有权限： 
   ```
   SHOW GRANTS FOR '<db-user>'@'<host>';
   ```
   --db-user：数据库用户名，步骤[2]中创建的用户。
   --@'\<host\>'：指定允许登录的主机，与步骤[2]创建的值保持一致，不填默认为@%。
   - 执行指定数据库授权时，如下图，说明已授权。 ![](https://support.huaweicloud.com/tg-mgc/zh-cn_image_0000002443086426.png "点击放大")
     
   
   - 执行所有数据库授权时，如下图，说明已授权。 ![](https://support.huaweicloud.com/tg-mgc/zh-cn_image_0000002414434805.png "点击放大")
     
   
   
   
   
6. 在MgC-Agent上添加凭证。 
   1. 登录MgC Agent控制台，进入凭证管理页面，单击创建凭证，进入创建凭证页面。
   
   2. 资源类型选择数据库，认证方式选择用户名/密码。用户名和密码为步骤[2]中创建的用户和对应的密码。
   
   
   ![](https://support.huaweicloud.com/tg-mgc/zh-cn_image_0000002380770222.png "点击放大")
   
   
 
#### MySQL数据库取消授权和删除用户操作
- 取消已授予的权限使用REVOKE命令，语法与GRANT对应，按需执行以下命令取消上面授予的权限。
  ```
  REVOKE PROCESS ON *.* FROM '<db-user>'@'<host>';
  REVOKE SELECT ON *.* FROM '<db-user>'@'<host>';
  REVOKE SELECT ON mysql.* FROM '<db-user>'@'<host>';
  REVOKE SELECT ON <database-name>.* TO <db-user>;
  ```
  
- 执行以下命令，删除用户。
  ```
  DROP USER '<db-user>'@'<host>';
  ```
  
 
#### PostgreSQL数据库凭证授权操作
数据库采集器需要连接到数据库并查询系统视图获取信息，请确保提供的用户具有相关权限，可参考如下步骤准备和授权：
1. 登录数据库服务器。打开终端（Linux）或命令提示符（Windows），进入PostgreSQL客户端安装目录或配置PostgreSQL环境变量。执行以下命令登录数据库： 
   ```
   psql -d <databaseName> -h <ip> -p <port> -U <user> -W
   ```
   - --databaseName：登录的数据库名称。
   
   - --ip：机器的ip地址。
   
   - --port：数据库端口号。
   
   - --user：数据库登录的用户名。
   
   
   
   
2. 登录数据库成功后，执行以下命令，创建用户： 
   ```
   CREATE USER "<db-user>" PASSWORD '<db-password>';
   ```
   - --db-user：需替换为实际创建的用户名，对应mgc-agent中凭证的用户名。
   
   - --db-password：db-user的密码，对应mgc-agent中凭证的密码。
   
   
   ![](https://support.huaweicloud.com/tg-mgc/zh-cn_image_0000002476540921.png "点击放大")
   
   
3. 执行以下命令，在待采集的数据库进行授权。采集对象需要授予如下权限。 
   ![](https://support.huaweicloud.com/tg-mgc/public_sys-resources/note_3.0-zh-cn.png)
   如下授权语句仅适用于目前已有的数据库对象。若授权之后添加新的对象，这些新增对象将不会自动获得权限，必须重新执行授权语句。
   ```
   GRANT USAGE ON SCHEMA "<user-schema>" TO "<db-user>";
   GRANT SELECT ON ALL TABLES IN SCHEMA "<user-schema>" TO "<db-user>";
   GRANT USAGE ON ALL SEQUENCES IN SCHEMA "<user-schema>" TO "<db-user>";
   GRANT TRIGGER ON ALL TABLES IN SCHEMA "<user-schema>" TO "<db-user>";
   ```
   - --user-schema：需要采集的schema的名字，如public。
   
   - --db-user：需替换为实际创建的用户名，对应mgc-agent中凭证的用户名。
   
   
   ![](https://support.huaweicloud.com/tg-mgc/zh-cn_image_0000002476616201.png "点击放大")
   
   
 
#### PostgreSQL数据库取消授权和删除用户操作
- 取消已授予的权限使用REVOKE命令，语法与GRANT对应，按需执行以下命令取消上面授予的权限。
  ```
  REVOKE USAGE ON SCHEMA "<user-schema>" FROM "<db-user>";
  REVOKE SELECT ON ALL TABLES IN SCHEMA "<user-schema>" FROM "<db-user>";
  REVOKE USAGE ON ALL SEQUENCES IN SCHEMA "<user-schema>" FROM "<db-user>";
  REVOKE TRIGGER ON ALL TABLES IN SCHEMA "<user-schema>" FROM "<db-user>";
  ```
  
- 执行以下命令，删除用户。
  ```
  DROP USER "<db-user>";
  ```
  
 
#### Microsoft SQL Server数据库凭证授权操作
数据库采集器需要连接到数据库并查询系统视图获取信息，请确保提供的用户具有相关权限，可参考如下步骤准备和授权：
![](https://support.huaweicloud.com/tg-mgc/public_sys-resources/notice_3.0-zh-cn.png)
SQL Server采集器不做强制的权限校验，权限缺失可能导致采集失败或者采集数据缺失，建议使用具有sysadmin角色的登录用户进行采集。
1. 登录数据库服务器。打开终端（Linux）或命令提示符（Windows），进入SQLServer客户端安装目录或配置SQLServer环境变量。执行以下命令登录数据库： 
   ```
   sqlcmd -S <ip>,<port> -U <user> -P <password>
   ```
   - --ip：机器的ip地址。
   
   - --port：数据库端口号。
   
   - --user：数据库登录的用户名。该用户需要有创建用户与授权的权限，通常情况下，**只有** **数据库管理员（如sysadmin用户）会被赋予这些权限**。建议联系数据库管理员进行以下创建与授权操作。
   
   - --password：user的密码，对应mgc-agent中凭证的密码。
   
   
   图2SQL Server命令行界面   
   ![](https://support.huaweicloud.com/tg-mgc/zh-cn_image_0000002493107778.png "点击放大")
   
   
2. 登录数据库成功后，执行以下命令，创建用户： 
   ```
   CREATE LOGIN <login_user> WITH PASSWORD = '<password>';
   ```
   - --login_user：需替换为实际创建的用户名，对应mgc-agent中凭证的用户名。
   
   - --password：login_user的密码，对应mgc-agent中凭证的密码。
   
   
   
   
3. 进行数据库授权。参考以下两种方式并结合实际需求选择授权全库管理员权限或单库db_datareader只读权限。 
   - 执行以下命令进行全库管理员权限授权，适用于需要采集整个SQL Server实例中所有数据库的场景。
     ```
     CREATE USER <login_user> FOR LOGIN <login_user>; 
     GO
     ALTER SERVER ROLE sysadmin ADD MEMBER <login_user>;
     GO
     ```
     --login_user：需替换为实际创建的用户名，对应mgc-agent中凭证的用户名。
     ![](https://support.huaweicloud.com/tg-mgc/zh-cn_image_0000002525058391.png "点击放大")
     
   
   - 执行以下命令进行单库db_datareader只读权限授权，适用于部分库采集。
     ```
     USE <db_name>; 
     GO
     CREATE USER <login_user> FOR LOGIN <login_user>; 
     GO
     ALTER ROLE db_datareader ADD MEMBER <login_user>; 
     GO
     ```
     --db_name：数据库名称。
     --login_user：需替换为实际创建的用户名，对应mgc-agent中凭证的用户名。
     ![](https://support.huaweicloud.com/tg-mgc/zh-cn_image_0000002524987837.png "点击放大")
     
   
   
   
   
 
#### SQLServer数据库取消授权和删除用户操作
参考以下两种方式并结合实际选择取消授权全库管理员权限或单库db_datareader只读权限，并删除用户。
- [取消全库管理员权限]
  1. 按需执行以下命令取消全库管理员的权限。 
     ```
     ALTER SERVER ROLE sysadmin DROP MEMBER <login_user>;
     GO
     ```
     --login_user：需替换为实际创建的用户名，对应mgc-agent中凭证的用户名。
     
     
  
  2. 执行以下命令，查询SQL Server数据库最高权限的服务器角色里已删除相关用户。 
     ```
     EXEC sp_helpsrvrolemember 'sysadmin';
     GO
     ```
     ![](https://support.huaweicloud.com/tg-mgc/zh-cn_image_0000002493739768.png "点击放大")
     
     
   
- [取消单库db_datareader只读权限]
  1. 按需执行以下命令取消单库只读权限。 
     ```
     USE <db_name>; 
     GO
     ALTER ROLE db_datareader DROP MEMBER <login_user>; 
     GO
     ```
     --db_name：数据库名称。
     --login_user：需替换为实际创建的用户名，对应mgc-agent中凭证的用户名。
     ![](https://support.huaweicloud.com/tg-mgc/zh-cn_image_0000002525112505.png "点击放大")
     
     
  
  2. 执行以下命令，删除目标库的映射用户。 
     ```
     DROP USER <login_user>;
     GO
     ```
     
     
  
  3. 执行以下命令，删除服务器级登录名。 
     ```
     DROP LOGIN <login_user>;
     GO
     ```
     
     
   
#### MongoDB数据库凭证授权操作
数据库采集器需要连接到数据库并查询系统视图获取信息，请确保提供的用户具有相关权限，可参考如下步骤准备和授权：
1. 登录数据库服务器。打开终端（Linux）或命令提示符（Windows），进入Mongo Shell（mongosh）客户端安装目录或配置mongosh环境变量。执行以下命令登录数据库： 
   ```
   mongosh "mongodb://<ip>:<port>" --username <user> --authenticationDatabase admin
   ```
   - --ip：机器的ip地址。
   
   - --port：数据库端口号。
   
   - --user：数据库登录的用户名。该用户需要有创建用户与授权的权限，通常情况下，**只有** **数据库管理员（如 root 用户** **）会被赋予这些权限**。建议联系数据库管理员进行以下创建与授权操作。
   
   
   图3MongoDB命令行界面   
   ![](https://support.huaweicloud.com/tg-mgc/zh-cn_image_0000002492946546.png "点击放大")
   
   
2. 登录数据库成功后，参考以下两种方式并结合实际需求创建用户。 
   - 执行以下语句，创建具有root角色的用户：
     ```
     use admin
     ```
     ```
     db.createUser({
       user: "<db-user>",
       pwd: "<db-password>",
       roles: [ { role: "root", db: "admin" } ]
     })
     ```
     ```
     show users
     ```
     --db-user：需替换为实际创建的用户名，对应mgc-agent中凭证的用户名。
     --db-password：db-user的密码，对应mgc-agent中凭证的密码。
     ![](https://support.huaweicloud.com/tg-mgc/zh-cn_image_0000002525385385.png "点击放大")
     
   
   - 执行以下语句，创建具有组合角色的用户：
     ```
     use admin
     ```
     ```
     db.createUser({
       user: "<db-user>",
       pwd: "<db-password>",
       roles: [ 
     { role: "<role>", db: "admin" }, 
     { role: "clusterMonitor", db: "admin" }
       ]
     })
     ```
     --db-user：需替换为实际创建的用户名，对应mgc-agent中凭证的用户名。
     --db-password：db-user的密码，对应mgc-agent中凭证的密码。
     --role：需替换为要授予的权限名字，如readAnyDatabase、readWriteAnyDatabase或者dbAdminAnyDatabase。
     ```
     show users
     ```
     ![](https://support.huaweicloud.com/tg-mgc/zh-cn_image_0000002525439851.png "点击放大")
     
   
   
   
   
 
#### MongoDB数据库取消授权和删除用户操作
- 按需执行以下命令取消上面授予的权限。
  1. 执行以下命令，切换到目标认证库/归属库，
     ```
     use admin
     ```
     
  
  2. 执行以下命令，取消用户root角色权限。
     ```
     db.revokeRolesFromUser(
       "<user>",
       [
         { role: "root", db: "admin" }
       ]
     )
     ```
     或者执行以下命令，批量取消用户多个角色的权限。
     ```
     db.revokeRolesFromUser(
       "<user>",
       [
         { role: "<role>", db: "admin" },
         { role: "clusterMonitor", db: "admin" }
       ]
     )
     ```
     --user：数据库登录的用户名。
     --role：需替换为要取消授权的权限名字，如readAnyDatabase、readWriteAnyDatabase或者dbAdminAnyDatabase。
     
  
  3. 执行以下命令，确认用户角色已删除。
     ```
     show users
     ```
     
   
- 执行以下命令，删除用户。
  ```
  use admin
  ```
  ```
  db.dropUser("<user>")
  ```
  ```
  db.getUser("<user>")
  ```
  --user：数据库登录的用户名。
  
 
