Bagaimana cara menyalin hak pengguna dengan MySQL?

12

Saya memiliki instalasi MySQL dengan banyak basis data dan pengguna yang harus saya migrasi ke instalasi MySQL baru. Saya dapat menggunakan phpMyAdmin untuk mengekspor kemudian mengimpor database / tabel, tetapi saya tidak tahu apa-apa untuk memindahkan pengguna dan izin. Bagaimana saya bisa melakukan ini dengan mudah?

Nathan Osman
sumber

Jawaban:

17

Sebuah skrip seperti ini akan menggunakan klien cli mysql untuk mencetak serangkaian pernyataan hibah yang perlu Anda gunakan untuk membuat ulang akun pengguna. Perintah ini akan bekerja paling baik jika kredensial basis data Anda tersimpan di dalam .my.cnf Anda

#!/bin/bash
# adapted from (http://www.pyrosoft.co.uk/blog/2006/10/18/show-grants-for-all-users-on-mysql/)
(
 mysql --batch --skip-column-names -e "SELECT user, host FROM user" mysql 
) | while read user host
do
  echo "# $user @ $host"
  mysql --batch --skip-column-names -e"SHOW GRANTS FOR '$user'@'$host'"
done

Jika Anda melompat dari satu versi mysql ke versi lain, Anda mungkin ingin menggunakan ini alih-alih hanya membuang dari database mysql. Skema database mysql terkadang diperbarui.

Ini juga akan memungkinkan Anda untuk memilih dan memilih akun yang ingin Anda buat ulang, jika ada beberapa kesalahan yang ingin Anda hilangkan.


Saya baru-baru ini menggunakan ini pada pengguna yang menyertakan spasi dalam nama, yang bingung read, karena IFS secara default menyertakan karakter spasi sebagai pemisah. Perintah baru dan lebih baik saya, yang tampaknya bekerja lebih baik pada sistem nama pengguna aneh.

IFS=$'\t'; while read user host; do
  echo "user:$user host:$host"
  mysql --batch --skip-column-names -e"SHOW GRANTS FOR '$user'@'$host'"
  echo ""
done < <(mysql --batch --skip-column-names -e "SELECT user, host FROM mysql.user")
Sakit kepala
sumber
3

Ini akan membuat SHOW GRANTS;file untuk setiap pengguna.

Lalu, gema setiap pengguna SHOW GRANTS;dan tambahkan tanda titik koma ke setiap baris.

MYSQL_CONN="-uroot -prootpassword"
SQLSTMT="SELECT CONCAT('SHOW GRANTS FOR ''',user,'''@''',host,''';')"
SQLSTMT="${SQLSTMT} FROM mysql.user WHERE user<>''"
mysql ${MYSQL_CONN} -ANe"${SQLSTMT}" > /tmp/ShowGrants.sql
mysql ${MYSQL_CONN} -ANe < /tmp/ShowGrants.sql | sed 's/$/;/g' > MySQLUserGrants.sql
rm -f /tmp/ShowGrants.sql

Anda juga dapat mengunduh dan menggunakan alat-alat ini untuk melakukan hal yang sama:

Cobalah !!!

RolandoMySQLDBA
sumber
2

Saya yakin Anda harus dapat memigrasikan data ini dengan mencadangkan dan memulihkan mysqldatabase.

pkaeding
sumber
Khususnya tabel mysql.user
Coops
2
Anda harus memastikan kedua instance MySQL menjalankan versi utama yang sama, jika tidak, Anda harus menjalankan skrip upgrade yang dibundel dengan server MySQL target.
Maxwell