Hướng dẫn mysqldump pipe to mysql - đường ống mysqldump tới mysql
Đôi khi tôi cần sao chép cơ sở dữ liệu MySQL (DB1) vào cơ sở dữ liệu khác (DB2). Tôi thấy lệnh này ngắn gọn và hiệu quả:
Nó hoạt động tốt, nhưng bây giờ nó bị hỏng với lỗi sau:
Điều đầu tiên xuất hiện trong tâm trí là cơ sở dữ liệu quá lớn (Dump SQL không nén là> 1G, 1090526011 byte tại thời điểm này, chính xác là) cho đường ống như thế này. Khi tôi làm 5 và sau đó 6 nó hoạt động tốt, không có lỗi. Bảng được đề cập trong thông báo lỗi (một số_table_name) không lớn hoặc đặc biệt.Ý tưởng thứ hai xuất phát từ ấn tượng rằng thông báo lỗi có thể bị cắt đứt và nó nói
Nghiên cứu nhanh về điều đó nói rằng có thể đạt được số lượng tệp mở tối đa (đối với MySQL và/hoặc hệ thống). Vì vậy, tôi đã thử thêm 7 vào 8 và nâng 9, nhưng không có may mắn, cùng một lỗi.Giải pháp rõ ràng là thực hiện đổ và sau đó nhập (vì nó hoạt động tốt), nhưng đường ống có vẻ tốt hơn và sạch hơn đối với tôi (hãy cho tôi biết nếu tôi sai), cộng với tôi tò mò tìm hiểu nguyên nhân gây ra vấn đề này. Tôi đã đạt được một số giới hạn ảnh hưởng đến đường ống chỉ huy? Tôi đã thực hiện việc này trên máy chủ lưu trữ, chạy MySQL 5.1.60 trên Linux và trên máy phát triển của tôi - MySQL 5.1.58 trên Linux. Latter cho một chút lỗi khác nhau:
Cập nhật: Vấn đề được giải quyết bằng cách thực hiện kết xuất và nhập riêng biệt, không có ống. Mặc dù tôi cảm thấy nó không thực sự trả lời cho câu hỏi của tôi, những gợi ý của Ssmusoke là nhiều nhất dẫn đến câu trả lời được chấp nhận. 13.2.7 & nbsp; tải dữ liệu tải
Câu lệnh 1 đọc các hàng từ tệp văn bản vào một bảng ở tốc độ rất cao. Tệp có thể được đọc từ máy chủ máy chủ hoặc máy chủ khách, tùy thuộc vào việc sửa đổi 2 được đưa ra. 2 cũng ảnh hưởng đến việc giải thích dữ liệu và xử lý lỗi.
1 là bổ sung của 5. . Để đọc lại tệp vào bảng, hãy sử dụng 1. Cú pháp của các mệnh đề 8 và 9 là giống nhau cho cả hai câu lệnh.Tiện ích MySQLImport cung cấp một cách khác để tải các tệp dữ liệu; Nó hoạt động bằng cách gửi câu lệnh 1 đến máy chủ. Xem Phần & NBSP; 4.5.5, MySQLImport - một chương trình nhập dữ liệu.mysqlimport utility provides another way to load data files; it operates by sending a 1 statement to the server. See
Section 4.5.5, “mysqlimport — A Data Import Program”. Để biết thông tin về hiệu quả của 1 so với 1 và tăng tốc 1, xem Phần & NBSP; 8.2.5.1, Tối ưu hóa các câu lệnh chèn.
Bộ ký tự tệp đầu vàoVị trí tệp đầu vào Yêu cầu bảo mật“no conversion.” 8 và cài đặt của 9 không ảnh hưởng đến việc giải thích nội dung tệp.
1 diễn giải tất cả các trường trong tệp có cùng một bộ ký tự, bất kể các loại dữ liệu của các cột có giá trị trường được tải. Để giải thích đúng của tệp, bạn phải đảm bảo rằng nó được viết với bộ ký tự chính xác. Ví dụ: nếu bạn viết một tệp dữ liệu bằng mysqldump -T hoặc bằng cách phát hành câu lệnh 1 trong MySQL, hãy chắc chắn sử dụng tùy chọn 2 để ghi đầu ra trong bộ ký tự được sử dụng khi tệp được tải với 1.mysqldump -T or by issuing a 1 statement in
mysql, be sure to use a 2 option to write output in the character set to be used when the file is loaded with
1. Ghi chú Không thể tải các tệp dữ liệu sử dụng bộ ký tự 4, 5, 6 hoặc 7.Vị trí tệp đầu vàoCác quy tắc này xác định vị trí tệp đầu vào 8:
Các quy tắc không phải là không có nghĩa là máy chủ đọc một tệp có tên là 4 liên quan đến thư mục dữ liệu của nó, trong khi nó đọc một tệp có tên 5 từ thư mục cơ sở dữ liệu của cơ sở dữ liệu mặc định. Ví dụ: nếu câu lệnh 1 sau được thực thi trong khi 7 là cơ sở dữ liệu mặc định, máy chủ sẽ đọc tệp 8 từ thư mục cơ sở dữ liệu cho 7, mặc dù câu lệnh tải rõ ràng vào bảng trong cơ sở dữ liệu 0:
Ghi chú Không thể tải các tệp dữ liệu sử dụng bộ ký tự 4, 5, 6 hoặc 7.Vị trí tệp đầu vàoCác quy tắc này xác định vị trí tệp đầu vào 8:
Nếu 2 được chỉ định, tệp phải được đặt trên máy chủ khách. Chương trình máy khách đọc tệp, định vị nó như sau:Nếu tên tệp là tên đường dẫn tuyệt đối, chương trình máy khách sử dụng nó như đã đưa ra.Nếu tên tệp là tên đường dẫn tương đối, chương trình máy khách sẽ tìm tệp liên quan đến thư mục gọi của nó.
Máy chủ cũng sử dụng các quy tắc không phải -________ 32 để xác định các tệp 2 cho câu lệnh 3.Yêu cầu bảo mật Đối với hoạt động không tải 32, máy chủ đọc một tệp văn bản nằm trên máy chủ máy chủ, do đó các yêu cầu bảo mật này phải được thỏa mãn:
Xử lý trường và dòngĐối với cả các câu lệnh 1 và 8, cú pháp của các mệnh đề 8 và 9 là như nhau. Cả hai mệnh đề đều là tùy chọn, nhưng 8 phải đi trước 9 nếu cả hai được chỉ định.Nếu bạn chỉ định một mệnh đề 8, mỗi phân nhóm của nó ( 04, 05 và 06) cũng là tùy chọn, ngoại trừ bạn phải chỉ định ít nhất một trong số chúng. Các đối số cho các mệnh đề này được phép chỉ chứa các ký tự ASCII.Nếu bạn chỉ định điều khoản không 8 hoặc 9, các mặc định giống như khi bạn đã viết điều này:
Backslash là ký tự thoát MySQL trong các chuỗi trong các câu lệnh SQL. Do đó, để chỉ định một dấu gạch chéo ngược theo nghĩa đen, bạn phải chỉ định hai dấu gạch chéo ngược cho giá trị được hiểu là một dấu gạch chéo ngược. Trình tự thoát 09 và 10 chỉ định Tab và các ký tự mới.Nói cách khác, mặc định khiến 8 hoạt động như sau khi đọc đầu vào:
Ngược lại, mặc định khiến 8 hành động như sau khi viết đầu ra:
Ghi chú Đối với một tệp văn bản được tạo trên hệ thống Windows, việc đọc tệp thích hợp có thể yêu cầu 20 vì các chương trình Windows thường sử dụng hai ký tự làm bộ kết thúc dòng. Một số chương trình, chẳng hạn như WordPad, có thể sử dụng 21 làm người kết thúc dòng khi viết tệp. Để đọc các tệp như vậy, hãy sử dụng 22.WordPad, might use 21
as a line terminator when writing files. To read such files, use 22. Nếu tất cả các dòng đầu vào có một tiền tố chung mà bạn muốn bỏ qua, bạn có thể sử dụng 23 'để bỏ qua tiền tố và bất cứ điều gì trước đó. Nếu một dòng không bao gồm tiền tố, toàn bộ dòng bị bỏ qua. Giả sử rằng bạn đưa ra tuyên bố sau:and anything before it. If a line does not include the prefix, the entire line is skipped. Suppose that you issue the following statement:
Nếu tệp dữ liệu trông như thế này:
Các hàng kết quả là 24 và 25. Hàng thứ ba trong tệp bị bỏ qua vì nó không chứa tiền tố.Mệnh đề dòng 26 có thể được sử dụng để bỏ qua các dòng khi bắt đầu tệp. Ví dụ: bạn có thể sử dụng 27 để bỏ qua một dòng tiêu đề ban đầu chứa tên cột:
Khi bạn sử dụng 1 song song với 1 để ghi dữ liệu từ cơ sở dữ liệu vào một tệp và sau đó đọc lại tệp vào cơ sở dữ liệu sau đó, các tùy chọn xử lý trường và dòng cho cả hai câu lệnh phải khớp. Mặt khác, 8 không diễn giải nội dung của tệp đúng cách. Giả sử rằng bạn sử dụng 8 để viết một tệp với các trường được phân tách bằng dấu phẩy:
Để đọc tệp phân loại dấu phẩy, câu lệnh chính xác là:
Nếu thay vào đó, bạn đã cố gắng đọc tệp với câu lệnh được hiển thị sau, nó sẽ không hoạt động vì nó hướng dẫn 1 tìm các tab giữa các trường:
Kết quả có thể là mỗi dòng đầu vào sẽ được hiểu là một trường duy nhất.
1 có thể được sử dụng để đọc các tệp thu được từ các nguồn bên ngoài. Ví dụ, nhiều chương trình có thể xuất dữ liệu theo định dạng giá trị phân tách dấu phẩy (CSV), sao cho các dòng có các trường được phân tách bằng dấu phẩy và được đặt trong các dấu ngoặc kép, với một dòng tên cột ban đầu. Nếu các dòng trong một tệp như vậy bị chấm dứt bởi các cặp return/newline vận chuyển, thì câu lệnh được hiển thị ở đây minh họa các tùy chọn xử lý trường và dòng bạn sẽ sử dụng để tải tệp: 0Nếu các giá trị đầu vào không nhất thiết được đặt trong các dấu ngoặc kép, hãy sử dụng 34 trước tùy chọn 35.Bất kỳ tùy chọn xử lý trường hoặc dòng nào cũng có thể chỉ định một chuỗi trống ( 36). Nếu không trống, các giá trị 37 và 38 phải là một ký tự duy nhất. Các giá trị 39, 40 và 41 có thể nhiều hơn một ký tự. Ví dụ: để ghi các dòng bị chấm dứt bởi các cặp trả về vận chuyển/linefeed hoặc để đọc một tệp chứa các dòng đó, chỉ định mệnh đề 42.Để đọc một tệp chứa những trò đùa được phân tách bằng các dòng bao gồm 43, bạn có thể làm điều này 1
37 Kiểm soát trích dẫn các trường. Đối với đầu ra ( 8), nếu bạn bỏ qua từ 34, tất cả các trường được đặt bởi ký tự 35. Một ví dụ về đầu ra đó (sử dụng dấu phẩy làm dấu phân cách trường) được hiển thị ở đây: 2Nếu bạn chỉ định 34, ký tự 35 chỉ được sử dụng để đặt các giá trị từ các cột có kiểu dữ liệu chuỗi (chẳng hạn như 50, 51, 52 hoặc 53): 3Sự xuất hiện của ký tự 35 trong một giá trị trường được thoát ra bằng tiền tố chúng với ký tự 06. Ngoài ra, nếu bạn chỉ định giá trị 06 trống, có thể vô tình tạo ra đầu ra không thể đọc đúng bởi 1. Ví dụ, đầu ra trước chỉ hiển thị sẽ xuất hiện như sau nếu ký tự thoát trống. Quan sát rằng trường thứ hai trong dòng thứ tư chứa dấu phẩy theo trích dẫn, (sai lầm) dường như chấm dứt trường: 4Đối với đầu vào, ký tự 35, nếu có, bị tước khỏi các đầu của các giá trị trường. .Nếu trường bắt đầu với ký tự 35, các phiên bản của ký tự đó được công nhận là kết thúc một giá trị trường chỉ khi theo sau là chuỗi trường hoặc dòng 04. Để tránh sự mơ hồ, sự xuất hiện của ký tự 35 trong một giá trị trường có thể được nhân đôi và được hiểu là một trường hợp duy nhất của ký tự. Ví dụ: nếu 66 được chỉ định, dấu ngoặc kép được xử lý như thể hiện ở đây: 5
38 Kiểm soát cách đọc hoặc viết các ký tự đặc biệt:
Trong một số trường hợp nhất định, các tùy chọn xử lý trường và dòng tương tác:
Xử lý các giá trị 70 khác nhau tùy theo các tùy chọn 8 và 9 đang sử dụng:
Một nỗ lực để tải 70 vào cột 32 tạo ra cảnh báo hoặc lỗi theo các quy tắc được mô tả trong gán giá trị cột.Một số trường hợp không được hỗ trợ bởi 8:
Đặc tả danh sách cộtVí dụ sau tải tất cả các cột của bảng 46: 7Theo mặc định, khi không có danh sách cột nào được cung cấp ở cuối câu lệnh 1, các dòng đầu vào dự kiến sẽ chứa một trường cho mỗi cột bảng. Nếu bạn chỉ muốn tải một số cột của bảng, hãy chỉ định danh sách cột: 8Bạn cũng phải chỉ định danh sách cột nếu thứ tự của các trường trong tệp đầu vào khác với thứ tự của các cột trong bảng. Mặt khác, MySQL không thể cho biết cách khớp các trường đầu vào với các cột bảng. Tiền xử lý đầu vàoMỗi phiên bản của 48 trong cú pháp 1 là tên cột hoặc biến người dùng. Với các biến người dùng, mệnh đề 50 cho phép bạn thực hiện các biến đổi tiền xử lý trên các giá trị của chúng trước khi gán kết quả cho các cột.Các biến người dùng trong mệnh đề 50 có thể được sử dụng theo nhiều cách. Ví dụ sau sử dụng cột đầu vào đầu tiên trực tiếp cho giá trị của 52 và gán cột đầu vào thứ hai cho biến người dùng chịu hoạt động phân chia trước khi được sử dụng cho giá trị 53: 9Điều khoản 50 có thể được sử dụng để cung cấp các giá trị không có nguồn gốc từ tệp đầu vào. Câu lệnh sau đây đặt 55 cho ngày và giờ hiện tại: 0Bạn cũng có thể loại bỏ giá trị đầu vào bằng cách gán nó cho biến người dùng và không gán biến cho bất kỳ cột bảng nào: 1Việc sử dụng danh sách cột/biến và mệnh đề 50 phải tuân theo các hạn chế sau:
Gán giá trị cột
Để xử lý một dòng đầu vào, 8 chia nó thành các trường và sử dụng các giá trị theo danh sách cột/biến và mệnh đề 50, nếu chúng có mặt. Sau đó hàng kết quả được chèn vào bảng. Nếu có 63 hoặc 64 kích hoạt cho bảng, chúng sẽ được kích hoạt trước hoặc sau khi chèn hàng, tương ứng.Giải thích các giá trị trường và gán cho các cột bảng phụ thuộc vào các yếu tố sau:
Những yếu tố đó kết hợp để tạo ra sự giải thích dữ liệu hạn chế hoặc không hạn chế bằng 1:
Giải thích dữ liệu hạn chế sử dụng các quy tắc sau:
Ngược lại, giải thích dữ liệu không hạn chế sử dụng các quy tắc này:
Các cột 94 chỉ được đặt thành ngày và thời gian hiện tại nếu có giá trị 70 cho cột (nghĩa là 78) và cột không được khai báo để cho phép các giá trị 70 hoặc nếu cột mặc định của cột 94 là hiện tại và nó được bỏ qua khỏi danh sách trường khi một danh sách trường được chỉ định.
1 coi tất cả các đầu vào là chuỗi, vì vậy bạn không thể sử dụng các giá trị số cho các cột 53 hoặc 50 theo cách bạn có thể với các câu lệnh 1. Tất cả các giá trị 53 và 50 phải được chỉ định là chuỗi.Các giá trị 05 không thể được tải trực tiếp bằng cách sử dụng ký hiệu nhị phân (ví dụ: 06). Để làm việc xung quanh điều này, hãy sử dụng mệnh đề 50 để loại bỏ 08 hàng đầu và theo dõi 09 và thực hiện chuyển đổi cơ sở-2 sang cơ sở-10 để MySQL tải các giá trị vào cột 05 đúng cách: 2Đối với các giá trị 05 trong ký hiệu nhị phân 12 (ví dụ: 13), hãy sử dụng điều khoản 50 này để loại bỏ 12 hàng đầu: 3Hỗ trợ bảng phân vùng
1 hỗ trợ lựa chọn phân vùng rõ ràng bằng mệnh đề 17 với danh sách một hoặc nhiều tên phân tách dấu phẩy của các phân vùng, phân vùng hoặc cả hai. Khi mệnh đề này được sử dụng, nếu bất kỳ hàng nào từ tệp không thể được chèn vào bất kỳ phân vùng hoặc phân vùng nào có tên trong danh sách, câu lệnh không thành công với lỗi tìm thấy một hàng không khớp với bộ phân vùng đã cho. Để biết thêm thông tin và ví dụ, xem Phần & NBSP; 24.5, Lựa chọn phân vùng.Found a row not matching the given partition set. For more information and examples, see Section 24.5, “Partition Selection”. Cân nhắc đồng thờiVới công cụ sửa đổi 18, việc thực thi câu lệnh 1 bị trì hoãn cho đến khi không có máy khách nào khác đọc từ bảng. Điều này chỉ ảnh hưởng đến các công cụ lưu trữ chỉ sử dụng khóa cấp bảng (chẳng hạn như 20, 21 và 22).Với công cụ sửa đổi 23 và bảng 20 thỏa mãn điều kiện để chèn đồng thời (nghĩa là nó không chứa các khối miễn phí ở giữa), các luồng khác có thể lấy dữ liệu từ bảng trong khi 1 đang thực thi. Trình sửa đổi này ảnh hưởng đến hiệu suất của 8 một chút, ngay cả khi không có luồng nào khác sử dụng bảng cùng một lúc.Cân nhắc nhân rộng
1 được coi là không an toàn cho sao chép dựa trên tuyên bố. Nếu bạn sử dụng 1 với 29, mỗi bản sao mà các thay đổi sẽ được áp dụng sẽ tạo ra một tệp tạm thời chứa dữ liệu. Tệp tạm thời này không được mã hóa, ngay cả khi mã hóa nhật ký nhị phân hoạt động trên nguồn, nếu cần mã hóa, hãy sử dụng định dạng ghi nhị phân dựa trên hàng hoặc hỗn hợp thay thế, thay vào đó, các bản sao không tạo tệp tạm thời. Để biết thêm thông tin về sự tương tác giữa 1 và sao chép, xem Phần & NBSP; 17.5.1.19, Dữ liệu sao chép và tải dữ liệu.Chủ đề linh tinhTrên Unix, nếu bạn cần 1 để đọc từ đường ống, bạn có thể sử dụng kỹ thuật sau (ví dụ tải một danh sách thư mục 32 vào bảng 33): 4Tại đây, bạn phải chạy lệnh tạo dữ liệu sẽ được tải và các lệnh MySQL trên các thiết bị đầu cuối riêng biệt hoặc chạy quy trình tạo dữ liệu trong nền (như trong ví dụ trước). Nếu bạn không làm điều này, đường ống sẽ chặn cho đến khi dữ liệu được đọc bởi quy trình MySQL.mysql commands either on separate terminals, or run the data generation process in the background (as shown in the preceding example). If you do not do this, the pipe blocks until data is read by the mysql process. |