it-swarm-vi.tech

Làm cách nào tôi có thể xuất các đặc quyền từ MySQL và sau đó nhập vào máy chủ mới?

Tôi biết cách xuất/nhập cơ sở dữ liệu bằng mysqldump và điều đó tốt nhưng làm cách nào tôi có được các đặc quyền vào máy chủ mới.

Đối với các điểm bổ sung, đã có một vài cơ sở dữ liệu hiện có trên cơ sở dữ liệu mới, làm cách nào để nhập các đặc quyền máy chủ cũ mà không thu thập cặp đôi cơ sở dữ liệu hiện có.

Máy chủ cũ: 5.0.67-cộng đồng

Máy chủ mới: 5.0.51a-24 + lenny1

EDIT: Tôi đã nhận được một db 'mysql' từ Máy chủ cũ và giờ muốn biết cách hợp nhất với db 'mysql' trên Máy chủ mới.

Tôi đã thử 'Nhập' bằng cách sử dụng phpMyAdmin và gặp lỗi liên quan đến bản sao (một lỗi mà tôi đã di chuyển thủ công).

Bất cứ ai cũng có một cách hợp nhất để hợp nhất hai cơ sở dữ liệu 'mysql'?

90
Gareth

Đừng gây rối với db mysql. Có rất nhiều thứ đang diễn ra ở đó hơn là chỉ bảng người dùng. Đặt cược tốt nhất của bạn là lệnh " SHOW GRANTS FOR". Tôi có rất nhiều bí danh và chức năng bảo trì CLI trong .bashrc của tôi (thực ra là .bash_aliases mà tôi cung cấp trong .bashrc của mình). Chức năng này:

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

Lệnh mysql đầu tiên sử dụng SQL để tạo SQL hợp lệ được chuyển sang lệnh mysql thứ hai. Đầu ra sau đó được dẫn qua sed để thêm bình luận đẹp.

$ @ Trong lệnh sẽ cho phép bạn gọi nó là: mygrant --host = prod-db1 --user = admin --password = secret

Bạn có thể sử dụng bộ công cụ unix đầy đủ của mình như thế này:

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

Đó là cách đúng đắn để di chuyển người dùng. MySQL ACL của bạn được sửa đổi với SQL thuần túy.

171
Bruno Bronosky

Có hai phương pháp để trích xuất Tài trợ SQL từ Trường hợp MySQL

PHƯƠNG PHÁP # 1

Bạn có thể sử dụng pt-show-Grants từ Percona Toolkit

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

PHƯƠNG PHÁP # 2

Bạn có thể giả lập pt-show-grants với những điều sau đây

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

Một trong hai phương pháp sẽ tạo ra một kết xuất SQL thuần túy của các khoản tài trợ MySQL. Tất cả những gì còn lại phải làm là thực thi tập lệnh trên một máy chủ mới:

mysql -uroot -p -A < MySQLUserGrants.sql

Hãy thử một lần !!!

48
RolandoMySQLDBA

Câu trả lời của Richard Bronosky cực kỳ hữu ích cho tôi. Cảm ơn nhiều!!!

Đây là một biến thể nhỏ hữu ích cho tôi. Nó rất hữu ích cho việc chuyển người dùng, ví dụ: giữa hai cài đặt Ubuntu chạy phpmyadmin. Chỉ cần bỏ các đặc quyền cho tất cả người dùng ngoài root, phpmyadmin và debian-sys-notify. Mã là sau đó

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

Hoặc, sử dụng percona-toolkit (maatkit cũ) và sử dụng pt-show-grants (hoặc là mk-show-grants) cho mục đích đó. Không cần các kịch bản rườm rà và/hoặc các thủ tục được lưu trữ.

7
MrkiMile

Bạn có thể mysqldump cơ sở dữ liệu 'mysql' và nhập vào cơ sở dữ liệu mới; một yêu cầu hoặc khởi động lại sẽ được yêu cầu và bạn chắc chắn sẽ muốn sao lưu mysq db hiện tại trước tiên.

Để tránh xóa các đặc quyền hiện có của bạn, hãy đảm bảo nối thêm thay vì thay thế các hàng trong bảng đặc quyền (db, Cột_priv, Máy chủ, func, v.v.).

5
nedm

Làm thế nào về một tập lệnh PHP? :)

Xem nguồn trên tập lệnh này và bạn sẽ có tất cả các đặc quyền được liệt kê:

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

Bạn cũng có thể làm điều đó như một thủ tục được lưu trữ:

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

và gọi nó với

$ mysql -p -e "CALL spShowGrants" mysql

sau đó chuyển đầu ra thông qua lệnh Richards sed để có bản sao lưu các đặc quyền.

4
Lenny

Mặc dù câu trả lời của @Richard Bronosky là câu trả lời đúng, tôi đã gặp câu hỏi này sau khi cố gắng di chuyển một bộ cơ sở dữ liệu từ máy chủ này sang máy chủ khác và giải pháp đơn giản hơn nhiều:

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

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

Tại thời điểm này, tất cả dữ liệu của tôi sẽ hiển thị nếu tôi đăng nhập là root, mysql.user bảng có mọi thứ trong đó tôi mong đợi, nhưng tôi không thể đăng nhập như bất kỳ người dùng nào khác và thấy câu hỏi này giả sử tôi phải phát hành lại các câu lệnh GRANT.

Tuy nhiên, hóa ra máy chủ mysql chỉ cần được khởi động lại cho các đặc quyền được cập nhật trong mysql.* bảng có hiệu lực:

server2$ Sudo restart mysql

Hy vọng rằng sẽ giúp người khác đạt được những gì nên là một nhiệm vụ đơn giản!

3
Tom

tạo tệp tập lệnh Shell với mã sau :

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

**** sau đó chạy nó trên Shell như thế này: bạn sẽ được yêu cầu nhập mật khẩu gốc hai lần và sau đó SQL GRANTS sẽ được hiển thị trên màn hình. ****

2
Rony

Một lớp lót hoạt động khá giống với tuyệt vời 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'

Chỉ dựa trên các công cụ unix, không cần phần mềm bổ sung.

Thực thi từ bên trong Shell bash, giả sử là bạn đang làm việc .my.cnf nơi mật khẩu của bạn mysql root người dùng có thể được đọc.

0
sjas