pengembangan-web-mp-pd.com

Bagaimana saya bisa mengekspor hak istimewa dari MySQL dan kemudian mengimpor ke server baru?

Saya tahu cara mengekspor/mengimpor basis data menggunakan mysqldump & tidak apa-apa, tetapi bagaimana cara mendapatkan hak istimewa ke server baru.

Untuk poin tambahan, sudah ada beberapa database yang sudah ada pada yang baru, bagaimana cara mengimpor hak server lama tanpa menghapus pasangan yang ada.

Server lama: 5.0.67-komunitas

Server baru: 5.0.51a-24 + lenny1

EDIT: Saya punya dump db 'mysql' dari Server Lama & sekarang ingin tahu cara yang tepat untuk bergabung dengan db 'mysql' di Server Baru.

Saya mencoba 'Impor' langsung menggunakan phpMyAdmin dan berakhir dengan kesalahan tentang duplikat (yang saya sudah bermigrasi secara manual).

Adakah yang punya cara elegan untuk menggabungkan kedua database 'mysql'?

90
Gareth

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 dan fungsi pemeliharaan CLI di .bashrc saya (sebenarnya .bash_aliases yang saya sumberkan di .bashrc). 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.

$ @ Pada perintah akan memungkinkan Anda untuk memanggilnya sebagai: mygrants --Host = prod-db1 --user = admin --password = secret

Anda dapat menggunakan kit alat unix lengkap Anda pada seperti ini:

mygrants --Host=prod-db1 --user=admin --password=secret | grep Rails_admin | mysql --Host=staging-db1 --user=admin --password=secret

Itulah cara yang tepat untuk memindahkan pengguna. ACL MySQL Anda dimodifikasi dengan SQL murni.

171
Bruno Bronosky

Ada dua metode untuk mengekstraksi SQL Grants dari MySQL Instance

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 ini

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 tersisa untuk dilakukan adalah menjalankan skrip di server baru:

mysql -uroot -p -A < MySQLUserGrants.sql

Cobalah !!!

48
RolandoMySQLDBA

Jawaban Richard Bronosky sangat berguna bagi saya. Terimakasih banyak!!!

Berikut adalah variasi kecil yang bermanfaat bagi saya. Sangat membantu untuk mentransfer pengguna, mis. antara dua instalasi Ubuntu yang menjalankan phpmyadmin. Hanya buang hak istimewa untuk semua pengguna selain dari root, phpmyadmin dan debian-sys-Maint. Kode itu kemudian

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;}'
}
15
rmldj

Atau, gunakan percona-toolkit (mantan maatkit) dan gunakan pt-show-grants (atau mk-show-grants) untuk alasan tersebut. Tidak perlu skrip rumit dan/atau prosedur tersimpan.

7
MrkiMile

Anda dapat mysqldump database 'mysql' dan impor ke yang baru; flush_privileges atau restart akan diperlukan dan Anda pasti ingin mencadangkan db mysq yang ada terlebih dahulu.

Untuk menghindari penghapusan hak istimewa yang ada, pastikan untuk menambahkan daripada mengganti baris dalam tabel hak istimewa (db, kolom_priv, Host, func, dll.).

5
nedm

Bagaimana dengan skrip PHP? :)

Lihat sumber pada skrip ini dan Anda akan memiliki semua hak istimewa yang terdaftar:

//connect
mysql_select_db("mysql", mysql_connect("localhost","root",""));

//create grants select statements
$rs = mysql_query("SELECT DISTINCT CONCAT('SHOW GRANTS FOR ''', user, '''@''', Host, ''';') AS query FROM user");

//iterate through grants
while ($row=mysql_fetch_array($rs)) {
    //run grant query
    $rs2 = mysql_query($row['query']);
    //iterate through results
    while($row2 = mysql_fetch_array($rs2)){
        //print results
        echo $row2[0] . ";\n\n";
    }
}
4
Ibrahim Lawal

Anda juga bisa melakukannya sebagai prosedur tersimpan:

CREATE PROCEDURE spShowGrants()
    READS SQL DATA
    COMMENT 'Show GRANT statements for users'
BEGIN
    DECLARE v VARCHAR(64) CHARACTER SET utf8;
    DECLARE c CURSOR FOR
    SELECT DISTINCT CONCAT(
        'SHOW GRANTS FOR ', user, '@', Host, ';'
    ) AS query FROM mysql.user;
    DECLARE EXIT HANDLER FOR NOT FOUND BEGIN END;  
    OPEN c;
    WHILE TRUE DO
        FETCH c INTO v;
        SET @v = v;
        PREPARE stmt FROM @v;
        EXECUTE stmt;
    END WHILE;
    CLOSE c;
END

dan menyebutnya dengan

$ mysql -p -e "CALL spShowGrants" mysql

kemudian menyalurkan output melalui perintah sed Richards untuk mendapatkan cadangan dari hak istimewa.

4
Lenny

Sementara tampaknya jawaban @Richard Bronosky adalah yang benar, saya menemukan pertanyaan ini setelah mencoba memigrasi satu set database dari satu server ke server lain dan solusinya jauh lebih sederhana:

server1$ mysqldump -u root -p --all-databases > dbdump.sql

server2$ mysql -u root -p < dbdump.sql

Pada titik ini, semua data saya terlihat jika saya login sebagai root, the mysql.user table memiliki semua yang saya harapkan, tetapi saya tidak bisa masuk sebagai pengguna lain dan menemukan pertanyaan ini dengan asumsi saya harus menerbitkan kembali pernyataan GRANT.

Namun, ternyata server mysql hanya perlu di-restart untuk hak istimewa yang diperbarui di mysql.* tabel untuk diberlakukan:

server2$ Sudo restart mysql

Semoga itu membantu orang lain mencapai apa yang seharusnya menjadi tugas sederhana!

3
Tom

buat file skrip Shell dengan kode berikut:

echo "SELECT DISTINCT CONCAT (\"show grants for '\", user, \"'@'\", Host, \"';\") AS query FROM mysql.user; " >   script.sql    
echo "*** You will be asked to enter the root password twice ******"    
mysql -u root -p  < script.sql > output.sql ;    
cat output.sql | grep show > output1.sql  ; rm output.sql -f ; 
mysql -u root -p  < output1.sql > output.sql ;
clear
echo "-----Exported Grants-----"    
cat  output.sql ; rm  output.sql   output1.sql -f    
echo "-------------------------"
rm  script.sql -f

**** kemudian jalankan di Shell seperti ini: Anda akan diminta untuk memasukkan kata sandi root dua kali dan kemudian GRANTS SQL akan ditampilkan di layar. ****

2
Rony

One-liner melakukan hampir sama dengan pt-show-grants:

mysql --skip-column-names -A -e"SELECT CONCAT('SHOW GRANTS FOR ''',user,'''@''',Host,''';') FROM mysql.user WHERE user<>''" | mysql --skip-column-names -A | sed 's/$/;/g'

Hanya berdasarkan alat unix, tidak diperlukan perangkat lunak tambahan.

Jalankan dari dalam bash Shell, dengan asumsi Anda memiliki .my.cnf Yang berfungsi di mana kata sandi pengguna mysql root Anda dapat dibaca.

0
sjas