Tạo một nô lệ MySQL từ một nô lệ khác, nhưng chỉ vào chủ


8

Vấn đề

Tôi có thiết lập sao chép MySQL giữa 2 máy chủ, chủ ( A ) và nô lệ ( B ). Tôi cần thêm một nô lệ mới vào hỗn hợp ( C ). Tôi muốn nô lệ này nhận được cập nhật trực tiếp từ chủ, tôi không muốn sao chép chuỗi từ nô lệ. Tuy nhiên, bản gốc rất "nóng", tôi thường sử dụng Xtrabackup để tạo bản sao lưu đầy đủ của bản gốc, nhưng điều này sẽ khóa nó trong 10 phút, vì cơ sở dữ liệu có kích thước khoảng 20 GB.

Giải pháp có thể

BẢNG XÓA B WITHNG CÁCH ĐỌC LOCK trên nô lệ B , sử dụng SHOW SLAVE STATUS trên B , viết binlog và vị trí. Sau đó, sao lưu cơ sở dữ liệu bằng Xtrabackup, gửi bản sao lưu đến C và sử dụng nó để tạo nô lệ và đặt sao chép để trỏ đến A với vị trí binlog tôi vừa viết.

Câu hỏi

Có cách nào tốt hơn mà không yêu cầu tôi khóa B quá lâu không? Hoặc một cái gì đó dễ dàng tự động hơn?

Câu trả lời:


20

Xin chào, tôi biết một phương pháp điên rồ để tạo nô lệ mà không làm tăng thêm bất kỳ hoạt động nào của chủ (ServerA) hoặc nô lệ (ServerB)

Bước 1) Thiết lập Máy chủ mới (ServerC)

Bước 2) Trên ServerC, Cài đặt MySQL (cùng phiên bản với ServerB)

Bước 3) Trên ServerC, dịch vụ mysql dừng

Bước 4) Sao chép /etc/my.cnf từ ServerB sang ServerC

Bước 5) Trên ServerC, thay đổi server_id thành giá trị khác với ServerA và ServerB

Bước 6) rsync / var / lib / mysql trên ServerB đến ServerC

Bước 7) Khi rsync hoàn thành, hãy chạy "STOP SLAVE;" trên ServerB

Bước 8) rsync / var / lib / mysql trên ServerB đến ServerC

Bước 9) Trên ServerB, chạy "START SLAVE;"

Bước 10) Trên ServerC, dịch vụ mysql bắt đầu

Bước 11) Trên ServerC, chạy "START SLAVE;" (Làm điều này nếu Skip-Slave-start nằm trong /etc/my.cnf)

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

BTW Tôi hoàn toàn tin tưởng điều này sẽ hoạt động vì tôi mới làm điều này cho khách hàng trong 2 ngày qua. Khách hàng có 2,7TB dữ liệu trên một nô lệ. Tôi rsyncd đến một máy chủ khác trong khi nô lệ vẫn còn hoạt động. rsync mất 11 giờ. Sau đó tôi chạy STOP SLAVE; trên nô lệ đầu tiên và chạy rsync một lần nữa. Mất thêm một giờ nữa. Sau đó tôi thực hiện bước trên và mọi thứ đã xong.


CƯỜI LỚN. Tôi sẽ bình luận về OP để sử dụng đề xuất của bạn, và thấp và coi ông Rolando là DBA "Tủ lạnh". Rolando đánh vào đầu đinh và đây là phương pháp ưa thích mà không phải dừng bất kỳ Master nào và không dừng nô lệ B của bạn trong một khoảng thời gian quá dài.
coderwhiz

2
Tôi biết đây là một bài viết khá cũ nhưng ai đó đã hỏi tôi về phương pháp này. Điều này hoạt động tốt khi giả định rằng nô lệ mới và nô lệ cũ là CHÍNH XÁC giống nhau. Nếu nô lệ mới là một vòm khác thì nó sẽ không hoạt động (iirc). Và tôi gần như chắc chắn rằng nếu bạn đang sử dụng các không gian bảng innodb trên mỗi tệp thì nó sẽ không hoạt động. Giải pháp an toàn nhất là thực hiện sao lưu toàn bộ từ chủ nếu có bất kỳ nghi ngờ nào.
lusis

@lusis - Nhận xét của bạn rất đúng. Trong một thế giới hoàn hảo, mà hầu hết các khách hàng của mysql tưởng tượng họ có, họ muốn điều này được thực hiện vì tất cả các thông số kỹ thuật phần cứng giống hệt nhau. Trong các thiết lập nơi phần cứng khác nhau, mysqldumps và tải lại là an toàn nhất. Bạn nên gửi bình luận của bạn như là một câu trả lời. Tôi sẽ nâng cao nó. Hãy xem người khác sẽ làm gì !!!
RolandoMySQLDBA

Tôi làm theo thủ tục. Sau khi khởi động lại mysql trên SlaveC, tôi gặp lỗi "Cơ sở dữ liệu của bạn có thể bị hỏng hoặc bạn có thể đã sao chép không gian bảng InnoDB nhưng không phải là tệp nhật ký InnoDB". Và trên start slave(SlaveC) tôi nhận được "Không thể mở nhật ký chuyển tiếp '/var/log/mysql/mysql-relay-bin.001603"
Hussain Tamboli 11/03/2015

Bằng cách này bạn có thể dễ dàng mất dữ liệu trên ServerC.
akuzminsky 18/03/2017

3

Khi chúng ta thêm một nô lệ vào hỗn hợp của mình, chúng ta sẽ làm như sau:

  • lấy một nô lệ nhé
  • sao chép thư mục dữ liệu cơ sở dữ liệu sang nô lệ mới (vị trí nô lệ -binlog, máy chủ chính, v.v. - sẽ chính xác vì chúng tôi đã sao chép từ một nô lệ)
  • bắt đầu nô lệ ban đầu
  • sửa đổi id máy chủ trong my.cnf cho nô lệ mới
  • bắt đầu nô lệ mới

Tôi vừa phải tự làm việc này chiều nay
sreimer

1

Tôi đã làm những gì @RolandoMySQLDBA gợi ý nhưng cũng thêm các bước 6 '8' (điều này giải quyết những gì @Hussain Tamboli bình luận.):

Bước 1) Thiết lập Máy chủ mới (ServerC)

Bước 2) Trên ServerC, Cài đặt MySQL (cùng phiên bản với ServerB)

Bước 3) Trên ServerC, dịch vụ mysql dừng

Bước 4) Sao chép /etc/my.cnf từ ServerB sang ServerC

Bước 5) Trên ServerC, thay đổi server_id thành giá trị khác với ServerA và ServerB

Bước 6) rsync / var / lib / mysql trên ServerB đến ServerC

Bước 6 ') rsync / var / log / mysql trên ServerB đến ServerC

Bước 7) Khi rsync hoàn thành, hãy chạy "STOP SLAVE;" trên ServerB

Bước 8) rsync / var / lib / mysql trên ServerB đến ServerC

Bước 8 ') rsync / var / log / mysql trên ServerB đến ServerC

Bước 9) Trên ServerB, chạy "START SLAVE;"

Bước 10) Trên ServerC, dịch vụ mysql bắt đầu

Bước 11) Trên ServerC, chạy "START SLAVE;" (Làm điều này nếu Skip-Slave-start nằm trong /etc/my.cnf)


câu trả lời của bạn không đầy đủ, và nó tham khảo những thứ khác. nó không phải là một diễn đàn, hãy tự cải thiện câu trả lời của bạn.
asdmin

0

Bạn có tùy chọn "LOAD DATA TỪ MASTER" nhưng điều đó không được khuyến khích.

Bạn có sao lưu hàng đêm / hàng tuần trên hệ thống của bạn? Nếu vậy, cũng lưu ý vị trí với bản sao lưu của bạn thì bạn có thể sử dụng bản sao lưu đó để thiết lập một nô lệ mới. Chỉ cần để nó và cho phép nó được cập nhật một thời gian.


0

Tôi đã thử câu trả lời của Rolando và hoạt động tốt, nhưng nó đã bắt đầu phát lại từ đầu và tôi phải thêm nhiều mã lỗi để bỏ qua (tôi biết nó không được khuyến khích, nhưng tôi biết tôi đang làm gì).

Sau khi thực hiện xong bước 7, tôi đã kiểm tra nhật ký mysql và ghi lại tên và vị trí của nhật ký bin và tiếp tục cho đến bước thứ 9. Trước bước thứ 10, tôi chỉ thực hiện change mastercho tệp nhật ký và vị trí nhật ký. Và tiếp tục từ bước 11. Tất cả có vẻ tốt với tôi.


-2

Bạn cần thay đổi uuid nô lệ trong auto.cnf để chủ có thể phân biệt hai nô lệ.

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.