Sqoop【付诸实践 01】Sqoop1最新版 MySQL与HDFS\Hive\HBase 核心导入导出案例分享+多个WRAN及Exception问题处理(一篇即可学会在日常工作中使用Sqoop)

本文涉及的产品
RDS AI 助手,专业版
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介: 【2月更文挑战第9天】Sqoop【付诸实践 01】Sqoop1最新版 MySQL与HDFS\Hive\HBase 核心导入导出案例分享+多个WRAN及Exception问题处理(一篇即可学会在日常工作中使用Sqoop)

1.环境说明

# 不必要信息不再贴出
# JDK
[root@tcloud ~]# java -version
java version "1.8.0_251"
# MySQL
[root@tcloud ~]# mysql -V
mysql Ver 14.14 Distrib 5.7.28
# Hadoop
[root@tcloud ~]# hadoop version
Hadoop 3.1.3
# Hive 
[root@tcloud ~]# hive --version
Hive 3.1.2
# Sqoop
[root@tcloud ~]# sqoop version
Sqoop 1.4.7

2.基本命令

:one: 查看所有命令【 sqoop help 】

[root@tcloud ~]# sqoop help

Available commands:
  codegen            Generate code to interact with database records
  create-hive-table  Import a table definition into Hive
  eval               Evaluate a SQL statement and display the results
  export             Export an HDFS directory to a database table
  help               List available commands
  import             Import a table from a database to HDFS
  import-all-tables  Import tables from a database to HDFS
  import-mainframe   Import datasets from a mainframe server to HDFS
  job                Work with saved jobs
  list-databases     List available databases on a server
  list-tables        List available tables in a database
  merge              Merge results of incremental imports
  metastore          Run a standalone Sqoop metastore
  version            Display version information

See 'sqoop help COMMAND' for information on a specific command.

:two: 查看某条命令的具体使用方法【 sqoop help COMMAND 】

[root@tcloud ~]# sqoop help job

usage: sqoop job [GENERIC-ARGS] [JOB-ARGS] [-- [<tool-name>] [TOOL-ARGS]]

Job management arguments:
   --create <job-id>            Create a new saved job
   --delete <job-id>            Delete a saved job
   --exec <job-id>              Run a saved job
   --help                       Print usage instructions
   --list                       List saved jobs
   --meta-connect <jdbc-uri>    Specify JDBC connect string for the
                                metastore
   --show <job-id>              Show the parameters for a saved job
   --verbose                    Print more information while working

Generic Hadoop command-line arguments:
(must preceed any tool-specific arguments)
Generic options supported are:
-conf <configuration file>        specify an application configuration file
-D <property=value>               define a value for a given property
-fs <file:///|hdfs://namenode:port> specify default filesystem URL to use, overrides 'fs.defaultFS' property from configurations.
-jt <local|resourcemanager:port>  specify a ResourceManager
-files <file1,...>                specify a comma-separated list of files to be copied to the map reduce cluster
-libjars <jar1,...>               specify a comma-separated list of jar files to be included in the classpath
-archives <archive1,...>          specify a comma-separated list of archives to be unarchived on the compute machines

The general command line syntax is:
command [genericOptions] [commandOptions]

3.查询操作

3.1 list-databases

查询MySQL所有数据库,通常用于 Sqoop 与 MySQL 连通测试:

# 注意:以下URL写法都可以【但是建议用第一个或第四个】
jdbc:mysql://ip:port/
jdbc:mysql://ip/
jdbc:mysql://ip
jdbc:mysql://hostname:port/
jdbc:mysql://hostname/
jdbc:mysql://hostname
jdbc:mysql:///
jdbc:mysql://

【具体参数可以使用 sqoop help list-databases 查看】实例:

sqoop list-databases \
--connect jdbc:mysql://tcloud:3306/ \
--username root \
-password tcloud@2021

结果:

# INFO信息不再贴出这里只贴出WARN信息
2021-09-09 10:12:09,596 WARN tool.BaseSqoopTool: 
Setting your password on the command-line is insecure. Consider using -P instead.

Thu Sep 09 10:12:10 CST 2021 WARN: 
Establishing SSL connection without server's identity verification is not recommended.
According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be
established by default if explicit option isn't set. For compliance with existing 
applications not using SSL the verifyServerCertificate property is set to 'false'. 
You need either to explicitly disable SSL by setting useSSL=false, 
or set useSSL=true and provide truststore for server certificate verification.

information_schema
metastore
mysql
performance_schema
sys

【2个】WARN处理:

# 第一个WARN是说 在命令行中设置密码是不安全的 考虑使用-P代替 修改后
sqoop list-databases \
--connect jdbc:mysql://tcloud:3306/ \
--username root \
-P
# 然后输入密码即可【这显然不利于自动化 使用过程中我们可以忽略此WARN】
# 第二个WARN是说 不建议在不验证服务器身份的情况下建立SSL连接 并给出解决建议 修改后
sqoop list-databases \
--connect jdbc:mysql://tcloud:3306/?useSSL=false \
--username root \
-P

3.2 list-tables

查询指定数据库中所有数据表,这里要注意一下 :point_right:(会查询出所有的表和视图,但不包含函数和存储过程)【具体参数可以使用 sqoop help list-tables 查看】实例:

# 找一个表比较少的库进行测试
sqoop list-tables \
--connect jdbc:mysql://tcloud:3306/sys?useSSL=false \
--username root \
--password aliyun@2021

结果:

2021-09-09 11:05:23,943 ERROR manager.CatalogQueryManager: Failed to list tables
java.sql.SQLException: Access denied for user 'root'@'tcloud' (using password: YES)

【1个】ERROR处理:

# 原来是密码错了 修改后
sqoop list-tables \
--connect jdbc:mysql://tcloud:3306/sys?useSSL=false \
--username root \
--password tcloud@2021

# 这里只贴出部分结果
host_summary
host_summary_by_file_io
host_summary_by_file_io_type
host_summary_by_stages
host_summary_by_statement_latency
host_summary_by_statement_type

3.3 eval

通过sqoop执行SQL语句对关系数据库进行操作,这样我们在使用import这种工具进行数据导入前,预先了解相关的SQL语句是否正确,并能将结果显示在控制台。【具体参数可以使用 sqoop help eval 查看】实例:

sqoop eval \
--connect jdbc:mysql://tcloud:3306/sys?useSSL=false \
--username root \
--password tcloud@2021 \
--query "select * from version"

# 结果
------------------
| sys_version | mysql_version |
------------------
| 1.5.2 | 5.7.28 |
------------------

4.MySQL数据导入导出到HDFS

4.1 import

  导入导出有时候我们无法分辨方向,这时把HDFS、Hive、HBase 等分布式文件存储系统当作【主体】,进入文件系统的就是导入import,从文件系统获取数据就是导出export。

  将 MySQL 数据库中的 help_keyword 表数据导入到 HDFS 的 /sqoop 目录下,如果导入目录存在则先删除再导入,使用 n 个 map tasks 并行导入。【具体参数可以使用 sqoop help import 查看】实例:

注:help_keyword 是 MySQL数据库内置的一张字典表,之后的示例均使用这张表。

  1. 直接导入
    ```shell

    备注版

    sqoop import \
    --connect jdbc:mysql://tcloud:3306/mysql?useSSL=false \
    --username root \
    --password tcloud@2021 \
    --table help_keyword \ # 待导入的表名称
    --delete-target-dir \ # 目标目录存在则先删除
    --target-dir /sqoop \ # 导入的目标目录
    --fields-terminated-by '\t' \ # 指定导出数据的分隔符
    -m n # 指定并行执行的 map tasks 数量

可执行版

sqoop import \
--connect jdbc:mysql://tcloud:3306/mysql?useSSL=false \
--username root \
--password tcloud@2021 \
--table help_keyword \
--delete-target-dir \
--target-dir /sqoop \
--fields-terminated-by '\t' \
-m 1

结果,这里只保留WARN信息:
```bash
# 这个WARN我们可以忽略
2021-09-09 13:40:51,014 WARN tool.BaseSqoopTool: 
Setting your password on the command-line is insecure. Consider using -P instead.

# 开启直接模式 MySQ会使用自带的导入导出工具进行处理
2021-09-09 13:40:59,272 WARN manager.MySQLManager: 
It looks like you are importing from mysql.
This transfer can be faster! Use the --direct
option to exercise a MySQL-specific fast path.

# 原因是 mapred-site.xml 配置了yarn模式 启动yarn 或者去掉yarn配置都行
# 【云服务器内存较小所以选择去掉了yarn】
2021-09-09 13:40:59,682 INFO client.RMProxy: 
Connecting to ResourceManager at tcloud/xxx.xx.x.x:8032

2021-09-09 13:41:01,488 INFO ipc.Client: Retrying connect to server: 
tcloud/xxx.xx.x.x:8032. Already tried 0 time(s); 
retry policy is RetryUpToMaximumCountWithFixedSleep(
maxRetries=10, sleepTime=1000 MILLISECONDS)

解决无法连接 ResourceManager 后再次执行,出现 ClassNotFoundException:

2021-09-09 14:55:36,267 WARN mapred.LocalJobRunner: job_local1346801578_0001
java.lang.Exception: java.lang.RuntimeException:
java.lang.ClassNotFoundException: Class help_keyword not found

这个很明显是执行job时找不到jar包导致的,处理方法是将生成到 /tmp/sqoop-你的用户名/compile(或者是/tmp/sqoop/compile)的文件放到$SQOOP_HOME/lib文件夹下,也可以使用--bindir指定生成代码的文件夹,处理后:

sqoop import \
--connect jdbc:mysql://tcloud:3306/mysql?useSSL=false \
--username root \
--password tcloud@2021 \
--table help_keyword \
--delete-target-dir \
--target-dir /sqoop \
--fields-terminated-by '\t' \
--bindir /usr/local/sqoop/lib/ \
-m 1

修改--bindir后执行仍然会报错,但是这次会生成jar文件,再次执行就成功了,但是这样下去,lib下的文件会越来越多,不是办法:

[root@tcloud lib]# ll
total 17820
-rw-r--r-- 1 root root     611 Sep  9 15:09 help_keyword$1.class
-rw-r--r-- 1 root root     617 Sep  9 15:09 help_keyword$2.class
-rw-r--r-- 1 root root    9441 Sep  9 15:09 help_keyword.class
-rw-r--r-- 1 root root     237 Sep  9 15:09 help_keyword$FieldSetterCommand.class
-rw-r--r-- 1 root root    5294 Sep  9 15:09 help_keyword.jar
-rw-r--r-- 1 root root   11509 Sep  9 15:09 help_keyword.java

⚠️以下方法无法解决此问题,仍然需要使用 --bindir $SQOOP_HOME/lib:

【方法一:x:】

# 1.配置Hadoop的core-site.xml添加sqoop1代理
vim /usr/local/hadoop-3.1.3/etc/hadoop/core-site.xml
    # 添加以下内容
    <property>
        <name>hadoop.proxyuser.sqoop1.hosts</name>
        <value>*</value>
    </property>
    <property>
        <name>hadoop.proxyuser.sqoop1.groups</name>
        <value>*</value>
    </property>

# 2.comma separated list of system users who CAN run applications
# 【可以运行应用程序的系统用户列表,以逗号分隔】
vim /usr/local/hadoop-3.1.3/etc/hadoop/container-executor.cfg
    # 添加
    allowed.system.users=root,sqoop1

【方法二:x:】

# 将生成的jar文件配置到第三方库
vim /etc/profile.d/my_env.sh
    # 添加
    export SQOOP_SERVER_EXTRA_LIB=/tmp/sqoop-root/compile
  1. 【增量导入】追加模式和最后修改模式
    ```shell

    追加模式

    sqoop import \
    --driver com.mysql.jdbc.Driver \
    --connect jdbc:mysql://tcloud:3306/mysql \
    --username root \
    --password tcloud@2021 \
    --table help_keyword \
    --target-dir /sqoop/part-m-00000 \
    --incremental append \
    --check-column help_keyword_id \
    --last-value '666' \
    --bindir /usr/local/sqoop/lib/ \
    -m 1

最后修改模式

sqoop import \
--driver com.mysql.jdbc.Driver \
--connect jdbc:mysql://tcloud:3306/mysql \
--username root \
--password tcloud@2021 \
--table slow_log\
--target-dir /sqoop/part-m-00000 \
--incremental lastmodified \
--check-column start_time\
--last-value '2021-09-08 20:59:15' \
--bindir /usr/local/sqoop/lib/ \
-m 1

incremental 参数有以下两个可选的选项:

+ append:要求参考列的值必须是递增的,所有大于  last-value 的值都会被导入;
+ lastmodified:要求参考列的值必须是  timestamp 类型,且插入数据时候要在参考列插入当前时间戳,更新数据时也要更新参考列的时间戳,所有时间晚于  last-value 的数据都会被导入。

Sqoop1的增量导入是依靠维护的参考列来判断哪些是增量数据。我们也可以使用 query 参数来进行手动的增量导入,会更加灵活。

3. SQL语句导入
```shell
# 注意:不能添加--table参数
sqoop import \
--driver com.mysql.jdbc.Driver \
--connect jdbc:mysql://tcloud:3306/mysql \
--username root \
--password tcloud@2021 \
--query 'SELECT help_keyword_id,name from help_keyword where $CONDITIONS' \
--delete-target-dir \
--target-dir /sqoop_query \
--bindir /usr/local/sqoop/lib/ \
-m 1

4.2 export

【具体参数可以使用 sqoop help export 查看】导出的表必须预先创建,建表语句如下:

CREATE TABLE help_keyword_from_hdfs LIKE help_keyword ;
# 导出数据存储在 MySQL 的help_keyword_from_hdf 的表中
sqoop export \
--connect jdbc:mysql://tcloud:3306/mysql \
--username root \
--password tcloud@2021 \
--table help_keyword_from_hdfs \
--export-dir /sqoop \
--input-fields-terminated-by '\t'\
--bindir /usr/local/sqoop/lib/ \
--m 1

# 采用export插入数据的时候,如果数据已经存在了,插入会失败
# 如果我们使用-update-key,它会认为每个数据都是更新,比如我们使用下面这条语句:
sqoop export \
--connect jdbc:mysql://tcloud:3306/mysql \
--username root \
--password tcloud@2021 \
--table help_keyword_from_hdfs \
--update-key help_keyword_id \
--export-dir /sqoop \
--input-fields-terminated-by '\t'\
--bindir /usr/local/sqoop/lib/ \
--m 1

--update-mode allowinsert # 如果存在就更新,不存在就插入

5.MySQL数据导入导出到Hive

Sqoop 导入数据到 Hive 是通过先将数据导入到 HDFS 上的临时目录,然后再将数据从 HDFS 上 Load 到 Hive 中,最后将临时目录删除。可以使用 target-dir 来指定临时目录。

5.1 import

  1. 数据导入

导入到 Hive 中的 sqoop_test 数据库需要预先创建,不指定则默认使用 Hive 中的 default 库。

# 查看 hive 中的所有数据库
hive> SHOW DATABASES;
# 创建 sqoop_test 数据库
hive> CREATE DATABASE sqoop_test;
# 备注版
sqoop import \
--connect jdbc:mysql://tcloud:3306/mysql \
--username root \
--password tcloud@2021 \
--table help_keyword \         
# 待导入的表  
--delete-target-dir \             
# 如果临时目录存在删除
--target-dir /sqoop_hive \      
# 临时目录位置
--hive-database sqoop_test \      
# 导入到Hive的sqoop_test数据库,库需要预先创建。不指定则默认为default库
--hive-import \                
# 导入到 Hive
--hive-overwrite \             
# 如果 Hive 表中有数据则覆盖,这会清除表中原有的数据,然后再写入
--bindir /usr/local/sqoop/lib/ \
-m 1                            
# 并行度

# 可执行版
sqoop import \
--connect jdbc:mysql://tcloud:3306/mysql \
--username root \
--password tcloud@2021 \
--table help_keyword \
--delete-target-dir \
--target-dir /sqoop_hive \
--hive-database sqoop_test \
--hive-import \
--hive-overwrite \
--bindir /usr/local/sqoop/lib/ \
-m 1
  • -hive-table emp指定在Hive中创建的表名为emp(默认数据库default)
  • -hive-table sqoop.emp指定在Hive中的sqoop数据库下创建emp表
  • -fields-terminated-by "\0001" 是设置每列之间的分隔符,"\0001"是ASCII码中的1,是hive的默认行内分隔符,而sqoop的默认行内分隔符为","
  • -lines-terminated-by "\n" 设置的是每行之间的分隔符,此处为换行符,也是默认的分隔符;
  1. 导入验证
    # 查看 sqoop_test 数据库的所有表
    hive> SHOW TABLES IN sqoop_test;
    # 查看表中数据
    hive> SELECT * FROM sqoop_test.help_keyword;
    
  2. 可能出现的问题

    # 如果执行报错  
    java.io.IOException: 
    java.lang.ClassNotFoundException: org.apache.hadoop.hive.conf.HiveConf
    # 则需将 Hive 安装目录下 lib 下的 hive-exec-**.jar 放到 ${SQOOP_HOME}/lib。
    
    # 查看
    [root@tcloud lib]# ll hive-exec-*
    -rw-rw-r-- 1 root root 41068549 Apr 15  2020 hive-exec-3.1.2.jar
    # 复制
    [root@tcloud lib]#cp hive-exec-3.1.2.jar ${SQOOP_HOME}/lib
    

    5.2 export

    由于 Hive 的数据是存储在 HDFS 上的,所以 Hive 导入数据到 MySQL,实际上就是 HDFS 导入数据到 MySQL。

  3. 查看Hive表在HDFS的存储位置

    # 进入对应的数据库
    hive> use sqoop_test;
    # 查看表信息
    hive> desc formatted help_keyword;
    # Location 属性为其存储位置 
    # hdfs://tcloud:8020/user/hive/warehouse/sqoop_test.db/help_keyword
    
  4. 执行导出命令

MySQL 中的表需要预先创建:

CREATE TABLE help_keyword_from_hive LIKE help_keyword ;
# 需要注意的是 hive 中默认的分隔符为 \001
sqoop export \
--connect jdbc:mysql://tcloud:3306/mysql \
--username root \
--password tcloud@2021 \
--table help_keyword_from_hive \
--export-dir /user/hive/warehouse/sqoop_test.db/help_keyword \
-input-fields-terminated-by '\001' \       
--bindir /usr/local/sqoop/lib/ \
-m 1

6.MySQL导入数据到HBase

HBase数据库暂时没有安装,这里是之前验证过的笔记,当前环境未验证。这里只举例从 RDBMS 导入数据到 HBase,因为暂时没有命令能够从 HBase 直接导出数据到RDBMS。

5.1 import

  1. 导入数据

导入的 HBase 表需要预先创建:

# 查看所有表
hbase> list
# 创建表
hbase> create 'help_keyword_hbase', 'keywordInfo'
# 查看表信息
hbase> desc 'help_keyword_hbase'

将 help_keyword 表中数据导入到 HBase 上的 help_keyword_hbase 表中,使用原表的主键 help_keyword_id 作为 RowKey ,原表的所有列都会在 keywordInfo 列族下,目前只支持全部导入到一个列族下,不支持分别指定列族。

# 备注版
sqoop import \
--connect jdbc:mysql://tcloud:3306/mysql \
--username root \
--password tcloud@2021 \
--table help_keyword \                    # 待导入的表
--hbase-table help_keyword_hbase \        # hbase 表名称,表需要预先创建
--column-family 'keywordInfo' \            # 所有列导入到 keywordInfo 列族下
--hbase-row-key help_keyword_id \        # 使用原表的 help_keyword_id 作为 RowKey
--bindir /usr/local/sqoop/lib/ \
-m 1

# 可执行版
sqoop import \
--connect jdbc:mysql://tcloud:3306/mysql \
--username root \
--password tcloud@2021 \
--table help_keyword \
--hbase-table help_keyword_hbase \
--column-family 'keywordInfo' \
--hbase-row-key help_keyword_id \
--bindir /usr/local/sqoop/lib/ \
-m 1
  1. 导入验证

使用 scan 查看表数据:

hbase(main):008:0> scan 'help_keyword_hbase'

7.总结

至此,Sqoop的核心导入导出举例完成,这次遇到的问题和之前的不同,不同环境下执行的情况有所不同,java.lang.ClassNotFoundException: Class tableName not found 的问题在此版本下未能彻底解决,希望知道如何解决的小伙伴儿们能不吝赐教 :pray:

目录
相关文章
|
4月前
|
SQL 关系型数据库 MySQL
Mysql数据恢复—Mysql数据库delete删除后数据恢复案例
本地服务器,操作系统为windows server。服务器上部署mysql单实例,innodb引擎,独立表空间。未进行数据库备份,未开启binlog。 人为误操作使用Delete命令删除数据时未添加where子句,导致全表数据被删除。删除后未对该表进行任何操作。需要恢复误删除的数据。 在本案例中的mysql数据库未进行备份,也未开启binlog日志,无法直接还原数据库。
|
9月前
|
关系型数据库 MySQL 大数据
大数据新视界--大数据大厂之MySQL 数据库课程设计:MySQL 数据库 SQL 语句调优的进阶策略与实际案例(2-2)
本文延续前篇,深入探讨 MySQL 数据库 SQL 语句调优进阶策略。包括优化索引使用,介绍多种索引类型及避免索引失效等;调整数据库参数,如缓冲池、连接数和日志参数;还有分区表、垂直拆分等其他优化方法。通过实际案例分析展示调优效果。回顾与数据库课程设计相关文章,强调全面认识 MySQL 数据库重要性。为读者提供综合调优指导,确保数据库高效运行。
|
11月前
|
存储 SQL 关系型数据库
服务器数据恢复—云服务器上mysql数据库数据恢复案例
某ECS网站服务器,linux操作系统+mysql数据库。mysql数据库采用innodb作为默认存储引擎。 在执行数据库版本更新测试时,操作人员误误将在本来应该在测试库执行的sql脚本在生产库上执行,导致生产库上部分表被truncate,还有部分表中少量数据被delete。
306 25
|
11月前
|
SQL 关系型数据库 MySQL
数据库数据恢复——MySQL简介和数据恢复案例
MySQL数据库数据恢复环境&故障: 本地服务器,安装的windows server操作系统。 操作系统上部署MySQL单实例,引擎类型为innodb,表空间类型为独立表空间。该MySQL数据库没有备份,未开启binlog。 人为误操作,在用Delete命令删除数据时未添加where子句进行筛选导致全表数据被删除,删除后未对该表进行任何操作。
|
存储 关系型数据库 MySQL
10个案例告诉你mysql不使用子查询的原因
大家好,我是V哥。上周与朋友讨论数据库子查询问题,深受启发。为此,我整理了10个案例,详细说明如何通过优化子查询提升MySQL性能。主要问题包括性能瓶颈、索引失效、查询优化器复杂度及数据传输开销等。解决方案涵盖使用EXISTS、JOIN、IN操作符、窗口函数、临时表及索引优化等。希望通过这些案例,帮助大家在实际开发中选择更高效的查询方式,提升系统性能。关注V哥,一起探讨技术,欢迎点赞支持!
591 5
|
消息中间件 关系型数据库 MySQL
ClickHouse如何整合数据源:MySQL、HDFS...
ClickHouse 是一个强大的列式数据库管理系统,支持多种数据源。常见的数据源包括外部数据源(如 HDFS、File、URL、Kafka 和 RabbitMQ)、数据库(如 MySQL 和 PostgreSQL)和流式数据(如 Stream 和 Materialized Views)。本文介绍了如何从 MySQL 和 HDFS 读取数据到 ClickHouse 中,包括创建数据库、映射表和查询数据的具体步骤。通过这些方法,用户可以方便地将不同来源的数据导入 ClickHouse 进行高效存储和分析。
918 3
|
关系型数据库 MySQL 数据库
数据库数据恢复—MYSQL数据库文件损坏的数据恢复案例
mysql数据库文件ibdata1、MYI、MYD损坏。 故障表现:1、数据库无法进行查询等操作;2、使用mysqlcheck和myisamchk无法修复数据库。
|
关系型数据库 MySQL 数据库
一个 MySQL 数据库死锁的案例和解决方案
本文介绍了一个 MySQL 数据库死锁的案例和解决方案。
838 3
|
存储 关系型数据库 MySQL
基于案例分析 MySQL 权限认证中的具体优先原则
【10月更文挑战第26天】本文通过具体案例分析了MySQL权限认证中的优先原则,包括全局权限、数据库级别权限和表级别权限的设置与优先级。全局权限优先于数据库级别权限,后者又优先于表级别权限。在权限冲突时,更严格的权限将被优先执行,确保数据库的安全性与资源合理分配。
229 4
|
4月前
|
缓存 关系型数据库 BI
使用MYSQL Report分析数据库性能(下)
使用MYSQL Report分析数据库性能
424 158