שאלה כיצד ניתן לייצא את ההרשאות מ- MySQL ולאחר מכן לייבא לשרת חדש?


אני יודע איך לייצא / לייבא את מסדי הנתונים באמצעות mysqldump & זה בסדר, אבל איך אני מקבל את הרשאות לתוך השרת החדש.

לקבלת נקודות נוספות, ישנם כמה מסדי נתונים קיימים על אחד חדש כבר, איך אני לייבא את השרתים הישנים הרשאות ללא nuking הזוג הקיים של אלה.

שרת ישן: 5.0.67-Community

שרת חדש: 5.0.51a-24 + lenny1

עריכה: יש לי dump של mysql 'db' מן השרת הישן & עכשיו רוצה לדעת את הדרך הנכונה להתמזג עם 'MySQL' db על השרת החדש.

ניסיתי ישר 'ייבוא' באמצעות phpMyAdmin ובסופו של דבר עם שגיאה לגבי שכפול (אחד כי אני כבר הועברו באופן ידני).

מישהו קיבל דרך אלגנטית למזג את שני מסדי הנתונים 'mysql'?


80
2018-05-16 06:08




1. האם יש צורך להשתמש ב- PHPMyAdmin? אם זה אני אכתוב כמה הוראות ספציפיות PHPMyAdmin בשבילך. 2. מ PHPMyAdmin אם אתה מנסה "לבחור מתוך mysql.user להגביל 1;" אתה מקבל תוצאות או שגיאה. - Bruno Bronosky
כפי שציינתי להלן, אני חושב סקריפט של mygrants ריצ'רד היא דרך טובה לקבל מידע מענק. עם זאת, תוכל גם לנסות לערוך את קובץ ה- dump כדי להעיר את INSERTs לטבלת המשתמשים עבור משתמשים שכבר קיימים. הרשאות עבור dbs משוחזר מהשרת הישן יועתק אז. אם כבר הקציתם הרשאות באופן ידני עבור חלק מה- dbs ששוחזרו לתיבה החדשה, חפשו את שמות הטבלאות הללו בקבצי ההרשאות ותגיבו גם עליהן. ללא שם: אל תשכח flush_privileges לאחר מכן. תיאור טוב של ds mysql ב: grahamwideman.com/gw/tech/mysql/perms/index.htm - nedm
מידע נהדר בקישור הזה, תודה. מסומן. - Bruno Bronosky


תשובות:


אל תתעסקו עם ds 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 חוקי אשר מוזרק הפקודה mysql השני. הפלט הוא piped מכן דרך sed להוסיף הערות די.

הפקודה $ @ בפקודה תאפשר לך לקרוא לה כך: Mygrants --host = prod-db1 --user = admin - סיסמה = סוד

ניתן להשתמש בערכת כלי ה- 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 2 בפונקציה והבריחה הכפולה לא תהיה פלט על ידי mysql. לדוגמה: mysql -r $@ - lifo


קיימות שתי שיטות לחילוץ SQL Grants מתוך מופע MySQL

שיטה # 1

אתה יכול להשתמש מענקי מענקים מ - Percona Toolkit

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- להראות מענקים הוא בדיוק מה שאתה רוצה בשביל זה, זה עובד נהדר. - Glenn Plas
Percona הוא פשוט awesomeness טהור. - 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



תודה על זה "לא brainer" שיפור. :) - 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-Toolkit (maatkit לשעבר) ושימוש pt-show-grants (או mk-show-grants) למטרה הזאת. אין צורך סקריפטים מסורבל ו / או נהלים מאוחסנים.


6
2018-05-01 12:08





אתה יכול mysqldump מסד הנתונים 'mysql' ולייבא את אחד חדש; א flush_privileges או הפעלה מחדש יידרש ואתה בהחלט רוצה לגבות את mysq db הקיים הראשון.

כדי למנוע הסרת ההרשאות הקיימות שלך, הקפד להוסיף ולא להחליף שורות בטבלאות ההרשאות (db, columns_priv, host, func וכו ').


5
2018-05-16 06:24



תודה @nedm. נראה כמו שרת cPanel מעצבן אני מנסה להשיג את dbs את לא מראה את db 'mysql'. אחרת הייתי בודק ומאשר את תשובתך. ברגע שאבין את זה אני אבדוק. תודה. - Gareth
זה מצער אבל מובן, אתה כנראה מנעו גישה לכל מסד נתונים, אבל אלה בבעלות ישירה על ידי המשתמש שלך על DB משותף. - Dave Cheney
Ouch, כן, ללא גישה ל 'MySQL' זה יהיה קשה לעשות משהו הקשור למשתמשים או הרשאות. האם יש לך גישה לשורת הפקודה? אתה יכול להפעיל mysqldump מן המסוף או שורת הפקודה (לא מן הקליפה mysql)? mysqldump -u שם המשתמש, mysqldump.sql - nedm
את db 'mysql' היה נגיש מן WHP Cpanel אם אני מחובר בתור 'שורש'. משם אני יכול לגשת לגרסה של phpmyadmin אשר יש את מסד הנתונים 'mysql' המכיל הרשאות - Gareth
מיזוג לתוך סכימה mysql הקיים, נתונים שחולצו מתוך סכימה MySQL דרך mysqldump כמעט בוודאות להיות בעייתי. אתה מניפולציה של סכימה מורכבת עם יחסים נאכפים, וכו '. סכמה זו מורכבת כל כך, למעשה, כי הם יצרו תחביר SQL ייעודי (מענק, 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

ואז הצינור את הפלט באמצעות הפקודה sands Richards כדי לקבל גיבוי של הרשאות.


4
2018-05-09 22:05





למרות שנראה כי התשובה של ריצ'רד ברונוסקי היא התשובה הנכונה, נתקלתי בשאלה זו לאחר שניסה להעביר קבוצה של מסדי נתונים משרת אחד לשני והפתרון היה הרבה יותר פשוט:

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



אה, והמצב שלי היה שונה במקצת של OP, כי אני לא מנסה למזג מזבלה לשרת עם מסדי נתונים קיימים / משתמשים. - Tom
אתה לא ממש צריך להפעיל MySQLd 'לעדכן את הרשאות'. ניתן לעשות זאת באמצעות הפקודה MySQL 'הרשאות סומק'; - CloudWeavers
הבעיה עם גישה זו היא כי זה עובד רק כאשר הן מקור ויעד גירסת MySQL זהים. אחרת אתה עלול להיתקל בבעיות כי הטבלה mysql.user המקור יש עמודות שונות מאשר השולחן mysql.user היעד, למשל. - Mitar


מה דעתך על סקריפט PHP? :)

הצג את המקור בסקריפט זה ותהיה לך את כל ההרשאות המפורטות:

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