it-swarm-tr.com

MySQL'den ayrıcalıkları nasıl dışa aktarabilir ve sonra yeni bir sunucuya nasıl aktarabilirim?

Nasıl mysqldump kullanarak veritabanlarını ihracat/alma biliyorum ve bu iyi ama nasıl yeni sunucuya ayrıcalıkları almak.

Ekstra puan için, yeni veritabanında birkaç mevcut veritabanı var, eski sunucu ayrıcalıklarını mevcut olan çiftleri nükle etmeden nasıl içe aktarabilirim.

Eski sunucu: 5.0.67-topluluğu

Yeni sunucu: 5.0.51a-24 + lenny1

EDIT: Old Server db 'mysql' bir dökümü var ve şimdi Yeni Sunucu 'mysql' db ile birleştirmek için uygun yolu bilmek istiyorum.

Ben phpMyAdmin kullanarak düz bir 'İthalat' denedim ve bir yinelenen (zaten elle geçirdiğim bir) ile ilgili bir hata ile sona erdi.

Herkes 'mysql' veritabanlarını birleştirmek için zarif bir yolu var mı?

90
Gareth

MySQL db ile karıştırmayın. Orada sadece kullanıcı tablosundan çok daha fazlası var. En iyi bahisiniz " GRANLARI GÖSTER FOR" komutudur. Benim .bashrc (aslında benim .bashrc kaynak benim .bash_aliases) CLI bakım takma adları ve işlevleri bir sürü var. Bu işlev:

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

İlk mysql komutu, ikinci mysql komutuna iletilen geçerli SQL oluşturmak için SQL kullanır. Çıktı daha sonra güzel yorumlar eklemek için sed yoluyla pipetlenir.

Komuttaki $ @ bunu şu şekilde çağırmanıza izin verir: mygrants --Host = prod-db1 --user = admin --password = secret

Tam unix araç kitinizi şu şekilde kullanabilirsiniz:

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

Kullanıcıları taşımanın doğru yolu budur. MySQL ACL'niz saf SQL ile değiştirildi.

171
Bruno Bronosky

MySQL Bulut Sunucusundan SQL Bağışlarını almak için iki yöntem vardır

YÖNTEM 1

Percona Toolkit'ten pt-show-grants kullanabilirsiniz

MYSQL_CONN="-uroot -ppassword"
pt-show-grants ${MYSQL_CONN} > MySQLUserGrants.sql

YÖNTEM # 2

Taklit edebilirsiniz pt-show-grants Takip ederek

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

Her iki yöntem de MySQL hibelerinin saf bir SQL dökümünü üretecektir. Tek yapmanız gereken komut dosyasını yeni bir sunucuda yürütmektir:

mysql -uroot -p -A < MySQLUserGrants.sql

Bir şans ver !!!

48
RolandoMySQLDBA

Richard Bronosky'nin yanıtı benim için son derece yararlı oldu. Çok teşekkürler!!!

İşte benim için yararlı olan küçük bir varyasyon. Kullanıcıların aktarılması için yararlıdır; phpmyadmin çalıştıran iki Ubuntu kurulumu arasında. Sadece root, phpmyadmin ve debian-sys-maint dışındaki tüm kullanıcılar için ayrıcalıkları boşaltın. Kod daha sonra

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

Veya percona-toolkit'i (eski maatkit) kullanın ve pt-show-grants (veya mk-show-grants) bu amaçla. Zorlu komut dosyalarına ve/veya saklı yordamlara gerek yoktur.

7
MrkiMile

'Mysql' veritabanını mysqldump yapabilir ve yenisine aktarabilirsiniz; bir flush_privileges veya yeniden başlatma gerekecektir ve kesinlikle önce mevcut mysq db'yi yedeklemek isteyeceksiniz.

Mevcut ayrıcalıklarınızı kaldırmaktan kaçınmak için, ayrıcalık tablolarındaki satırları (db, column_priv, Host, func vb.) Değiştirmek yerine ekleyin.

5
nedm

PHP komut dosyasına ne dersiniz? :)

Bu komut dosyasındaki kaynağı görüntüleyin ve listelenen tüm ayrıcalıklara sahip olacaksınız:

//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

Saklı yordam olarak da yapabilirsiniz:

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

ve onu ara

$ mysql -p -e "CALL spShowGrants" mysql

daha sonra ayrıcalıkların bir yedeğini almak için çıkışı Richards sed komutuyla iletin.

4
Lenny

@Richard Bronosky'nin cevabı doğru gibi görünse de, bir dizi veritabanını bir sunucudan diğerine geçirmeye çalıştıktan sonra bu soruya rastladım ve çözüm çok daha basitti:

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

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

Bu noktada, root olarak giriş yaptıysam tüm verilerim göründü, mysql.user Tablosunda beklediğim her şey vardı, ancak diğer kullanıcılardan herhangi biri olarak giriş yapamadım ve bu soruyu GRANT ifadelerini yeniden yayınlamam gerektiğini varsayarak buldum.

Ancak, mysql sunucusunun yürürlüğe girmesi için mysql.* Tablolarındaki güncellenmiş ayrıcalıkların yeniden başlatılması gerektiği ortaya çıktı:

server2$ Sudo restart mysql

Umarım bu basit bir görev ne gerekiyorsa başka birine yardımcı olur!

3
Tom

aşağıdaki kodla bir Shell komut dosyası oluşturun:

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

**** daha sonra Shell'de şu şekilde çalıştırın: kök parolayı iki kez girmeniz istenecek ve ardından GRANTS SQL ekranda görüntülenecektir. ****

2
Rony

Tek astar harika 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'

Yalnızca unix araçlarına dayanarak ek yazılım gerekmez.

Bir bash Shell içinden çalıştırın, çalışan bir _ olduğunuz varsayılarak .my.cnf nerede mysql root kullanıcı okunabilir.

0
sjas