diff --git standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/tools/HiveSchemaHelper.java standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/tools/HiveSchemaHelper.java index 2da07a5929..84e2eb9e97 100644 --- standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/tools/HiveSchemaHelper.java +++ standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/tools/HiveSchemaHelper.java @@ -71,7 +71,7 @@ public static Connection getConnectionToMetastore(String userName, String passwo driver = driver == null ? getValidConfVar(MetastoreConf.ConfVars.CONNECTION_DRIVER, conf) : driver; if (printInfo) { logAndPrintToStdout("Metastore connection URL:\t " + url); - logAndPrintToStdout("Metastore Connection Driver :\t " + driver); + logAndPrintToStdout("Metastore connection Driver :\t " + driver); logAndPrintToStdout("Metastore connection User:\t " + userName); if (MetastoreConf.getBoolVar(conf, MetastoreConf.ConfVars.HIVE_IN_TEST)) { logAndPrintToStdout("Metastore connection Password:\t " + password); diff --git standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/tools/MetastoreSchemaTool.java standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/tools/MetastoreSchemaTool.java index 2fac79fa79..8828061571 100644 --- standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/tools/MetastoreSchemaTool.java +++ standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/tools/MetastoreSchemaTool.java @@ -69,6 +69,7 @@ protected String userName = null; protected URI[] validationServers = null; // The list of servers the database/partition/table can locate on protected boolean verbose = false; + protected boolean yes = false; protected SchemaToolCommandLine cmdLine; private static String homeDir; @@ -111,7 +112,7 @@ public void init(String metastoreHome, String[] args, OptionGroup additionalOpti this.metaStoreSchemaInfo = MetaStoreSchemaInfoFactory.get(conf, metastoreHome, dbType); // If the dbType is "hive", this is setting up the information schema in Hive. // We will set the default jdbc url and driver. - // It is overriden by command line options if passed (-url and -driver + // It is overridden by command line options if passed (-url and -driver) if (dbType.equalsIgnoreCase(HiveSchemaHelper.DB_HIVE)) { this.url = HiveSchemaHelper.EMBEDDED_HS2_URL; this.driver = HiveSchemaHelper.HIVE_JDBC_DRIVER; @@ -143,6 +144,9 @@ public void init(String metastoreHome, String[] args, OptionGroup additionalOpti if (cmdLine.hasOption("verbose")) { setVerbose(true); } + if (cmdLine.hasOption("yes")) { + setYes(true); + } if (cmdLine.hasOption("dbOpts")) { setDbOpts(cmdLine.getOptionValue("dbOpts")); } @@ -200,6 +204,14 @@ protected void setVerbose(boolean verbose) { this.verbose = verbose; } + public boolean isYes() { + return yes; + } + + public void setYes(boolean yes) { + this.yes = yes; + } + protected void setDbOpts(String dbOpts) { this.dbOpts = dbOpts; } @@ -437,6 +449,8 @@ public int run(String metastoreHome, String[] args, OptionGroup additionalOption task = new SchemaToolTaskMoveTable(); } else if (cmdLine.hasOption("createUser")) { task = new SchemaToolTaskCreateUser(); + } else if (cmdLine.hasOption("dropAllDatabases")) { + task = new SchemaToolTaskDrop(); } else { throw new HiveMetaException("No task defined!"); } @@ -456,10 +470,12 @@ public int run(String metastoreHome, String[] args, OptionGroup additionalOption logAndPrintToError("SQL Error code: " + ((SQLException) t).getErrorCode()); } } - if (cmdLine.hasOption("verbose")) { - e.printStackTrace(); - } else { - logAndPrintToError("Use --verbose for detailed stacktrace."); + if (cmdLine != null) { + if (cmdLine.hasOption("verbose")) { + e.printStackTrace(); + } else { + logAndPrintToError("Use --verbose for detailed stacktrace."); + } } logAndPrintToError("*** schemaTool failed ***"); return 1; diff --git standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/tools/SchemaToolCommandLine.java standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/tools/SchemaToolCommandLine.java index d2d0e66541..4188ca3c3e 100644 --- standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/tools/SchemaToolCommandLine.java +++ standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/tools/SchemaToolCommandLine.java @@ -48,6 +48,8 @@ private Options createOptions(OptionGroup additionalOptions) { .withDescription("Schema initialization to a version") .create("initSchemaTo"); Option initOrUpgradeSchemaOpt = new Option("initOrUpgradeSchema", "Initialize or upgrade schema to latest version"); + Option dropDbOpt = new Option("dropAllDatabases", "Drop all Hive databases (with CASCADE). This will remove all managed data!"); + Option yesOpt = new Option("yes", "Don't ask for confirmation when using -dropAllDatabases."); Option validateOpt = new Option("validate", "Validate the database"); Option createCatalog = OptionBuilder .hasArg() @@ -78,6 +80,7 @@ private Options createOptions(OptionGroup additionalOptions) { .addOption(upgradeOpt) .addOption(upgradeFromOpt) .addOption(initOpt) + .addOption(dropDbOpt) .addOption(initToOpt) .addOption(initOrUpgradeSchemaOpt) .addOption(validateOpt) @@ -186,6 +189,7 @@ private Options createOptions(OptionGroup additionalOptions) { options.addOption(hiveUserOpt); options.addOption(hivePasswdOpt); options.addOption(hiveDbOpt); + options.addOption(yesOpt); if (additionalOptions != null) options.addOptionGroup(additionalOptions); return options; @@ -277,6 +281,14 @@ private void validate() throws ParseException { (cl.hasOption("fromDatabase") || cl.hasOption("toDatabase"))) { printAndExit("fromDatabase and toDatabase may be set only for moveTable"); } + + if (cl.hasOption("dropAllDatabases") && !HiveSchemaHelper.DB_HIVE.equals(dbType)) { + printAndExit("dropAllDatabases can only be used with dbType=hive"); + } + + if (cl.hasOption("yes") && !cl.hasOption("dropAllDatabases")) { + printAndExit("yes can only be used with dropAllDatabases"); + } } private void printAndExit(String reason) throws ParseException { diff --git standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/tools/SchemaToolTaskDrop.java standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/tools/SchemaToolTaskDrop.java new file mode 100644 index 0000000000..6ba092e101 --- /dev/null +++ standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/tools/SchemaToolTaskDrop.java @@ -0,0 +1,123 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + *
+ * http://www.apache.org/licenses/LICENSE-2.0 + *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hadoop.hive.metastore.tools;
+
+import org.apache.hadoop.hive.metastore.HiveMetaException;
+import org.apache.hadoop.hive.metastore.Warehouse;
+
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Scanner;
+
+/**
+ * {@link SchemaToolTaskDrop} drops all data from Hive. It invokes DROP TABLE on all
+ * tables of the default database and DROP DATABASE CASCADE on all other databases.
+ */
+public class SchemaToolTaskDrop extends SchemaToolTask {
+
+ @Override
+ void setCommandLineArguments(SchemaToolCommandLine cl) {
+ // nothing to do here
+ }
+
+ @Override
+ void execute() throws HiveMetaException {
+ // Need to confirm unless it's a dry run or specified -yes
+ if (!schemaTool.isDryRun() && !schemaTool.isYes()) {
+ boolean confirmed = promptToConfirm();
+ if (!confirmed) {
+ System.out.println("Operation cancelled, exiting.");
+ return;
+ }
+ }
+
+ Connection conn = schemaTool.getConnectionToMetastore(true);
+ try {
+ try (Statement stmt = conn.createStatement()) {
+ final String def = Warehouse.DEFAULT_DATABASE_NAME;
+
+ // List databases
+ List