Làm cách nào để sao chép đặc quyền người dùng với MySQL?


12

Tôi có cài đặt MySQL với nhiều cơ sở dữ liệu và người dùng mà tôi cần chuyển sang cài đặt MySQL mới. Tôi có thể sử dụng phpMyAdmin để xuất sau đó nhập cơ sở dữ liệu / bảng, nhưng tôi không biết bất cứ điều gì để di chuyển người dùng và quyền. Làm thế nào tôi có thể làm điều này một cách dễ dàng?

Câu trả lời:


17

Một tập lệnh như thế này sẽ sử dụng máy khách mysql cli để in ra một loạt các câu lệnh cấp mà bạn sẽ cần sử dụng để tạo lại tài khoản người dùng. Lệnh này sẽ hoạt động tốt nhất nếu bạn có thông tin cơ sở dữ liệu được lưu trữ trong bạn .my.cnf

#!/bin/bash
# adapted from (http://www.pyrosoft.co.uk/blog/2006/10/18/show-grants-for-all-users-on-mysql/)
(
 mysql --batch --skip-column-names -e "SELECT user, host FROM user" mysql 
) | while read user host
do
  echo "# $user @ $host"
  mysql --batch --skip-column-names -e"SHOW GRANTS FOR '$user'@'$host'"
done

Nếu bạn đang chuyển từ một phiên bản mysql sang phiên bản khác, bạn có thể muốn sử dụng phiên bản này thay vì chỉ đơn giản là kết xuất cơ sở dữ liệu mysql. Lược đồ của cơ sở dữ liệu mysql đôi khi được cập nhật.

Điều này cũng sẽ cho phép bạn chọn và chọn các tài khoản bạn muốn tạo lại, nếu có một số hành trình bạn muốn loại bỏ.


Gần đây tôi đã sử dụng điều này trên một người dùng bao gồm khoảng trắng trong tên, điều này gây nhầm lẫn read, vì IFS theo mặc định bao gồm ký tự khoảng trắng dưới dạng dấu phân cách. Lệnh mới và được cải tiến của tôi, dường như hoạt động tốt hơn trên các hệ thống tên người dùng kỳ lạ.

IFS=$'\t'; while read user host; do
  echo "user:$user host:$host"
  mysql --batch --skip-column-names -e"SHOW GRANTS FOR '$user'@'$host'"
  echo ""
done < <(mysql --batch --skip-column-names -e "SELECT user, host FROM mysql.user")

3

Điều này sẽ tạo ra một SHOW GRANTS;tập tin cho mọi người dùng.

Sau đó, lặp lại mỗi người dùng SHOW GRANTS;và nối một dấu chấm phẩy cho mỗi dòng.

MYSQL_CONN="-uroot -prootpassword"
SQLSTMT="SELECT CONCAT('SHOW GRANTS FOR ''',user,'''@''',host,''';')"
SQLSTMT="${SQLSTMT} FROM mysql.user WHERE user<>''"
mysql ${MYSQL_CONN} -ANe"${SQLSTMT}" > /tmp/ShowGrants.sql
mysql ${MYSQL_CONN} -ANe < /tmp/ShowGrants.sql | sed 's/$/;/g' > MySQLUserGrants.sql
rm -f /tmp/ShowGrants.sql

Bạn cũng có thể tải xuống và sử dụng các công cụ này để làm điều tương tự:

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


2

Tôi tin rằng bạn sẽ có thể di chuyển dữ liệu này bằng cách sao lưu và khôi phục mysqlcơ sở dữ liệu.


Cụ thể là bảng mysql.user
Coops

2
Bạn cần đảm bảo cả hai phiên bản MySQL đều chạy cùng một phiên bản chính, nếu không, bạn sẽ cần chạy các tập lệnh nâng cấp đi kèm với máy chủ MySQL đích.
Maxwell
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.