سؤال كيف يمكنني تصدير الامتيازات من MySQL ومن ثم الاستيراد إلى خادم جديد؟


أنا أعرف كيفية تصدير / استيراد قواعد البيانات باستخدام mysqldump وهذا جيد ولكن كيف يمكنني الحصول على الامتيازات في الخادم الجديد.

للحصول على نقاط إضافية ، هناك نوعان من قواعد البيانات الموجودة على واحدة جديدة بالفعل ، وكيف يمكنني استيراد امتيازات الخوادم القديمة دون nuking الزوجين الموجودة من تلك.

الخادم القديم: 5.0.67 - المجتمع

الخادم الجديد: 5.0.51a-24 + lenny1

تحرير: لقد حصلت على تفريغ من db 'mysql' من الخادم القديم والآن نريد أن نعرف الطريقة المناسبة لدمج مع 'mysql' ديسيبل على خادم جديد.

حاولت "استيراد" مستقيما باستخدام phpMyAdmin وانتهى الأمر بخطأ فيما يتعلق بالنسخة المكررة (التي قمت بنقلها يدويًا بالفعل).

أي شخص حصل على طريقة أنيقة لدمج قواعد البيانات "mysql" اثنين؟


80
2018-05-16 06:08


الأصل


1. هل من متطلبات استخدام PHPMyAdmin؟ إذا كنت سأكتب بعض الإرشادات الخاصة بـ PHPMyAdmin لك. 2. من PHPMyAdmin إذا حاولت "تحديد * من حد mysql.user 1 ؛" هل تحصل على نتائج أو خطأ. - Bruno Bronosky
كما ذكرت أدناه ، أعتقد أن النص البرمجي لريتشارد هو طريقة جيدة للحصول على معلومات منح. ومع ذلك ، يمكنك أيضًا محاولة تعديل ملف التفريغ للتعليق على INSERTs إلى جدول المستخدم للمستخدمين الموجودين بالفعل. سيتم بعد ذلك نسخ امتيازات dbs التي تم استعادتها من الخادم القديم. إذا قمت بالفعل بتعيين الامتيازات يدويًا لبعض dbs التي قمت باستعادتها إلى المربع الجديد ، فابحث عن أسماء الجداول هذه في ملفات الامتيازات وقم بتعليقها أيضًا. لا تنسَ flush_privileges بعد ذلك. وصف جيد من mysql db في: grahamwideman.com/gw/tech/mysql/perms/index.htm - nedm
معلومات كبيرة في هذا الرابط ، شكرا. إشارة مرجعية. - Bruno Bronosky


الأجوبة:


لا تعبث مع mysql ديسيبل. هناك الكثير مما يحدث هناك فقط من جدول المستخدمين. افضل رهان هو "اعرض المنح لـ "الأمر. لدي الكثير من الأسماء المستعارة للصيانة CLI والوظائف الخاصة بي. bashrc (في الواقع بلدي. bash_aliases أنني مصدر في بلدي. bashrc). هذه الوظيفة:

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

يستخدم الأمر mysql الأول SQL لإنشاء SQL صالح وهو piped إلى الأمر mysql الثاني. ثم يتم تمرير الإخراج عبر sed لإضافة تعليقات جميلة.

سيسمح لك $ @ في الأمر بالاتصال به على النحو التالي: mygrants --host = prod-db1 --user = admin --password = secret

يمكنك استخدام مجموعة أدوات Unix الكاملة الخاصة بك على هذا النحو:

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

هذه هي الطريقة الصحيحة لنقل المستخدمين. يتم تعديل MySQL ACL باستخدام SQL خالص.


165
2018-05-27 15:51



هذا هو في الواقع وظيفة مساعد باش لطيفة تعمل بشكل جيد. أخذ الإخراج من ذلك وتكون قادرة على العمل على الخادم الجديد وسيتم إدخال الامتيازات بشكل صحيح ودقيق. - Jeremy Bouse
أنا أحب وظيفتك ، اليوم أنها أنقذتني الكثير من العمل. شكرا لك شكرا لك شكرا لك... - Fabio
هذا شيء عظيم لكنه يعاني من عيب كبير. تتم إضافة "\" إضافية إلى الشرطات السفلية في أسماء قواعد البيانات ، لذلك إذا كان لديك مثلاً مستخدم له امتيازات محددة في قاعدة بيانات تسمى foo_bar ، فسيتم تقديمه على شكل foo \ _bar بدلاً من foo_bar ، بحيث لن يتم استيراده بشكل صحيح . على الأقل ، يحدث هذا إذا قمت بحفظ الإخراج من البرنامج النصي إلى ملف SQL ثم استيراده إلى الملقم الجديد. لم أحاول الأنابيب المباشرة للتصدير والاستيراد في سطر واحد. - matteo
كن حذرا مع هذا الأمر. إذا كان لديك user جدول مستخدم مع المضيف %، ولكن في db الجدول لديك إدخالات أين host هي قيمة صريحة ، تلك الإدخالات في db لا يتم استرداد الجدول باستخدام هذه الطريقة. - Mitar
matteo أضف -r إلى الأمر mysql الثاني في الدالة ولن تخرج مضاعفات مزدوجة mysql. على سبيل المثال: mysql -r $@ - lifo


هناك طريقتان لاستخراج SQL Grants من مثيل MySQL

طريقة 1

يمكنك استخدام حزب العمال تظهر المنح من مجموعة أدوات بيرسونا

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

طريقة # 2

يمكنك محاكاة pt-show-grants كالآتي

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

إما أن ينتج الأسلوب تفريغ SQL خال من منح MySQL. كل ما تبقى القيام به هو تنفيذ البرنامج النصي على خادم جديد:

mysql -uroot -p -A < MySQLUserGrants.sql

جربها !!!


40
2018-06-18 18:24



pt-show-grantrants هو بالضبط ما تريده لهذا ، فهو يعمل بشكل رائع. - Glenn Plas
Percona هو مجرد محض. - sjas
لكن الإجابة رقم 2 هي جيدة وستعمل بدون برامج إضافية! - sjas


كان رد ريتشارد برونوسكي مفيدا للغاية بالنسبة لي. شكرا جزيلا!!!

في ما يلي بعض الاختلافات البسيطة التي كانت مفيدة بالنسبة لي. من المفيد نقل المستخدمين ، على سبيل المثال. بين اثنين من تثبيتات أوبونتو تشغيل phpmyadmin. امتيازات التفريغ فقط لجميع المستخدمين بصرف النظر عن الجذر ، phpmyadmin و debian-sys-maint. الرمز هو إذن

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



شكرا على هذا التحسن. :) - ThorstenS
إذا نظرت إلى مثالى حيث أنا grep rails_admin يمكنك استنتاج كيفية القيام بذلك دون عمل وظيفة خاصة لكل حالة حافة. استخدم خيار "عكس معكوس" grep مثل: 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


أو ، استخدام أدوات percona (maatkit السابق) واستخدامها pt-show-grants (أو mk-show-grants) من اجل ذلك الهدف. لا حاجة لبرامج نصية مرهقة و / أو الإجراءات المخزنة.


6
2018-05-01 12:08





يمكنك mysqldump قاعدة البيانات 'mysql' والاستيراد إلى واحد جديد. ستحتاج إلى flush_privileges أو إعادة التشغيل ، وستحتاج بالتأكيد إلى إجراء نسخ احتياطي لـ mysq db الموجود أولاً.

لتجنب إزالة امتيازاتك الحالية ، تأكد من إلحاق صفوف بدلاً من استبدالها في جداول الامتيازات (db ، و columns_priv ، والمضيف ، و func ، وما إلى ذلك).


5
2018-05-16 06:24



شكراnedm. يبدو أن خادم cPanel مزعج أحاول الحصول على إيقاف dbs لا تظهر db 'mysql'. وإلا فسوف أختبر إجابتك وأؤكدها. بمجرد أن أحسب ذلك سوف تحقق مرة أخرى. شكر. - Gareth
هذا أمر مؤسف ولكنه مفهوم ، ربما يتم منعك من الوصول إلى أي قاعدة بيانات ولكن تلك المملوكة مباشرة لمستخدمك على db مشتركة. - Dave Cheney
أوتش ، نعم ، بدون الوصول إلى 'mysql' سيكون من الصعب القيام بأي شيء متعلق بالمستخدمين أو الأذونات. هل لديك وصول سطر الأوامر؟ يمكنك تشغيل mysqldump من محطة أو سطر الأوامر (وليس من قذيفة mysql)؟ mysqldump -u username -password mysql> mysqldump.sql - nedm
تم الوصول إلى db 'mysql' من Cpanel WHM إذا قمت بتسجيل الدخول باسم 'root'. من هناك يمكنني الوصول إلى إصدار من phpmyadmin يحتوي على قاعدة بيانات تحتوي على "mysql" - Gareth
دمج في مخطط mysql موجود ، من المؤكد تقريبا أن تكون البيانات المستخلصة من مخطط الخلية عبر mysqldump إشكالية. تقوم بمعالجة مخطط معقد مع علاقات مفروضة ، إلخ. هذا المخطط معقد للغاية ، في الواقع ، قاموا بإنشاء بنية SQL مخصصة (GRANT ، REVOKE ، DROP USER ، إلخ.) للتعامل معها. المقتطف الخاص بك ، ومع ذلك ، يتكون من عبارات INSERT فقط. أنا ينفد من الشخصيات هنا. هل أنا مستمر؟ - Bruno Bronosky


يمكنك أيضًا القيام بذلك كإجراء مخزن:

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

وأطلق عليه اسم

$ mysql -p -e "CALL spShowGrants" mysql

ثم إخراج المخرج من خلال أمر Richards sed للحصول على نسخة احتياطية من الامتيازات.


4
2018-05-09 22:05





على الرغم من أن الإجابة علىRichard Bronosky هي الإجابة الصحيحة ، فقد صادفت هذا السؤال بعد محاولة نقل مجموعة من قواعد البيانات من خادم إلى آخر وكان الحل أبسط بكثير:

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

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

في هذه المرحلة ، كانت جميع بياناتي مرئية إذا سجلت الدخول باسم root، ال mysql.user الجدول كان يحتوي على كل شيء كنت أتوقعه ، ولكن لم أتمكن من تسجيل الدخول كأحد المستخدمين الآخرين ووجدت هذا السؤال على افتراض أنه سيتعين علي إعادة إصدار GRANT صياغات.

ومع ذلك ، اتضح أن خادم mysql ببساطة بحاجة إلى إعادة التشغيل للحصول على الامتيازات المحدثة في mysql.* الجداول نافذة المفعول:

server2$ sudo restart mysql

نأمل أن يساعد شخص آخر على تحقيق ما يجب أن يكون مهمة بسيطة!


3
2017-09-03 01:16



أوه ، وكان وضعي مختلفًا بعض الشيء عن البروتوكول الاختياري ، حيث لم أحاول دمج ملف تفريغ في خادم يحتوي على قواعد بيانات / مستخدمين حاليين. - Tom
ليس عليك في الواقع إعادة تشغيل MySQLd "لتحديث الامتيازات". يمكن القيام بذلك عن طريق "امتياز امتياز" الأمر MySQL ؛ - CloudWeavers
تكمن المشكلة في هذا الأسلوب في أنه يعمل فقط عندما تكون نسخة MySQL الخاصة بالمصدر والوجهة متماثلة. وإلا قد يكون لديك مشاكل لأن جدول mysql.user المصدر يحتوي على أعمدة مختلفة من جدول mysql.user الوجهة ، على سبيل المثال. - Mitar