2015-02-13 22 views
9

Tôi có hai máy chủ Postgres 9.3 trong bản sao đồng bộ.PgAdmin III, trạng thái máy chủ mở cho "chuỗi byte không hợp lệ để mã hóa UTF8"

Tôi đã cần khởi động lại nô lệ để tải archive_cleanup_command mới trong recovery.conf.

Máy chủ khởi động lại chính xác và giờ đây hoàn toàn đồng bộ với máy chủ chính.

Nhưng khi tôi mở "tình trạng Server" bảng điều khiển cho máy chủ nô lệ trong pgAdmin III (mà thực thi nằm trên server của chương trình), tôi nhận được một số lỗi như thế này:

invalid byte sequence for encoding “UTF8” cộng với một số mã hex

enter image description here

Có thể là do tôi đặt dấu ngã ~ trong số archive_cleanup_command, nhưng nó không hoạt động, sau đó tôi đã xóa nó và lệnh hoạt động chính xác.

lẽ đó ~ đã được viết ở đâu đó và nó không phải là một char hợp lệ ... nhưng tôi cũng xóa các bản ghi ...

Log của máy chủ nô lệ có rất nhiều dòng như sau:

2015-02-13 11:11:32 CET ERROR: invalid byte sequence for encoding “UTF8”: 0xe8 0x20 0x73 
2015-02-13 11:11:32 CET STATEMENT: SELECT pg_file_read('pg_log/postgresql-2015-02-13_111038.log', 0, 50000) 

Lưu ý rằng postgresql-2015-02-13_111038.log là nhật ký cuối cùng, từ đó tôi nhận được những dòng này.

+0

Bạn có thông số cấu hình 'lc_messages' được đặt thành? Ngoài ra, hãy xem [bài đăng trên diễn đàn tiếng Pháp] (http://forums.postgresql.fr/viewtopic.php?id=1258) và [báo cáo lỗi này] (http://www.postgresql.org/message-id/201009161112. [email protected]) – harmic

+0

Cũng có liên quan để biết: hệ điều hành nào bạn đang chạy các cơ sở dữ liệu này? – harmic

+0

@harmic: Windows 7. – Teejay

Trả lời

0

Đó là do postgresql.log của bạn bị hỏng như được nêu trong câu lệnh 'select pf_file_read ....'.

Nếu bạn thực hiện "chạm" (sau bản sao lưu nhật ký của bạn) trên nhật ký máy chủ và kết nối lại, bạn sẽ không thấy lỗi unicode này nữa và do đó, bạn sẽ có thể sử dụng pgadmin III hơn nữa .

+1

Tôi không thấy cách 'touch' có thể *** hủy đăng nhập tệp. .. bằng cách này tôi cũng đã cố gắng xóa hoàn toàn nhật ký ... – Teejay

4

Sự cố bạn gặp phải là cài đặt miền địa phương lc_messages được đặt thành mã hóa khác với mã hóa của (các) cơ sở dữ liệu. Kết quả là, một số thư được ghi vào nhật ký bằng cách sử dụng mã hóa Windows-1252, trong khi khi bạn cố gắng sử dụng PgAdmin để xem nhật ký, nó cố gắng diễn giải tệp bằng UTF-8. Một số chuỗi byte được ghi trong nhật ký không hợp lệ UTF-8, dẫn đến lỗi.

Thực tế, cách thức mà các miền địa phương khác nhau tương tác trong postgresql có thể dẫn đến mã hóa hỗn hợp trong tệp nhật ký. Có một Bug Report về điều này, nhưng có vẻ như nó chưa được giải quyết.

Có lẽ cách dễ nhất để giải quyết vấn đề này là đặt lc_messages thành English_United States.UTF-8.

Nó cũng sẽ thích hợp hơn để có lc_messages căn chỉnh trên tất cả các cơ sở dữ liệu trên máy chủ (hoặc ít nhất là tất cả bằng cách sử dụng cùng một mã hóa).

Đảm bảo xóa mọi tệp nhật ký hiện có vì chúng đã chứa mã hóa không chính xác.

+0

Cảm ơn câu trả lời. Nhưng, bạn có chắc chắn rằng giá trị chính xác là 'English_United States.UTF-8'? Tìm kiếm Google cho '" English_United States.1252 "' dẫn tôi đến khoảng 15 ** k ** kết quả, tìm kiếm "" English_United States.UTF-8 "' dẫn tôi đến 5 chỉ. – Teejay

+0

@Teejay '1252' chỉ định sử dụng mã hóa Windows-1252 khi viết thư. Vì đọc thông báo qua cơ sở dữ liệu, chức năng 'pg_file_read' mong đợi mã hóa UTF-8, có thể không hoạt động. Mặc dù tôi nghi ngờ nó có thể hoạt động vì tập con của các ký tự được sử dụng bằng tiếng Anh (về cơ bản là ASCII) được mã hóa giống nhau trong cả hai loại mã hóa. – harmic

+0

Điều đó giải quyết vấn đề chính xác của tôi. Nó phải được chấp nhận. – Matthieu

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