13

次のことを行うシェルスクリプトがあります

mysql -uuser -ppass -e "DROP DATABASE IF EXISTS database"

ただし、これを実行したい場合はプロンプトが表示されます [Y/N]。スクリプトでこれが必要なので、強制的に実行する方法はありますか? --forceドキュメントのオプションは、エラーのために停止しないことについて話しています。

編集:mysqlクライアントは実際にはプロンプトを生成しません。mysqladminプロンプトを生成していたクライアント呼び出しがあったことがわかりました。

4

3 に答える 3

20

MySQL クライアントではなく、シェル スクリプトが Y/N 応答を待っていることは明らかです。

コピー/貼り付けするだけで、行を直接実行できるはずです

mysql -uuser -ppass -e "DROP DATABASE IF EXISTS database"

Linux コマンド プロンプトで。

必要に応じて、このコマンドが表示される場所で、シェル スクリプトからの Y/N 応答をコメント アウトします。

私の次の提案は、my.cnf を調べることです。

[mysql]次のor[client]セクションがあるかどうかを確認します。

[mysql]
i-am-a-dummy
safe-updates

また

[client]
i-am-a-dummy
safe-updates

これらは実際のオプションです。MySQL ドキュメントのsafe-updates と i-am-a-dummyを参照してください。

更新 2013-01-25 16:48 EDT

次に推測するのは、オペレーティング システムです。どうして ???

として Linux にログインしている場合、rootまたは を実行sudoした場合は、DROP DATABASE IF EXISTS. OS レベルでは、mysqld はデータベースのフォルダーを破棄しようとします。

たとえば、datadir が/var/lib/mysqlで を実行するDROp DATABASE IF EXISTS rolando;と、mysqld は を実行しようとしますrm -rf /var/lib/mysql/rolando

rootそうでない場合、またはsudoそうでない場合はroot、OSがそのメッセージをエコーすることを期待しています。実際、root としてログインしていない状態で PID ファイルを削除しようとすると、OS から PID ファイルの削除を求めるメッセージが表示されるのを見たことがありますservice mysql stop

更新 2013-01-25 16:54 EDT

パスワードを除いて、 mysqladminもプロンプトを表示しません。すべてのオプションは次のとおりです。

[root@***]# mysqladmin --help
mysqladmin  Ver 8.42 Distrib 5.1.47, for redhat-linux-gnu on x86_64
Copyright 2000-2008 MySQL AB, 2008 Sun Microsystems, Inc.
This software comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to modify and redistribute it under the GPL license

Administration program for the mysqld daemon.
Usage: mysqladmin [OPTIONS] command command....
  -c, --count=#       Number of iterations to make. This works with -i
                      (--sleep) only.
  --debug-check       Check memory and open file usage at exit.
  --debug-info        Print some debug info at exit.
  -f, --force         Don't ask for confirmation on drop database; with
                      multiple commands, continue even if an error occurs.
  -C, --compress      Use compression in server/client protocol.
  --character-sets-dir=name
                      Directory for character set files.
  --default-character-set=name
                      Set the default character set.
  -?, --help          Display this help and exit.
  -h, --host=name     Connect to host.
  -b, --no-beep       Turn off beep on error.
  -p, --password[=name]
                      Password to use when connecting to server. If password is
                      not given it's asked from the tty.
  -P, --port=#        Port number to use for connection or 0 for default to, in
                      order of preference, my.cnf, $MYSQL_TCP_PORT,
                      /etc/services, built-in default (3306).
  --protocol=name     The protocol to use for connection (tcp, socket, pipe,
                      memory).
  -r, --relative      Show difference between current and previous values when
                      used with -i. Currently only works with extended-status.
  -O, --set-variable=name
                      Change the value of a variable. Please note that this
                      option is deprecated; you can set variables directly with
                      --variable-name=value.
  -s, --silent        Silently exit if one can't connect to server.
  -S, --socket=name   The socket file to use for connection.
  -i, --sleep=#       Execute commands repeatedly with a sleep between.
  --ssl               Enable SSL for connection (automatically enabled with
                      other flags). Disable with --skip-ssl.
  --ssl-ca=name       CA file in PEM format (check OpenSSL docs, implies
                      --ssl).
  --ssl-capath=name   CA directory (check OpenSSL docs, implies --ssl).
  --ssl-cert=name     X509 cert in PEM format (implies --ssl).
  --ssl-cipher=name   SSL cipher to use (implies --ssl).
  --ssl-key=name      X509 key in PEM format (implies --ssl).
  --ssl-verify-server-cert
                      Verify server's "Common Name" in its cert against
                      hostname used when connecting. This option is disabled by
                      default.
  -u, --user=name     User for login if not current user.
  -v, --verbose       Write more information.
  -V, --version       Output version information and exit.
  -E, --vertical      Print output vertically. Is similar to --relative, but
                      prints output vertically.
  -w, --wait[=#]      Wait and retry if connection is down.
  --connect_timeout=#
  --shutdown_timeout=#

ねえ、私は正しい立場にいます

--forceDROP DATABASE のプロンプトを表示します

OK、犯人を特定したと思います。mysqladmin私はデータベースを削除するのに慣れていないので、今日何かを学びました。

于 2013-01-25T21:18:52.173 に答える
9

コマンドに「はい」をパイプする必要があるかもしれません。このサイトでは、これを行う方法についてのアイデアを提供しています。

yes | mysqladmin -u[username] -p[password] drop [database]

しかし、ここに別のしわがありますこの投稿.

mysqladmin -u[username] -p[password] -f drop [database]
于 2013-01-25T21:22:46.857 に答える
1

一般に、-eオプションを使用すると、シェルからmysqlに任意のクエリを渡すことができます。

mysql -u username -ppassword -D dbname -e "DROP DATABASE" 

または、パスワードをmy.cnfに保存することもできますが、安全性は低くなります。

[client]
host     = localhost
user     = username.
password = password
socket   = /var/lib/mysql/mysql.sock
于 2013-01-25T21:30:26.620 に答える