2012-11-30 38 views
6

Tôi đang cố gắng xuất cơ sở dữ liệu MySQL rất lớn của chúng tôi (1.6GB - chủ yếu là BLOB) và nhập vào máy chủ mới. Tôi đã làm việc thông qua hầu hết các vấn đề và cuối cùng đã hoàn thành việc nhập khẩu mà không có bất kỳ lỗi nào. Sử dụng MySQL Query Browser Tôi chạy một truy vấn trên một bảng với các hình ảnh BLOB và lưu một đĩa vào đĩa (sử dụng biểu tượng lưu trong trình duyệt truy vấn). Khi tôi cố gắng mở tệp, tôi đã nhận được lỗi "định dạng hình ảnh không hợp lệ". Uh oh.Dữ liệu blob được xuất khác với dữ liệu DB

Sử dụng trình duyệt truy vấn Tôi đã kiểm tra giá trị trên cơ sở dữ liệu nguồn và cơ sở dữ liệu mới được nhập gần đây. Các giá trị khác nhau, tôi nghĩ vậy. Nó chỉ có thể là vấn đề mã hóa hoặc một cái gì đó. Đây là những gì tôi thấy:

Nguồn (dữ liệu hợp lệ) server:

FF D8 FF E0 00 10 4A 46 49 46 00 01 01 01 00 60 
00 60 00 00 FF DB 00 43 00 08 06 06 07 06 05 08 
and so on... 

máy chủ mới:

C3 BF C3 98 C3 BF C3 A0 00 10 4A 46 49 46 00 01 
01 01 00 60 00 60 00 00 C3 BF C3 9B 00 43 00 08 
and so on... 

Trong ví dụ này, nó dường như mắt người mới của tôi rằng có 3 byte thêm dữ liệu ở phía trước dữ liệu trên máy chủ "mới".

Sau đó, tôi đã xem tệp kết xuất sql bằng cách sử dụng 010 editor. Tôi đã tìm thấy dòng cho ví dụ cụ thể này và dưới đây là những gì tôi thấy:

FF D8 FF E0 5C 30 10 4A 46 49 46 5C 30 01 01 01 
5C 30 60 5C 30 60 5C 30 5C 30 FF DB 5C 30 43 5C 
30 08 06 06 07 06 05 08 and so on... 

Bây giờ tôi đã vượt qua đầu của tôi. Tôi thấy mẫu, tôi nhận thấy rằng cặp HEX 5C 30 có vẻ giống như 00 nhưng tôi không hiểu TẠI SAO. Tại thời điểm này, tôi có một máy chủ nguồn sắp bị xóa và một máy chủ mới mà tôi sợ đã nhập dữ liệu bị hỏng vào nó. Tôi hy vọng đây là một số loại vấn đề mã hóa có thể được giải quyết bằng cách thiết lập một biến toàn cầu trong MySQL nhưng tôi thực sự không biết.

Tôi cũng nên đề cập rằng khi tôi lưu tệp từ máy chủ nguồn (đang hoạt động) và máy chủ (hỏng) mới, kích thước tệp lớn hơn khoảng 40% cho tệp bị hỏng.

Tôi đã kiểm tra các biến bộ ký tự trên cả hai máy chủ:

SHOW VARIABLES LIKE '%char%' 

nguồn server:

character_set_client  utf8 
character_set_connection utf8 
character_set_database latin1 
character_set_filesystem binary 
character_set_results  utf8 
character_set_server  latin1 
character_set_system  utf8 

mới server:

character_set_client  utf8 
character_set_connection utf8 
character_set_database latin1 
character_set_filesystem binary 
character_set_results  utf8 
character_set_server  latin1 
character_set_system  utf8 

Họ đều giống nhau.

+1

FYI 1,6 Gb chỉ là một đứa trẻ về cơ sở dữ liệu! – briantyler

+0

Chuỗi hex '5C 30' là' \ 0', do đó trông giống như một số hành vi lạ hoặc với trình soạn thảo hoặc nội dung của kết xuất SQL đã bị thao tác/hỏng bằng cách nào đó. – cmbuckley

Trả lời

6

Các dữ liệu bị hỏng từ cơ sở dữ liệu mới trông giống như kết quả của việc chuyển đổi dữ liệu nguồn từ ISO-8859-1 sang UTF-8 (ví dụ U + 00FF - Y - là FF trong cựu và C3 BF ở sau).

Vì BLOB không có bộ ký tự, mã hóa ký tự không được kiểm soát bởi các biến máy chủ; Tôi nghi ngờ mysqldump là xuất dữ liệu BLOB của bạn trong tệp được mã hóa UTF-8 (which is the default) và được mã hóa theo cách nào đó, thông qua một số kết hợp cài đặt máy chủ và tùy chọn được chuyển đến mysqldump.

Giải pháp tốt nhất có thể sử dụng tùy chọn --hex-blob khi xuất khẩu lĩnh vực BLOB, mà sẽ dẫn đến một cái gì đó như:

INSERT INTO `table` VALUES (0xFFD8FFE0...); 
Các vấn đề liên quan