- vừa được xem lúc

Chia sẻ kinh nghiệm lỗi postgresql: could not locate a valid checkpoint record

0 0 14

Người đăng: Nguyen Tran Nhat Duc

Theo Viblo Asia

Khi làm việc với postgresql và chạy một thời gian dài, có khả năng bạn gặp phải một vấn đề như sau khiến server không thể chạy: postgresql_error

Nguyên nhân

Trong cấu trúc thư mục của server postgres, có chứa folder pg_wal. WAL viết tắt của write-access log, có thể hiểu đơn giản là các file log mỗi khi bản ghi mới được tạo ra trong database. Bạn có thể tìm hiểu thêm về WAL tại đây

postgresql_structure

Khi tìm kiếm một bản ghi trong transaction log nhưng không tìm thấy, nó sẽ báo lỗi như trên, có thể do file bị mất hay corrupt. Cách xử lý duy nhất khi gặp là reset lại pg_wal.

Nguyên nhân file bị corrupt có thể do chạy nhiều transaction, có câu lệnh sql bị lỗi nhưng không được bắt lỗi để rollback transaction lại, dẫn đến có nhiều transaction chạy liên tục không dừng.

Hướng dẫn xử lý

Để reset lại file WAL bạn cần phải cài postgresql, có sẵn các lệnh của postgresql.

Nếu bạn đã cài sẵn trên máy, bạn có thể chạy lệnh sau:

# Hoặc pg_resetwal -f DATADIR
pg_resetwal DATADIR

DATADIR là đường dẫn trỏ đến thư mục postgresql. Ví dụ /var/lib/postgresql/data

Xong rồi bạn khởi chạy lại postgresql, như vậy bạn đã xử lý thành công

Nếu bạn chạy postgresql bằng docker container nhưng do container không khởi chạy, bạn không thể ssh vào để reset lại được. Trong trường hợp này bạn phải cài postgresql trên máy bạn rồi chạy lệnh như trên.

Cách phòng tránh

Ta thường bắt đầu chạy transaction, thực hiện các lệnh CRUD vào database, thành công xong thì commit. Nhưng trong trường hợp một câu lệnh trong transaction gặp lỗi, ta thường bỏ qua và trả ra error luôn mà quên không thực hiện rollback transaction trước. Dẫn tới càng về sau càng nhiều transaction chạy liên tục.

Để tránh lỗi này hay gặp phải, ta cần xử lý lỗi khi chạy các câu lệnh CRUD trong transaction, nếu gặp lỗi cần rollback lại ngay. Ví dụ thay đổi khi viết code nhiều người có khả năng viết như sau:

 transaction = db.Begin() err = transaction.Insert(.....) if (err != nil) { // Khi có lỗi không rollback transaction tại đây, cần bổ sung transaction.Rollback() return err } transaction.Commit()

Bình luận

Bài viết tương tự

- vừa được xem lúc

Đề thi interview DevOps ở Châu Âu

Well. Chào mọi người, mình là Rice - một DevOps Engineers ở đâu đó tại Châu Âu.

0 0 88

- vừa được xem lúc

In calculus, love also means zero.

Mình nhớ hồi năm 2 đại học, thầy giáo môn calculus, trong một giây phút ngẫu hứng, đã đưa ra cái definition này. Lúc đấy mình cũng không nghĩ gì nhiều.

0 0 65

- vừa được xem lúc

Chuyện thay đổi

Thay đổi là một thứ gì đó luôn luôn đáng sợ. Cách đây vài tháng mình có duyên đi làm cho một banking solution tên là X.

0 0 47

- vừa được xem lúc

Pet vs Cattle - Thú cưng và gia súc

Khái niệm. Pets vs Cattle là một khái niệm cơ bản của DevOps. Bài viết này sẽ nói về sự phát triển của các mô hình dịch vụ từ cốt lõi Pets and Cattle. 1.

0 0 34

- vừa được xem lúc

Git workflow được Google và Facebook sử dụng có gì hay ho

Với developer thì Git hẳn là công cụ rất quen thuộc và không thể thiếu rồi. Thế nhưng có mấy ai thực sự hiểu được Git.

0 0 85

- vừa được xem lúc

Kubernetes - Học cách sử dụng Kubernetes Namespace cơ bản

Namespace trong Kubernetes là gì. Tại sao nên sử dụng namespace.

0 0 113