2008-09-30 25 views
19

Tôi đang sử dụng mysqldump để tái tạo cơ sở dữ liệu giữa các tài khoản trên một máy cụ thể. Mọi thứ đều hoạt động rất tốt, ngoại trừ khi chúng ta đi đến các khung nhìn đã định nghĩa của chúng ta. Bởi vì các bãi chứa bao gồm một dòng như sau ...Làm cách nào để sử dụng mysqldump để nhân rộng lượt xem giữa các tài khoản?

/*!50013 DEFINER=`user_a`@`localhost` SQL SECURITY DEFINER */ 

... khi tải bãi vào mysql trên user_b chúng tôi nhận được một lỗi:

ERROR 1227 (42000) at line 657: Access denied; you need the SUPER privilege for this operation 

Không cần phải nói, tôi không có đặc quyền SUPER trên cá thể mysql này. Có cách nào để thuyết phục mysqldump để kết xuất lượt xem theo cách người dùng không thuyết phục? Tôi không thể tìm thấy bất cứ điều gì trong hướng dẫn vào thời điểm này. Tôi có phải thực sự phân tích cú pháp dumpfile để thay thế tên người dùng không? Hay tôi đang thiếu một cái gì đó?

Trả lời

27

cùng một vấn đề. Tôi giải quyết nó theo cách đó:

mysqldump -uuser1 -ppassword1 database1 > backup.sql 

sed '/^\/\*\!50013 DEFINER/d' backup.sql > backup_without_50013.sql 

mysql -u user2 -ppassword2 -D database2 < backup_without_50013.sql 

Điều thú vị là các lệnh sed đó, ở đây, loại bỏ tất cả các dòng bắt đầu bằng/* 50.013!.

Heidy

+2

Cảm ơn, tôi thực sự đã làm điều tương tự, ngoại trừ sử dụng grep -v thay vì sed, nhưng kết quả là như nhau. :) –

2

Điều khoản bảo mật SQL xác định tài khoản MySQL nào sẽ sử dụng khi kiểm tra đặc quyền truy cập cho chế độ xem (như bạn có thể đã tìm ra).

Khi bạn tạo chế độ xem, bạn có thể xác định một vài tùy chọn để bảo mật cho chế độ xem đó. Bạn có thể đọc thêm here, nhưng về cơ bản theo quyền truy cập mặc định bị giới hạn ở 'definer' của chế độ xem, tức là người dùng đã tạo nó.

+0

Xin cảm ơn, Max. Tôi đã kiểm tra nó ra, và nó không có vẻ rằng tinkering với các tùy chọn này ảnh hưởng đến cách mysqldump sản xuất đầu ra. Nếu nó chỉ đơn giản là bỏ qua dòng DEFINER, tôi sẽ là vàng. :) –

0

Run mysqldump với các tùy chọn "--skip-triggers"

+0

Ý tưởng thú vị, nhưng điều này không làm bất cứ điều gì để ảnh hưởng đến dòng @DEFINER trong đầu ra dump. Miễn là tôi đang xác nhận một người hủy bỏ khác với người dùng MySQL đã đăng nhập, tôi nhận được lỗi bảo mật. –

12

Bạn sẽ cần phải xử lý các tập tin sao lưu và thay đổi DEFINER:

DEFINER = user_a @localhost

Tôi muốn thay đổi nó đến:

DEFINER = CURRENT_USE R

Sau đó, nó sẽ được tự động liên kết với tài khoản tải nó.

+3

cảm ơn về mẹo! Tôi sử dụng (tôi cần phải thoát khỏi '): sed -ri s/DEFINER = \' [^ \ '] + \' @ \ '% \'/DEFINER = CURRENT_USER/g file.sql – brunoqc

+2

Điều này! Và với một chút phép thuật 'sed' từ @brunoqc nó chỉ là hoàn hảo – Matthew

Các vấn đề liên quan