Solusi 1:
Jangan main-main dengan mysql db. Ada lebih banyak hal yang terjadi di sana daripada hanya tabel pengguna. Taruhan terbaik Anda adalah perintah "SHOW GRANTS FOR". Saya memiliki banyak alias pemeliharaan CLI dan fungsi di .bashrc saya (sebenarnya .bash_aliases saya yang saya sumber di .bashrc saya). Fungsi ini:
mygrants()
{
mysql -B -N [email protected] -e "SELECT DISTINCT CONCAT(
'SHOW GRANTS FOR \'', user, '\'@\'', host, '\';'
) AS query FROM mysql.user" | \
mysql [email protected] | \
sed 's/\(GRANT .*\)/\1;/;s/^\(Grants for .*\)/## \1 ##/;/##/{x;p;x;}'
}
Perintah mysql pertama menggunakan SQL untuk menghasilkan SQL yang valid yang disalurkan ke perintah mysql kedua. Outputnya kemudian disalurkan melalui sed untuk menambahkan komentar cantik.
[email protected] dalam perintah akan memungkinkan Anda untuk menyebutnya sebagai:mygrants --Host=prod-db1 --user=admin --password=secret
Anda dapat menggunakan kit alat unix lengkap Anda seperti ini:
mygrants --host=prod-db1 --user=admin --password=secret | grep rails_admin | mysql --host=staging-db1 --user=admin --password=secret
Itu adalah cara yang tepat untuk memindahkan pengguna. ACL MySQL Anda dimodifikasi dengan SQL murni.
Solusi 2:
Ada dua metode untuk mengekstraksi SQL Grants dari Instans MySQL
METODE #1
Anda dapat menggunakan pt-show-grants dari Percona Toolkit
MYSQL_CONN="-uroot -ppassword"
pt-show-grants ${MYSQL_CONN} > MySQLUserGrants.sql
METODE #2
Anda dapat meniru pt-show-grants
dengan yang berikut
MYSQL_CONN="-uroot -ppassword"
mysql ${MYSQL_CONN} --skip-column-names -A -e"SELECT CONCAT('SHOW GRANTS FOR ''',user,'''@''',host,''';') FROM mysql.user WHERE user<>''" | mysql ${MYSQL_CONN} --skip-column-names -A | sed 's/$/;/g' > MySQLUserGrants.sql
Metode mana pun akan menghasilkan dump SQL murni dari hibah MySQL. Yang harus dilakukan hanyalah menjalankan skrip di server baru:
mysql -uroot -p -A < MySQLUserGrants.sql
Cobalah !!!
Solusi 3:
Jawaban Richard Bronosky sangat berguna bagi saya. Terima kasih banyak!!!
Ini adalah variasi kecil yang berguna bagi saya. Sangat membantu untuk mentransfer pengguna, mis. antara dua instalasi Ubuntu yang menjalankan phpmyadmin. Buang saja hak istimewa untuk semua pengguna selain dari root, phpmyadmin dan debian-sys-maint. Maka kodenya adalah
mygrants()
{
mysql -B -N [email protected] -e "SELECT DISTINCT CONCAT(
'SHOW GRANTS FOR ''', user, '''@''', host, ''';'
) AS query FROM mysql.user WHERE user NOT IN ('root','phpmyadmin','debian-sys-maint')" | \
mysql [email protected] | \
sed 's/\(GRANT .*\)/\1;/;s/^\(Grants for .*\)/## \1 ##/;/##/{x;p;x;}'
}
Solusi 4:
Atau, gunakan percona-toolkit (sebelumnya maatkit) dan gunakan pt-show-grants
(atau mk-show-grants
) untuk alasan tersebut. Tidak perlu skrip rumit dan/atau prosedur tersimpan.
Solusi 5:
Anda dapat mysqldump database 'mysql' dan mengimpor ke yang baru; flush_privileges atau restart akan diperlukan dan Anda pasti ingin mencadangkan mysq db yang ada terlebih dahulu.
Untuk menghindari penghapusan hak istimewa Anda yang ada, pastikan untuk menambahkan, bukan mengganti baris di tabel hak istimewa (db, column_priv, host, func, dll.).