Soru Ayrıcalıkları MySQL'den nasıl aktarabilirim ve sonra yeni bir sunucuya nasıl alabilirim?


Veritabanlarını mysqldump kullanarak nasıl dışa aktaracağımı / içe aktaracağımı biliyorum ve bu iyi ama ayrıcalıkları yeni sunucuya nasıl alacağım.

Ekstra noktalar için, yeni bir tane var olan veritabanında birkaç tane var, eski sunucuların ayrıcalıklarını varolan çiftleri nuksuzlaştırmadan nasıl ithal edebilirim.

Eski sunucu: 5.0.67-topluluk

Yeni sunucu: 5.0.51a-24 + lenny1

DÜZENLEME: Eski Sunucudan db 'mysql' bir dökümü var ve şimdi Yeni Sunucu 'mysql' db ile birleştirmek için uygun yolu bilmek istiyorum.

PhpMyAdmin'i kullanarak düz bir 'Import' denedim ve bir duplicate ile ilgili bir hatayla (manuel olarak aktardığım) bir hatayla karşılaştım.

Herkes iki 'mysql' veritabanını birleştirmek için zarif bir yol var mı?


80
2018-05-16 06:08


Menşei


1. PHPMyAdmin'i kullanmanız şart mı? Eğer varsa, sizin için bazı PHPMyAdmin özel talimatlarını yazacağım. 2. Eğer "mysql.user limit 1'den * seçin" denerseniz, PHPMyAdmin'den; sonuçlar ya da bir hata var mı? - Bruno Bronosky
Aşağıda bahsettiğim gibi, Richard'ın mülteci senaryolarının hibe bilgisi almanın iyi bir yolu olduğunu düşünüyorum. Ancak, zaten var olan kullanıcılar için kullanıcı tablosuna INSERTs eklemek için döküm dosyasını düzenlemeyi de deneyebilirsiniz. Eski sunucudan geri yüklenen dbs için ayrıcalıklar kopyalanacaktır. Yeni kutuya geri yüklediğiniz bazı db'ler için önceden el ile ayrıcalıklar atadıysanız, ayrıcalık dosyalarındaki bu tablo adlarına bakın ve bunları da yorumlayın. Daha sonra bir flush_privileges unutmayın. Mysql db 'nin iyi tanımı: grahamwideman.com/gw/tech/mysql/perms/index.htm - nedm
Bu linkte harika bilgi, teşekkürler. Yer işaretli. - Bruno Bronosky


Cevaplar:


Mysql db ile uğraşmayın. Orada sadece kullanıcı masasına göre çok daha fazlası var. En iyi bahsiniz "GÖSTERGELERİ GÖSTER "Komut için. .Bashrc'de çok fazla CLI bakım takma adı ve işlevi var. (Aslında .bashrc kaynağımdaki .bash_aliases.) Bu işlev:

mygrants()
{
  mysql -B -N $@ -e "SELECT DISTINCT CONCAT(
    'SHOW GRANTS FOR \'', user, '\'@\'', host, '\';'
    ) AS query FROM mysql.user" | \
  mysql $@ | \
  sed 's/\(GRANT .*\)/\1;/;s/^\(Grants for .*\)/## \1 ##/;/##/{x;p;x;}'
}

İlk mysql komutu, ikinci mysql komutuna aktarılan geçerli SQL oluşturmak için SQL kullanır. Çıktı daha sonra güzel yorumlar eklemek için sed'den geçiyor.

$ @ Komutu, aşağıdaki gibi çağırmanıza izin verir: mygrants --host = prod-db1 --user = admin --password = gizli

Tam unix araç kitinizi şöyle kullanabilirsiniz:

mygrants --host=prod-db1 --user=admin --password=secret | grep rails_admin | mysql --host=staging-db1 --user=admin --password=secret

Bu kullanıcıları taşımak için doğru yoldur. MySQL ACL'niz saf SQL ile değiştirilmiştir.


165
2018-05-27 15:51



Bu, harika çalışan güzel bir bash yardımcı işlevi. Çıkışı bundan alın ve yeni sunucuda çalışabilecek ve ayrıcalıklar doğru ve doğru bir şekilde girilecektir. - Jeremy Bouse
İşini seviyorum, bugün bana çok iş kurtardı. Teşekkürler teşekkürler teşekkürler... - Fabio
Bu harika ama büyük bir kusuru var. Veritabanı adlarının alt kısımlarına fazladan bir "\" eklenir, bu nedenle örneğin foo_bar adı verilen bir veritabanında belirli ayrıcalıklara sahip bir kullanıcı varsa, foo_bar yerine foo \ _bar olarak oluşturulur, böylece doğru olarak içe aktarılmaz. . En azından, sizden çıktısını komut dosyasından bir SQL dosyasına kaydettiğinizde ve sonra bunu yeni sunucuya aktarırsanız bu olur. Doğrudan ihracat ve ithalat borularını tek bir hatta denemedim. - matteo
Bu komuta dikkat et. İçinde varsa user ana bilgisayar ile bir tablo %ama sonra db tablo girişleri var nerede host açık bir değerdir, bu girişler db Bu yöntem kullanılarak tablo alınmaz. - Mitar
@matteo Ekle -r fonksiyondaki 2. mysql komutuna ve çift kaçışlar mysql. Örneğin: mysql -r $@ - lifo


MySQL örneğinden SQL Grants ayıklamak için iki yöntem vardır.

YÖNTEM 1

Kullanabilirsiniz pt-show-hibeler Percona Toolkit'ten

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

YÖNTEM # 2

Taklit edebilirsin 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 salt bir SQL dökümü oluşturacaktır. Tek yapmanız gereken, betiği yeni bir sunucuda çalıştırmaktır:

mysql -uroot -p -A < MySQLUserGrants.sql

Bir şans ver !!!


40
2018-06-18 18:24



pt-show-hibeleri bunun için tam olarak istediğiniz şeydir, harika çalışır. - Glenn Plas
Percona sadece saf awesomeness. - sjas
Ama # 2 yanıtı aynı derecede iyi ve ek yazılım olmadan çalışacak! - sjas


Richard Bronosky'nin cevabı benim için çok kullanışlıdır. Çok teşekkürler!!!

İşte benim için yararlı olan küçük bir varyasyon. Kullanıcıları transfer etmek için yararlıdır, örn. 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. Kod o zaman

mygrants()
{
mysql -B -N $@ -e "SELECT DISTINCT CONCAT(
'SHOW GRANTS FOR ''', user, '''@''', host, ''';'
) AS query FROM mysql.user WHERE user NOT IN ('root','phpmyadmin','debian-sys-maint')"  | \
mysql $@ | \
sed 's/\(GRANT .*\)/\1;/;s/^\(Grants for .*\)/## \1 ##/;/##/{x;p;x;}'
}

14
2017-09-02 20:27



Bunun için teşekkürler bra hayır brainer “iyileştirme. :) - ThorstenS
Örneğime bakarsanız ben grep rails_admin Her kenar için özel bir işlev yapmadan bunu nasıl yapabileceğinizi öğrenebilirsiniz. Grep'in "ters eşleşme" seçeneğini şu şekilde kullanın: mygrants --host=prod-db1 --user=admin --password=secret | grep -Ev 'root|phpmyadmin|debian-sys-maint' | mysql --host=staging-db1 --user=admin --password=secret - Bruno Bronosky


Ya da, percona-toolkit (eski maatkit) kullanın ve kullanın pt-show-grants (veya mk-show-grants) bu amaçla. Hantal komutlara ve / veya saklı yordamlara gerek yoktur.


6
2018-05-01 12:08





'Mysql' veritabanını mysqldump ve yeni birine alabilirsiniz; Bir flush_privileges veya restart gerekli olacak ve kesinlikle ilk önce mevcut mysq db yedeklemek isteyeceksiniz.

Mevcut ayrıcalıklarınızı kaldırmaktan kaçınmak için, ayrıcalık tablolarındaki (db, columns_priv, host, func, vb.) Satırları değiştirmek yerine eklemeyi unutmayın.


5
2018-05-16 06:24



Teşekkürler @nedm. Ben dbs kapalı db 'mysql' göstermiyor çalışıyorum can sıkıcı cPanel sunucu gibi görünüyor. Aksi halde cevabınızı test edip onaylarım. Bir kere anladım, tekrar kontrol edeceğim. Teşekkürler. - Gareth
Bu talihsiz ancak anlaşılabilir bir durumdur, muhtemelen herhangi bir veritabanına erişmeniz engellenir, ancak doğrudan paylaşılan bir db'de kullanıcınız tarafından sahip olunanlardır. - Dave Cheney
Evet, evet, 'mysql' erişimi olmayan kullanıcılar veya izinlerle ilgili herhangi bir şey yapmak zor olacaktır. Komut satırı erişiminiz var mı? Mysqldump'ı terminalden veya komut satırından çalıştırabilirsiniz (mysql kabuğundan değil)? mysqldump -u kullanıcı adı-anahtar kelime mysql> mysqldump.sql - nedm
'Root' olarak girdiğimde db 'mysql' Cpanel WHM'den erişilebilir oldu. Buradan, izinleri içeren 'mysql' veritabanına sahip phpmyadmin'in bir sürümüne erişebiliyorum. - Gareth
Mevcut bir mysql şemasının bir araya gelmesi, mysqldump aracılığıyla bir mysql şemasından çıkarılan verilerin sorunlu olması neredeyse kesin değildir. Zorlu ilişkiler, vb. İle karmaşık bir şemayı yönlendiriyorsunuz. Bu şema çok karmaşıktır, aslında kendileriyle uğraşmak için özel SQL sözdizimi (GRANT, REVOKE, DROP USER, vb.) Oluşturmuşlardır. Ancak, ekstreniz sadece INSERT ifadelerinden oluşmaktadır. Burada karakterlerin tükeniyor. Devam etmeli miyim? - Bruno Bronosky


Bunu 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 ile çağırın

$ mysql -p -e "CALL spShowGrants" mysql

sonra ayrıcalıkların bir yedeğini almak için çıktıyı Richards sed komutuyla aktarın.


4
2018-05-09 22:05





@Richard Bronosky'nin cevabı doğru olduğu halde, bir takım veritabanlarını bir sunucudan diğerine taşıdıktan sonra bu soruya rastladım ve çözüm çok daha kolay oldu:

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

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

Bu noktada, giriş yaptığımda tüm verilerim görünür oldu root, mysql.user tablo içinde her şeyi bekliyordum, ama diğer kullanıcılardan herhangi biri olarak giriş yapamıyorum ve bu soruyu yeniden ele almak zorunda olduğumu varsayarak bu soruyu buldum. GRANT ifadeleri.

Ancak, mysql sunucusunun, yalnızca güncellenen ayrıcalıklar için yeniden başlatılması gerektiği ortaya çıktı. mysql.* yürürlüğe girecek tablolar:

server2$ sudo restart mysql

Umarım bu bir başkasının basit bir görev olması gerektiğini başarmasına yardımcı olur!


3
2017-09-03 01:16



Oh, ve durumum OP'lerden biraz farklıydı, çünkü mevcut veritabanları / kullanıcılarla bir sunucuya bir dökümü birleştirmeyi denemedim. - Tom
MySQLd'yi 'ayrıcalıkları güncellemek' için yeniden başlatmanız gerekmez. MySQL komutu 'floş ayrıcalıkları' ile yapılabilir. - CloudWeavers
Bu yaklaşımla ilgili sorun, yalnızca hem kaynak hem de hedef MySQL sürümü aynı olduğunda çalışabilmesidir. Aksi halde, mysql.user tablosunun örneğin mysql.user tablosundan farklı sütunlara sahip olması nedeniyle sorun yaşayabilirsiniz. - Mitar


PHP betiğine ne dersin? :)

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

3
2018-05-03 18:11