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ı?
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.
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 !!!
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;}'
}
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.
'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.
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";
}
}
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.
@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!
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. ****
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.