Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Các phương pháp hay nhất của mysqldump:Phần 1 - Điều kiện tiên quyết của MySQL

Mysqldump là một tiện ích khách được sử dụng để thực hiện sao lưu hợp lý cơ sở dữ liệu MySQL. Công cụ di chuyển phổ biến này hữu ích cho các trường hợp sử dụng MySQL khác nhau như:

  • Sao lưu và khôi phục cơ sở dữ liệu.
  • Di chuyển dữ liệu từ máy chủ này sang máy chủ khác.
  • Di chuyển dữ liệu qua các nhà cung cấp dịch vụ MySQL được quản lý khác nhau.
  • Di chuyển dữ liệu giữa các phiên bản MySQL khác nhau.

Mysqldump hoạt động bằng cách đọc các đối tượng cơ sở dữ liệu nguồn và tạo một tập hợp các câu lệnh SQL được lưu trữ trong tệp kết xuất. Bằng cách phát lại các câu lệnh này trên máy chủ cơ sở dữ liệu đích, dữ liệu ban đầu sẽ được tái tạo. Vì mô hình này sử dụng việc đọc toàn bộ cơ sở dữ liệu và sau đó xây dựng lại về cơ bản, cả kết xuất và khôi phục đều là các hoạt động tốn thời gian đối với một cơ sở dữ liệu lớn. Quá trình này thậm chí có thể trở nên phức tạp nếu bạn gặp lỗi trong khi kết xuất hoặc khôi phục vì nó có thể khiến bạn phải khắc phục sự cố và chạy lại các hoạt động. Đây là lý do tại sao điều quan trọng là phải lập kế hoạch tốt trước khi bạn thực hiện việc đổ và khôi phục hoạt động.

Trong loạt blog gồm 2 phần này, chúng tôi thảo luận về một số khía cạnh phổ biến mà bạn nên xử lý trước để đảm bảo hoạt động kết xuất và khôi phục thành công. Trong phần đầu tiên, chúng tôi tập trung vào các điều kiện tiên quyết bạn cần quan tâm trong khi nhập dữ liệu bảng MySQL và trong phần thứ hai, chúng tôi sẽ nói về cách xử lý việc nhập các đối tượng và chế độ xem chương trình được lưu trữ.

1. Yêu cầu về không gian

Trước hết, điều quan trọng là đảm bảo rằng khối lượng cơ sở dữ liệu đích của bạn có đủ không gian để chứa dữ liệu đã nhập. Cụ thể, bạn cần phải thận trọng nếu nhật ký nhị phân được bật trên cơ sở dữ liệu MySQL đích của bạn, vì nhật ký nhị phân được tạo trong khi nhập dữ liệu có thể có kích thước gần như tương đương với chính dữ liệu. Nhật ký nhị phân là cần thiết nếu bạn muốn khôi phục dữ liệu của mình trên một máy chủ và muốn nó được sao chép. Trong những trường hợp như vậy, bạn nên lập kế hoạch kích thước đích lớn hơn gấp đôi kích thước của cơ sở dữ liệu nguồn.

Điều quan trọng nữa là đảm bảo có đủ dung lượng trên ổ đĩa mà bạn tạo tệp đầu ra mysqldump. Nếu không có những biện pháp phòng ngừa này, bạn có thể thấy kết xuất hoặc khôi phục của mình không thành công do không đủ dung lượng sau khi chạy trong một thời gian dài, điều này làm mất thời gian và công sức làm việc của bạn.

2. Sql_mode

cài đặt sql_mode cho máy chủ MySQL xác định cú pháp câu lệnh SQL và kiểm tra xác thực dữ liệu mà máy chủ thực hiện cho các hoạt động. Điều quan trọng là đảm bảo sql_mode của máy chủ MySQL nguồn và đích tương thích với nhau, hoặc bạn có thể gặp lỗi khi khôi phục kết xuất mà bạn đã thực hiện. Hãy chứng minh điều này bằng một ví dụ.

Giả sử bạn có một bảng trên nguồn của mình có cột ngày có các mục nhập là 0 ngày:

 mysql> hiển thị lịch tạo bảng; ---------------------------------------- ---------------- + | Bảng | Tạo bảng | ----------------------------------------------- --------- + | lên lịch | TẠO BẢNG `Sched` (` id` int (11) DEFAULT NULL, `ts` date DEFAULT NULL) ENGINE =InnoDB DEFAULT CHARSET =latin1 | + ------- + ---------- -------------------------------------------------- -------------------------------------------------- ------- mysql> select * from Schedule; + ------ + ------------ + | id | ts | + ------ + ------------ + | 1 | 2020-01-12 || 2 | 0000-00-00 | + ------ + ------------ + 

Giả sử sql_mode nghiêm ngặt (và NO_ZERO_DATE ) bị tắt trên nguồn, nhưng được bật trên đích - việc khôi phục các hàng như vậy sẽ dẫn đến lỗi, chẳng hạn như:

 ERROR 1292 (22007) ở dòng 40:Giá trị ngày không chính xác:'0000-00-00' cho cột 'ts' 'ở hàng 2 

Thông thường, bạn sẽ gặp các vấn đề như vậy nếu bạn đang thực hiện kết xuất nhỏ gọn bằng cách bật tùy chọn thu gọn như một phần của mysqldump.

Nếu tính năng nén bị tắt (theo mặc định) thì bạn sẽ không gặp phải vấn đề này vì mysqldump tạo câu lệnh điều kiện sau như một phần của kết xuất:

 / *! 40101 SET @OLD_SQL_MODE =@@ SQL_MODE, SQL_MODE ='NO_AUTO_VALUE_ON_ZERO' * /; 

Điều này có nghĩa là trong quá trình khôi phục sql_mode được đặt thành 'NO_AUTO_VALUE_ON_ZERO' trước khi khôi phục dữ liệu bảng để quá trình khôi phục diễn ra tốt đẹp.

Phương pháp hay nhất cho mysqldump:Phần 1 - Điều kiện tiên quyết của MySQLNhấp vào Tweet

3. Unique_checks và Foreign_key_checks

Theo mặc định (nếu bạn không sử dụng tùy chọn –compact), mysqldump cũng đặt như sau:

 / *! 40014 SET @OLD_UNIQUE_CHECKS =@@ UNIQUE_CHECKS, UNIQUE_CHECKS =0 * /; / *! 40014 SET @OLD_FOREIGN_KEY_CHECKS =@@ FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS =0 * /; 
 

Như đã giải thích ở đây, bạn có thể tăng tốc hoạt động khôi phục bằng cách tạm thời tắt tính năng kiểm tra tính duy nhất trong phiên. Đối với các bảng lớn, điều này tiết kiệm rất nhiều I / O đĩa vì InnoDB có thể sử dụng bộ đệm thay đổi của nó để ghi các bản ghi chỉ mục phụ trong một loạt.

Nếu bạn có FOREIGN KEY các ràng buộc trong bảng của bạn, bạn có thể tăng tốc hoạt động khôi phục bảng bằng cách tắt kiểm tra khóa ngoại trong thời gian của phiên khôi phục:Đối với các bảng lớn, điều này có thể tiết kiệm rất nhiều I / O đĩa.

Đang tắt FOREIGN_KEY_CHECKS cũng sẽ giúp tránh các lỗi do kiểm tra ràng buộc khóa trước trong quá trình khôi phục. Bất cứ khi nào một bảng có ràng buộc khóa foregin được tạo, MySQL sẽ mong đợi rằng bảng mẹ được tham chiếu bởi khóa foregin đã tồn tại. Đây là một vấn đề vì tiện ích mysqldump kết xuất các bảng theo thứ tự bảng chữ cái. Hãy lấy một ví dụ để chứng minh điều này.

Trên cơ sở dữ liệu nguồn, chúng ta có hai bảng:

 TẠO BẢNG `solution_table` (` num1` int (11) NOT NULL, `num2` int (11) DEFAULT NULL, PRIMARY KEY (` num1`)); TẠO BẢNG `ref_table` (` key` int (11) ) DEFAULT NULL, `ref_num` int (11) DEFAULT NULL, KEY` ref_num` (`ref_num`), CONSTRAINT` ref_num_ibfk_1` FOREIGN KEY (`ref_num`) TÀI LIỆU THAM KHẢO` solution_table` (`num1`)) 

Bảng ref_table có ràng buộc khóa ngoại tham chiếu đến solution_table . Dựa trên thứ tự bảng chữ cái, đầu tiên mysqldump kết xuất nội dung của ref_table . Khi điều này được phát lại tại thời điểm khôi phục, nó sẽ không thành công với lỗi:

 ERROR 1215 (HY000) ở dòng 50:Không thể thêm ràng buộc khóa ngoại - 

Điều này xảy ra khi thực hiện câu lệnh tạo bảng cho ‘ref_table’ .

Tóm lại, hãy lưu ý các vấn đề bạn có thể gặp phải, nếu bạn chỉ định --compact trong khi chạy mysqldump.

4. Các đặc quyền cần thiết để chạy mysqldump

Đặc quyền tối thiểu mà mysqldump yêu cầu để kết xuất cơ sở dữ liệu là SELECT trên cơ sở dữ liệu đó.

Tuy nhiên, nếu cơ sở dữ liệu của bạn có các chế độ xem, bạn cũng sẽ cần quyền CHIA SẺ CHẾ ĐỘ XEM, vì mysqldump luôn kết xuất các chế độ xem cùng với các bảng của cơ sở dữ liệu. Giả sử bạn không có SHOW VIEW quyền, sau đó mysqldump sẽ không thành công với:

 mysqldump:Không thể thực thi 'hiển thị tạo bảng' ivew ':Lệnh SHOW VIEW bị từ chối đối với người dùng ‘dumpuser’@'172.31.18.79' cho bảng 'iview' (1142) 

Một điểm quan tâm khác là nếu trình kết xuất của bạn có SELECT chỉ quyền trên một bảng cụ thể của cơ sở dữ liệu, mysqldump sẽ chỉ kết xuất dữ liệu cho bảng cụ thể đó và tự động bỏ qua bất kỳ bảng hoặc chế độ xem nào khác.

Vì vậy, hãy đảm bảo rằng người dùng thực thi mysqldump có tất cả các đặc quyền thích hợp trả trước để tránh bất kỳ sự bất ngờ hoặc thất bại nào sau này.

Quan tâm đến giải pháp MySQL được quản lý đầy đủ?

Để tìm hiểu thêm về cách một nhà cung cấp DBaaS như ScaleGrid có thể giúp bạn quản lý cơ sở dữ liệu MySQL của mình, hãy xem trang MySQL của chúng tôi. Xem cách ScaleGrid có thể cho phép bạn tập trung nhiều hơn vào việc phát triển sản phẩm của mình và ít tập trung hơn vào việc quản lý cơ sở dữ liệu.

5. Max_allowed_packet

Gói thông tin liên lạc lớn nhất do mysql xử lý được xác định bởi cài đặt max_allowed_packet . Trong ngữ cảnh nhập, một gói thông tin liên lạc là một câu lệnh SQL đơn được gửi đến máy chủ MySQL trong quá trình khôi phục HOẶC một hàng duy nhất được gửi đến máy khách trong quá trình kết xuất.

Giá trị mặc định của max_allowed_packet cho mysqldump là 24MB. nếu mysqldump nhận được một gói lớn hơn mức này, thì bạn có thể gặp phải lỗi:

 mysqldump:Lỗi 2020:Có gói lớn hơn byte 'max_allowed_packet' khi kết xuất bảng `lớn1` tại hàng:2. 

Vì vậy, hãy đảm bảo rằng mysqldump sử dụng cùng một giá trị hoặc giá trị lớn hơn của max_allowed_packet được định cấu hình trên phiên bản MySQL nguồn.

Tùy chọn có thể được chỉ định bằng cờ --max-allowed-packet=value khi gọi mysqldump.

Khi khôi phục kết xuất, hãy đảm bảo rằng max_allowed_packet kích thước của máy chủ đích của bạn đủ lớn để nhận các gói từ tệp kết xuất.

Nếu không, trong quá trình khôi phục kết xuất, bạn sẽ thấy thông báo lỗi:

 ERROR 2006 (HY000) ở dòng 70:Máy chủ MySQL đã biến mất 

Lỗi này có thể gây hiểu nhầm một chút vì bạn có thể nghĩ rằng máy chủ MySQL đã tắt hoặc gặp sự cố. Tuy nhiên, điều đó chỉ có nghĩa là máy chủ đã nhận được một gói có kích thước lớn hơn kích thước được định cấu hình của nó là max_allowed_packet . Một lần nữa, phương pháp hay nhất là đảm bảo rằng max_allowed_packet giá trị cho máy chủ đích của bạn giống với giá trị trong máy chủ nguồn. Đây cũng là một cài đặt quan trọng có thể được kiểm tra và thiết lập một cách thích hợp ngay từ đầu, thay vì phải đối mặt với các lỗi sau đó.

Trong phần đầu tiên của loạt bài mysqldump này, chúng tôi đã thảo luận về các điều kiện tiên quyết để kết xuất và khôi phục hoạt động thành công cho cơ sở dữ liệu MySQL lớn nhằm giúp bạn tránh nhiều lần thử và tốn thời gian không hiệu quả.

Trong phần tiếp theo, chúng ta sẽ thảo luận về các phương pháp hay nhất để nhập các chương trình và chế độ xem được lưu trữ từ cơ sở dữ liệu MySQL của bạn.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tôi có thể tạo cơ sở dữ liệu bằng PDO trong PHP không?

  2. Kết nối bằng tương đương trước cho MySQL

  3. Danh sách SELECT không nằm trong mệnh đề GROUP BY và chứa cột không được tổng hợp .... không tương thích với sql_mode =only_full_group_by

  4. Django:Bảng không tồn tại

  5. Làm thế nào để tính toán tổng doanh số mỗi tháng trong MySQL?