HIVE安装配置

网友投稿 748 2022-05-29

安装和配置

您可以通过下载tarball来安装Hive的稳定版本,或者下载源代码来构建Hive。

要求

Java 1.7

注意:  Hive版本  1.2  以后需要Java 1.7或更新版本。Hive版本0.14到1.1也适用于Java 1.6。强烈建议用户开始使用Java 1.8(请参阅  HIVE-8607)。

Hadoop 2.x(首选),1.x(不支持Hive 2.0.0以上版本)。

Hive版本0.13也支持Hadoop 0.20.x,0.23.x.

Hive常用于生产Linux和Windows环境。Mac是一个常用的开发环境。本文档中的说明适用于Linux和Mac。在Windows上使用它需要稍微不同的步骤。

安装稳定版本

首先从其中一个Apache下载镜像下载最新的Hive稳定版本(请参阅Hive发行版)。

接下来,你需要解压tarball。这会创建一个名为hive-x.y.z (其中x.y.z是版本号)的子目录:

$ tar -xzvf hive-x.y.z.tar.gz

将环境变量设置HIVE_HOME为指向安装目录:

$ cd hive-x.y.z   $ export HIVE_HOME={{pwd}}

最后,添加$HIVE_HOME/bin到您的PATH:

$ export PATH=$HIVE_HOME/bin:$PATH

从源代码构建Hive

最新Hive代码的GIT存储库位置:git clone [https://git-wip-us.apache.org/repos/asf/hive.git](https://git-wip-us.apache.org/repos/asf/hive.git)

(  主分支)。

所有发布版本都位于名为“branch-0.#”或“branch-1.#”或即将推出的“branch-2.#”的分支中,但版本0.8.1在“branch-0.8-r2 ”。任何具有其他名称的分支都是正在进行中的功能分支。有关 详细信息,请参阅  了解Hive分支。

从0.13开始,Hive使用Apache Maven构建。

要从主分支构建当前的Hive代码,请执行以下操作:

$ git clone https://git-wip-us.apache.org/repos/asf/hive.git   $ cd hive   $ mvn clean package -Pdist   $ cd packaging/target/apache-hive-{version}-SNAPSHOT-bin/apache-hive-{version}-SNAPSHOT-bin   $ ls   LICENSE   NOTICE   README.txt   RELEASE_NOTES.txt   bin/ (all the shell scripts)   lib/ (required jar files)   conf/ (configuration files)   examples/ (sample input and query files)   hcatalog / (hcatalog installation)   scripts / (upgrade scripts for hive-metastore)

这里{version} 指的是当前的Hive版本。

如果使用Maven(mvn)构建Hive源代码,对于文中其他部分,我们将"/packaging/target/apache-hive-{version}-SNAPSHOT-bin/apache-hive-{version}-SNAPSHOT-bin"目录作为  

参考: https://cwiki.apache.org/confluence/display/Hive/GettingStarted

运行Hive

Hive使用Hadoop,因此:

您必须在您的路径中安装Hadoop

export HADOOP_HOME=

另外, 在Hive中创建表之前,您必须使用以下HDFS命令来创建/tmp并/user/hive/warehouse(hive.metastore.warehouse.dir设置)并设置它们chmod g+w。

$ $HADOOP_HOME/bin/hadoop fs -mkdir       /tmp   $ $HADOOP_HOME/bin/hadoop fs -mkdir       /user/hive/warehouse   $ $HADOOP_HOME/bin/hadoop fs -chmod g+w   /tmp   $ $HADOOP_HOME/bin/hadoop fs -chmod g+w   /user/hive/warehouse

您可能会发现它很有用,尽管没有必要设置HIVE_HOME:

$ export HIVE_HOME=

要从shell中使用Hive 命令行界面(CLI),请执行以下操作:

$ $HIVE_HOME/bin/hive

从Hive 2.1开始,我们需要运行下面的schematool命令作为初始化步骤。例如,我们可以使用“derby”作为db类型。

$ $HIVE_HOME/bin/schematool -dbType  -initSchema

HiveServer2(在Hive 0.11中引入)有自己CLI的称为Beeline  。由于HiveCLI缺乏HiveServer2的多用户,安全性和其他功能,现在不推荐使用HiveCLI来支持Beeline。从shell运行HiveServer2和Beeline:

$ $HIVE_HOME/bin/hiveserver2   $ $HIVE_HOME/bin/beeline -u jdbc:hive2://$HS2_HOST:$HS2_PORT

Beeline从HiveServer2的JDBC URL启动,这取决于HiveServer2启动的地址和端口。默认情况下,它将是(localhost:10000),所以地址将看起来像jdbc:hive2://localhost:10000。

或者为了测试目的在同一进程中启动Beeline和HiveServer2,为HiveCLI提供类似的用户体验:

$ $HIVE_HOME/bin/beeline -u jdbc:hive2://

HIVE安装和配置

要在Hive 0.11.0及更高版本的shell中运行HCatalog服务器,请执行以下操作:

$ $HIVE_HOME/hcatalog/sbin/hcat_server.sh

要在Hive发行版0.11.0和更高版本中使用HCatalog命令行界面(CLI):

$ $HIVE_HOME/hcatalog/bin/hcat

有关更多信息,请参阅HCatalog手册中的从Tarball 安装 HCatalog 和HCatalog CLI

要从Hive发行版0.11.0和更高版本中的shell运行WebHCat服务器,请执行以下操作:

$ $HIVE_HOME/hcatalog/sbin/webhcat_server.sh

有关更多信息,请参阅WebHCat手册中的WebHCat 安装。

配置管理概述

Hive默认配置 /conf/hive-default.xml

Hive配置目录的位置可以通过设置HIVE_CONF_DIR环境变量来更改。

配置变量可以通过(重新)定义来改变 /conf/hive-site.xml

Log4j配置存储在 /conf/hive-log4j.properties

Hive配置是Hadoop之上的重叠 - 它默认继承Hadoop配置变量。

Hive配置可以通过以下操作来控制:

编辑hive-site.xml并在其中定义任何需要的变量(包括Hadoop变量)

使用set命令(请参阅下一节)

使用以下语法调用Hive(不建议使用),Beeline或HiveServer2:

$ bin/hive --hiveconf x1=y1 --hiveconf x2=y2  //this sets the variables x1 and x2 to y1 and y2 respectively $ bin/hiveserver2 --hiveconf x1=y1 --hiveconf x2=y2  //this sets server-side variables x1 and x2 to y1 and y2 respectively $ bin/beeline --hiveconf x1=y1 --hiveconf x2=y2  //this sets client-side variables x1 and x2 to y1 and y2 respectively.

*   将`HIVE_OPTS`环境变量设置为“ `--hiveconf x1=y1 --hiveconf x2=y2`”,其与上述相同。

运行时配置

Hive查询是使用map-reduce查询执行的,因此查询的行为可以通过Hadoop配置变量来控制。

HiveCLI(不建议使用)和Beeline命令'SET'可用于设置任何Hadoop(或Hive)配置变量。例如:

beeline> SET mapred.job.tracker=myhost.mycompany.com:50030;     beeline> SET -v;

后者显示所有当前设置。没有-v选项,只显示与基础Hadoop配置不同的变量。

Hive,Map-Reduce和Local-Mode

Hive编译器为大多数查询生成map-reduce作业。这些作业然后被提交给由变量指示的Map-Reduce集群:

mapred.job.tracker

虽然这通常指向具有多个节点的map-reduce集群,但Hadoop也提供了一个选项,可在用户的工作站上本地运行map-reduce作业。这对于在小数据集上运行查询可能非常有用 - 在这种情况下,本地模式执行通常比将作业提交到大型集群要快得多。 相反,本地模式只能用一个reducer运行,并且可能会非常缓慢地处理较大的数据集。

从0.7版开始,Hive完全支持本地模式执行。要启用此功能,用户可以启用以下选项:

hive> SET mapreduce.framework.name=local;

另外,mapred.local.dir应该指向在本地机器上有效的路径(例如/tmp//mapred/local)。(否则,用户将得到分配本地磁盘空间的例外。)

从0.7版开始,Hive还支持一种模式,可以自动在本地模式下运行map-reduce作业。相关的选项有hive.exec.mode.local.auto,hive.exec.mode.local.auto.inputbytes.max和hive.exec.mode.local.auto.tasks.max:

hive> SET hive.exec.mode.local.auto=false;

请注意,此功能默认处于禁用状态。如果启用,Hive会分析查询中每个map-reduce作业的大小,并且如果满足以下阈值,则可以在本地运行它:

作业的总输入大小低于:(hive.exec.mode.local.auto.inputbytes.max默认为128MB)

map任务总数小于:(hive.exec.mode.local.auto.tasks.max默认为4)

所需的reduce 任务总数为1或0。

因此,对于小数据集的查询,或者对于多个map-reduce作业的查询(其中后续作业的输入显着更小)(因为先前作业中的reduction/filtering),作业可以在本地运行。

请注意,Hadoop服务器节点的运行时环境和运行Hive客户端的机器(由于不同的jvm版本或不同的软件库)可能存在差异。在本地模式下运行时,这可能会导致意外的行为/错误。还要注意,本地模式执行是在一个单独的,子jvm(Hive客户端)中完成的。如果用户愿意,可以通过该选项来控制此子jvm的最大内存量hive.mapred.local.mem。默认情况下,它被设置为零,在这种情况下,Hive让Hadoop确定子jvm的默认内存限制。

配置日志

Hive使用log4j进行日志记录。默认情况下,日志不会通过CLI发送到控制台。默认日志记录级别WARN适用于0.13.0之前的Hive发行版。从Hive 0.13.0开始,默认日志记录级别为INFO。

日志存储在以下目录中:/tmp/<*user.name*>

/tmp/<*user.name*>/hive.log

注意:在本地模式下,在Hive 0.13.0之前,日志文件名是“ .log”而不是“ hive.log”。该错误在0.13.0版本中得到修复(参见HIVE-5528和HIVE-5676)。

要配置不同的日志位置,请 在$ HIVE_HOME / conf / hive-log4j.properties中进行 hive.log.dir设置。确保目录的权限已设置为 chmod 1777

hive.log.dir=**

如果用户希望,可以通过添加下面显示的参数将日志发送到控制台:

bin/hive --hiveconf hive.root.logger=INFO,console //for HiveCLI (deprecated)

bin/hiveserver2 --hiveconf hive.root.logger=INFO,console

或者,用户通过使用以下命令来更改日志记录级别:

bin/hive --hiveconf hive.root.logger=INFO,DRFA //for HiveCLI (deprecated)

bin/hiveserver2 --hiveconf hive.root.logger=INFO,DRFA

日志的另一种选择是TimeBasedRollingPolicy(适用于Hive 1.1.0及更高版本,HIVE-9001),方法是提供DAILY选项,如下所示:

bin/hive --hiveconf hive.root.logger=INFO,DAILY //for HiveCLI (deprecated)

bin/hiveserver2 --hiveconf hive.root.logger=INFO,DAILY

请注意,hive.root.logger通过'set'命令进行设置不会更改日志记录属性,因为它们是在初始化时确定的。

Hive还将查询日志存储在每个Hive会话中/tmp//,但可以使用属性在hive-site.xml中配置 hive.querylog.location。从Hive 1.1.0开始,查询的EXPLAIN EXTENDED输出可以通过将 hive.log.explain.output 属性设置为true 来记录在INFO级别  。

Hadoop集群上,Hive执行期间的日志记录由Hadoop配置控制。通常,Hadoop将为每个映射生成一个日志文件,并减少存储在执行任务的群集机器上的任务。日志文件可通过点击Hadoop JobTracker Web UI中的“任务详细信息”页面获取。

在使用本地模式(使用mapreduce.framework.name=local)时,Hadoop / Hive执行日志将在客户端计算机上生成。从版本0.6开始 - Hive使用hive-exec-log4j.properties(hive-log4j.properties仅在缺失时回退)来确定默认情况下这些日志的传输位置。默认配置文件为每个在本地模式下执行的查询生成一个日志文件并将其存储在下/tmp/。提供单独配置文件的目的是为了使管理员能够根据需要集中执行日志捕获(例如在NFS文件服务器上)。执行日志对调试运行时错误非常有用。

有关WebHCat错误和日志记录的信息,请参阅WebHCat手册中的错误代码和响应以及日志文件。

错误日志对调试问题非常有用。请将任何错误(其中有很多!)发送给他们hive-dev@hadoop.apache.org。

从Hive 2.1.0开始(  HIVE-13027),Hive默认使用Log4j2的异步记录器。将hive.async.log.enabled设置为false将禁用异步日志记录并回退到同步日志记录。异步日志记录可以显着提高性能,因为日志记录将在使用LMAX干扰程序队列缓冲日志消息的单独线程中处理。 有关优点和缺点,请参阅https://logging.apache.org/log4j/2.x/manual/async.html。

HiveServer2操作日志适用于从Hive 0.14开始的客户端。请参阅HiveServer2日志记录以进行配置。

对于每个Metastore API调用,都会从Hive Metastore服务器记录审核日志。

审核日志记录功能和一些相关功能参数。它记录在log4j的INFO级别,因此您需要确保INFO级别的日志记录已启用(请参阅HIVE-3505 )。日志条目的名称是“HiveMetaStore.audit”。

在Hive 0.7中为安全客户端连接(HIVE-1948 )和Hive 0.10为非安全连接(HIVE-3277 ;也参见HIVE-2797 )添加了审计日志。

为了通过PerfLogger获得性能指标,您需要为PerfLogger类(HIVE-12675 )设置DEBUG级日志记录。这可以通过在log4j属性文件中设置以下内容来实现。

log4j.logger.org.apache.hadoop.hive.ql.log.PerfLogger=DEBUG

如果记录器级别已通过hive.root.logger设置为根目录下的DEBUG,则上述设置不需要。

DDL操作

Hive数据定义语言 中记录了 Hive DDL操作。

创建Hive表

hive> CREATE TABLE pokes (foo INT, bar STRING);

创建一个名为pokes的表,有两列,第一个是整数,另一个是字符串。

hive> CREATE TABLE invites (foo INT, bar STRING) PARTITIONED BY (ds STRING);

创建一个名为invites的表,其中包含两列和一个名为ds的分区列。分区列是虚拟列。它不是数据本身的一部分,而是从特定数据集加载到的分区派生而来。

默认情况下,表假定为文本输入格式,分隔符假定为^ A(ctrl-a)。

浏览表格

hive> SHOW TABLES;

列出了所有的表格。

hive> SHOW TABLES '.*s';

列出以's'结尾的所有表格。模式匹配遵循Java正则表达式。查看文档http://java.sun.com/javase/6/docs/api/java/util/regex/Pattern.html的链接。

hive> DESCRIBE invites;

显示列的列表。

更改和删除表格

表名可以更改,列可以添加或替换:

hive> ALTER TABLE events RENAME TO 3koobecaf;   hive> ALTER TABLE pokes ADD COLUMNS (new_col INT);   hive> ALTER TABLE invites ADD COLUMNS (new_col2 INT COMMENT 'a comment');   hive> ALTER TABLE invites REPLACE COLUMNS (foo INT, bar STRING, baz INT COMMENT 'baz replaces new_col2');

请注意,REPLACE COLUMNS将替换所有现有的列,并仅更改表的schema,而不是数据。该表必须使用本地SerDe。REPLACE COLUMNS也可用于从表格模式中删除列:

hive> ALTER TABLE invites REPLACE COLUMNS (foo INT COMMENT 'only keep the first column');

Drop tables :

hive> DROP TABLE pokes;

元数据存储

元数据位于嵌入式Derby数据库中,其磁盘存储位置由Hive配置变量javax.jdo.option.ConnectionURL。默认情况下这个位置是./metastore_db(见conf/hive-default.xml)。

目前,在默认配置中,此元数据一次只能由一个用户看到。

Metastore可以存储在任何由JPOX支持的数据库中。位置和RDBMS的类型可以通过两个变量来控制javax.jdo.option.ConnectionURL和javax.jdo.option.ConnectionDriverName。有关支持的数据库的更多详细信息,请参阅JDO(或JPOX)文档。数据库模式在JDO元数据注释文件package.jdo中定义src/contrib/hive/metastore/src/model。

在将来,Metastore本身可以是一个独立的服务器。

如果要将Metastore作为网络服务器运行,以便可以从多个节点访问它,请参阅Hive在服务器模式下使用Derby。

DML操作

Hive数据操作语言中记录了Hive DML操作。

将文件中的数据加载到Hive中:

hive> LOAD DATA LOCAL INPATH './examples/files/kv1.txt' OVERWRITE INTO TABLE pokes;

将包含由ctrl-a分隔的两列的文件加载到pokes表中。'LOCAL'表示输入文件在本地文件系统上。如果'LOCAL'被省略,那么它会在HDFS中查找该文件。

关键字'覆盖'表示表中的现有数据被删除。如果忽略'OVERWRITE'关键字,则将数据文件附加到现有数据集。

注意:

加载命令不执行对模式的数据验证。

如果文件位于hdfs中,则将其移入Hive控制的文件系统名称空间。

Hive目录的根目录由选项指定hive.metastore.warehouse.dir在hive-default.xml。我们建议用户在尝试通过Hive创建表之前创建该目录。

hive> LOAD DATA LOCAL INPATH './examples/files/kv2.txt' OVERWRITE INTO TABLE invites PARTITION (ds='2008-08-15');   hive> LOAD DATA LOCAL INPATH './examples/files/kv3.txt' OVERWRITE INTO TABLE invites PARTITION (ds='2008-08-08');

上面的两个LOAD语句将数据加载到表invites的两个不同分区中。表必须创建为按键ds分区才能成功。

hive> LOAD DATA INPATH '/user/myname/kv2.txt' OVERWRITE INTO TABLE invites PARTITION (ds='2008-08-15');

上述命令会将数据从HDFS文件/目录加载到表中。

请注意,从HDFS加载数据将导致移动文件/目录。因此,该操作几乎是即时的。

SQL操作

选择中记录了Hive查询操作。

示例查询

下面显示了一些示例查询。他们在build/dist/examples/queries目录下。

更多可在Hive资源中找到ql/src/test/queries/positive。

hive> SELECT a.foo FROM invites a WHERE a.ds='2008-08-15';

从ds=2008-08-15该invites表的所有分区行中选择'foo'列。结果不存储在任何地方,但显示在控制台上。

请注意,在随后的所有示例中INSERT(可以插入Hive表,本地目录或HDFS目录)都是可以的。

hive> INSERT OVERWRITE DIRECTORY '/tmp/hdfs_out' SELECT a.* FROM invites a WHERE a.ds='2008-08-15';

从表的分区ds=2008-08-15中选择所有行invites到HDFS目录中。结果数据在该目录中的文件中(取决于映射器的数量)。

注:如果使用*选择分区列。它们也可以在投影子句中指定。

分区表必须始终WHERE在语句的子句中选择一个分区。

hive> INSERT OVERWRITE LOCAL DIRECTORY '/tmp/local_out' SELECT a.* FROM pokes a;

从pokes表中选择所有行到本地目录。

hive> INSERT OVERWRITE TABLE events SELECT a.* FROM profiles a;   hive> INSERT OVERWRITE TABLE events SELECT a.* FROM profiles a WHERE a.key < 100;   hive> INSERT OVERWRITE LOCAL DIRECTORY '/tmp/reg_3' SELECT a.* FROM events a;   hive> INSERT OVERWRITE DIRECTORY '/tmp/reg_4' select a.invites, a.pokes FROM profiles a;   hive> INSERT OVERWRITE DIRECTORY '/tmp/reg_5' SELECT COUNT(*) FROM invites a WHERE a.ds='2008-08-15';   hive> INSERT OVERWRITE DIRECTORY '/tmp/reg_5' SELECT a.foo, a.bar FROM invites a;   hive> INSERT OVERWRITE LOCAL DIRECTORY '/tmp/sum' SELECT SUM(a.pc) FROM pc1 a;

选择一列的sum。avg, min, or max 也可以使用。请注意,对于不包含HIVE-287的Hive版本,您需要使用COUNT(1)代替COUNT(*)。

hive> FROM invites a INSERT OVERWRITE TABLE events SELECT a.bar, count(*) WHERE a.foo > 0 GROUP BY a.bar;  hive> INSERT OVERWRITE TABLE events SELECT a.bar, count(*) FROM invites a WHERE a.foo > 0 GROUP BY a.bar;

请注意,对于不包含HIVE-287的Hive版本,您需要使用COUNT(1)代替COUNT(*)。

hive> FROM pokes t1 JOIN invites t2 ON (t1.bar = t2.bar) INSERT OVERWRITE TABLE events SELECT t1.bar, t1.foo, t2.foo;

FROM src   INSERT OVERWRITE TABLE dest1 SELECT src.* WHERE src.key < 100   INSERT OVERWRITE TABLE dest2 SELECT src.key, src.value WHERE src.key >= 100 and src.key < 200   INSERT OVERWRITE TABLE dest3 PARTITION(ds='2008-04-08', hr='12') SELECT src.key WHERE src.key >= 200 and src.key < 300   INSERT OVERWRITE LOCAL DIRECTORY '/tmp/dest4.out' SELECT src.value WHERE src.key >= 300;

hive> FROM invites a INSERT OVERWRITE TABLE events SELECT TRANSFORM(a.foo, a.bar) AS (oof, rab) USING '/bin/cat' WHERE a.ds > '2008-08-09';

在映射阶段通过脚本/bin/cat流式传输数据(如Hadoop流式传输)。

同样,流式传输可以用在reduce方面(请参阅Hive教程以获得示例)。

简单的示例用例

MovieLens用户评级

首先,用制表符分隔的文本文件格式创建一个表格:

CREATE TABLE u_data (   userid INT,   movieid INT,   rating INT,   unixtime STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'STORED AS TEXTFILE;

然后,从下载数据文件MovieLens 100K的上GroupLens数据集页(其中也有一个readme.txt文件,并解压缩文件索引):

wget http://files.grouplens.org/datasets/movielens/ml-100k.zip

要么:

curl --remote-name http://files.grouplens.org/datasets/movielens/ml-100k.zip

注意:如果到GroupLens数据集的链接   不起作用,请报告HIVE-5341或发送邮件到user@hive.apache.org邮件列表。

解压缩数据文件:

unzip ml-100k.zip

并加载u.data到刚刚创建的表中:

LOAD DATA LOCAL INPATH '/u.data'OVERWRITE INTO TABLE u_data;

计算表u_data中的行数:

SELECT COUNT(*) FROM u_data;

请注意,对于不包含HIVE-287的旧版Hive ,您需要使用COUNT(1)来代替COUNT(*)。

现在我们可以在表格上进行一些复杂的数据分析u_data:

创建weekday_mapper.py:

import sysimport datetimefor line in sys.stdin:   line = line.strip()   userid, movieid, rating, unixtime = line.split('\t')   weekday = datetime.datetime.fromtimestamp(float(unixtime)).isoweekday()   print '\t'.join([userid, movieid, rating, str(weekday)])

使用映射器脚本:

CREATE TABLE u_data_new (   userid INT,   movieid INT,   rating INT,   weekday INT) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'; add FILE weekday_mapper.py; INSERT OVERWRITE TABLE u_data_new SELECT   TRANSFORM (userid, movieid, rating, unixtime)   USING 'python weekday_mapper.py'   AS (userid, movieid, rating, weekday) FROM u_data; SELECT weekday, COUNT(*) FROM u_data_new GROUP BY weekday;

请注意,如果你使用的蜂巢0.5.0或更早的版本,你需要使用COUNT(1)的地方COUNT(*)。

Apache Weblog数据

Apache weblog的格式是可定制的,而大多数网站管理员使用默认格式。

对于默认的Apache Weblog,我们可以使用以下命令创建一个表。

有关RegexSerDe的更多信息,请参阅HIVE-662和HIVE-1719。

CREATE TABLE apachelog (   host STRING,   identity STRING,   user STRING,   time STRING,   request STRING,   status STRING,   size STRING,   referer STRING,   agent STRING) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'WITH SERDEPROPERTIES (  "input.regex" = "([^]*) ([^]*) ([^]*) (-|\\[^\\]*\\]) ([^ \"]*|\"[^\"]*\") (-|[0-9]*) (-|[0-9]*)(?: ([^ \"]*|\".*\") ([^ \"]*|\".*\"))?") STORED AS TEXTFILE;

Hive

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Flink状态与容错介绍
下一篇:【云驻共创】华为云数据库之数据库原理及应用课程11、数据库系统控制
相关文章