Dari skrip shell, bagaimana saya bisa mengecek apakah ada database MySQL?

23

mysqladmin -uroot create foomengembalikan status keluar 1 jika fooada, dan 0 sebaliknya, tetapi tentu saja itu juga akan membuat database jika belum ada. Apakah ada cara mudah untuk mengecek apakah ada database?

ithinkihaveacat
sumber

Jawaban:

43

Saya menyadari ini telah dijawab sejak lama, tetapi tampaknya jauh lebih bersih bagi saya untuk melakukan ini:

mysql -u root -e 'use mydbname'

Jika database ada, ini tidak akan menghasilkan output dan keluar dengan returncode == 0.

Jika database tidak ada, ini akan menghasilkan pesan kesalahan pada stderr dan keluar dengan returncode == 1. Jadi Anda akan melakukan sesuatu seperti ini:

if ! mysql -u root -e 'use mydbname'; then
  ...do stuff to create database...
fi

Ini beroperasi dengan baik dengan skrip shell, tidak memerlukan pemrosesan output, dan tidak bergantung pada memiliki akses sistem file lokal.

larsks
sumber
1
Bagi siapa pun yang mungkin ingin menekan pesan kesalahan, coba ini (tentu saja, pertimbangkan untuk mengeluarkan kata sandi Anda demi keamanan): if! mysql -u <user> -p <pw> -e 'gunakan <db name>' 2> / dev / null; lalu mysql -u <user> -p <pw> -e 'BUAT DATABASE <db name>;'; fi
Peter Mark
10

mysql -e "SHOW DATABASES LIKE 'foo'" harus membantumu.

http://dev.mysql.com/doc/refman/5.1/id/show-databases.html

Dom
sumber
5
Terima kasih. Dengan beberapa opsi baris perintah mengintegrasikan lebih baik ke dalam skrip shell: mysql --batch --skip-column-names -e "SHOW DATABASES LIKE 'foo'" | grep foo.
ithinkihaveacat
7

Database di MySQL adalah folder di sistem file. Itu membuatnya sangat mudah untuk menemukan apakah ada database:

test -d "/var/lib/mysql/databasename"

Dalam hal ini, /var/libadalah datadir MySQL. Yang menyenangkan tentang cuplikan ini adalah tidak perlu menjalankan daemon MySQL, juga tidak memerlukan kredensial. Tentu saja pengguna yang menjalankan perintah harus diizinkan masuk ke direktori itu.

Lekensteyn
sumber
6

Dari http://www.jbmurphy.com/2011/02/08/quick-check-if-a-mysql-database-exists/ ini lebih mirip dengan yang saya inginkan:

DBNAME="dblookingfor"
DBEXISTS=$(mysql --batch --skip-column-names -e "SHOW DATABASES LIKE '"$DBNAME"';" | grep "$DBNAME" > /dev/null; echo "$?")
if [ $DBEXISTS -eq 0 ];then
    echo "A database with the name $DBNAME already exists."
else
    echo " database $DBNAME does not exist."
fi
Rob Barreca
sumber
cara sempurna untuk memeriksanya.
Mani
2

Agak macet, tetapi ini akan mencetak 1 jika foo tidak ada, 0 sebaliknya:

mysqlshow -u root foo 2>&1 >/dev/null | awk ' { print /Unknown database/ }'
Donald
sumber
2

Saya pikir Anda dapat memeriksa apakah database yang dibutuhkan Anda bekerja secara sederhana di shell apa pun

mysql -uUSERNAME -pPASSWORD DATABASE -e exit

dan kemudian periksa $?kode keluar

Perintah ini mencoba kredensial spesifik Anda (USERNAME dan PASSWORD) untuk terhubung ke DATABASE yang dipilih dan exitsegera. Jadi, jika koneksi ok exitcode akan menjadi 0, dan bukan nol sebaliknya.

Tentu saja, Anda dapat mengarahkan output apa pun ke /dev/nulljika diperlukan

PS. Metode ini sangat berguna untuk memeriksa kesehatan penyimpanan sementara yang begitu cepat dan populer di zaman kita. Jika basis data tidak dapat terhubung, Anda harus mulai memulihkan secepatnya.

Wile E.
sumber