Mục lục
Liệt kê cơ sở dữ liệu
Kết xuất cơ sở dữ liệu
Kết xuất tất cả cơ sở dữ liệu
Dump Grants
Xóa hoặc Bỏ qua Cơ sở dữ liệu
Xóa a Cấp
khôi phục cơ sở dữ liệu
Cấp khôi phục
PostgreSQL là một công cụ cơ sở dữ liệu thay thế tuyệt vời cho MySQL hoặc MariaDB, nhưng việc quản lý các cơ sở dữ liệu đó rất khác, đặc biệt đối với những quản trị viên hệ thống thường sử dụng MySQL từ dòng lệnh hoặc PHPMyAdmin. Nhiều CMS và ứng dụng đã biết cách tương tác với cơ sở dữ liệu PostgreSQL, nhưng giống như MySQL, vẫn phụ thuộc vào bạn để duy trì các cơ sở dữ liệu đó.
Đối với bài viết này, chúng tôi sẽ giả định rằng bạn đã SSH vào máy chủ của mình với tư cách là người dùng "root" và đã cài đặt máy chủ PostgreSQL với cấu hình mặc định, yêu cầu kết nối với tư cách người dùng "postgres". Do đó, hầu hết các lệnh cũng sẽ có tùy chọn -U postgres. Các lệnh này nói chung sẽ giống hệt nhau giữa CentOS và Ubuntu trên hầu hết các phiên bản hiện đại nhưng được thử nghiệm chủ yếu trên máy chủ CentOS 7 VPS và máy chủ Ubuntu 16.04 chạy PostgreSQL 9.2.
Việc tạo cơ sở dữ liệu và tài trợ khá phức tạp, nhưng nếu bạn sử dụng cPanel, Plesk hoặc một bảng điều khiển khác hỗ trợ tích hợp PostgreSQL, việc thiết lập này rất đơn giản. Việc tạo các cơ sở dữ liệu và tài trợ từ dòng lệnh này nằm ngoài phạm vi của bài viết cụ thể này, vì vậy chúng tôi cũng sẽ cho rằng bạn đã có cơ sở dữ liệu của mình đang chạy và đang được sử dụng.
Liệt kê cơ sở dữ liệu trong PostgreSQL
Nó giúp biết tên chính xác của cơ sở dữ liệu bạn sẽ làm việc, cũng như kiểm tra kỹ để đảm bảo rằng bạn đang làm việc trên đúng máy chủ. Trước tiên, hãy liệt kê các cơ sở dữ liệu PostgreSQL trên máy của chúng ta:
psql -l -U postgres
Đầu ra cho lệnh này là một bảng tên cơ sở dữ liệu, chủ sở hữu và đặc quyền truy cập. Chúng tôi sẽ sử dụng dữ liệu từ cột đầu tiên khi mô tả tên cơ sở dữ liệu cho các lệnh trong tương lai. Đối với bài viết này, chúng tôi sẽ sử dụng cơ sở dữ liệu có tên “ database_name ”.
Nếu bạn chỉ cần tên cơ sở dữ liệu và không có thông tin nào khác, bạn có thể loại bỏ thông tin thừa bằng cách thực hiện truy vấn chính xác cho tên cơ sở dữ liệu:
psql -U postgres -tA -c 'select datname from pg_database;'
Lệnh này thực thi một lệnh (được mô tả bởi -c cờ) của việc chọn tên dữ liệu cột của pg_database bảng toàn cầu. -t cờ chỉ liệt kê các bộ giá trị (hàng kết quả) và ẩn các bộ mô tả thừa như tiêu đề và số lượng kết quả cũng như -A cờ sẽ loại bỏ căn chỉnh, in một cơ sở dữ liệu trên mỗi dòng không có ký tự nào ở phía trước hoặc phía sau tên. Đầu ra của lệnh này đặc biệt hữu ích để tạo vòng lặp cho kết xuất cơ sở dữ liệu.
Kết xuất cơ sở dữ liệu
Lệnh kết xuất sẽ lấy một bản sao đầy đủ của cơ sở dữ liệu, bao gồm tất cả các bảng, lược đồ và dữ liệu và lưu trữ nó trong một tệp nén duy nhất:
pg_dump -c -Fc -U postgres database_name > database_name.psql
Có một số cờ quan trọng cho lệnh này. -c hoặc –lạch , nói với pg_dump để thêm câu lệnh DROP vào đầu ra và -Fc hoặc –format =custom , nén và sắp xếp đầu ra để sử dụng với pg_restore sau này. Định dạng tùy chỉnh có tính linh hoạt cao nhất và thuận lợi là lưu trữ bản sao lưu trong một tệp duy nhất.
Kết xuất tất cả cơ sở dữ liệu
Sẽ tốt hơn nếu đưa từng cơ sở dữ liệu vào tệp riêng của nó bằng cách chạy lệnh trên nhiều lần. Chúng tôi sẽ tham chiếu lệnh liệt kê thứ hai của mình, loại bỏ một số cơ sở dữ liệu không cần thiết, để thực hiện kết xuất riêng lẻ của chúng tôi.
for db in $(psql -U postgres -tA -c 'select datname from pg_database;' | grep -E -v “^(template1|template0|postgres)$”); do
echo $db
pg_dump -c -Fc -U postgres $db > $db.psql
done
Vòng lặp for này sẽ chuyển danh sách tất cả các cơ sở dữ liệu, ngoài các mẫu mặc định và cơ sở dữ liệu postgres, vào pg_dump lệnh tạo .psql tệp cho từng tệp trong thư mục hiện tại.
Lưu ý:Cũng có thể thực hiện kết xuất tất cả cơ sở dữ liệu vào một tệp duy nhất, mặc dù với các tập dữ liệu lớn, việc này có thể khó sử dụng và khó khôi phục. Do đó, tôi không khuyến khích phương pháp này, mặc dù nó ít phức tạp hơn và có thể hoạt động trong một số trường hợp.
pg_dumpall --clean -U postgres > pg.all.psql
Dump Grants
Các khoản tài trợ được lưu trữ trong lược đồ PostgreSQL. Bạn có thể kết xuất lược đồ, do đó nhận được tất cả các khoản tài trợ có sẵn cho hệ thống, sử dụng lệnh pg_dump:
pg_dumpall -U postgres -s > pg.schema.psql
Điều này sẽ không chỉ kết xuất các khoản tài trợ mà còn cả phần còn lại của lược đồ của máy chủ, bao gồm cả các câu lệnh tạo cơ sở dữ liệu và bảng, quyền sở hữu và thành viên vai trò cũng như phân bổ ACL - về cơ bản, mọi thứ ngoại trừ dữ liệu.
Nếu bạn chỉ cần người dùng (vai trò) và tài trợ, bạn có thể thu thập những người đó bằng cách sử dụng lệnh này:
pg_dumpall -U postgres -s | egrep -e '^(REVOKE|GRANT)' -e '^(CREATE|ALTER)\ ROLE' > pg.grants.psql
Điều này tận dụng kết xuất lược đồ đầy đủ nhưng chỉ lấy các câu lệnh tạo vai trò và câu lệnh cấp / thu hồi để tập hợp người dùng và người được cấp.
Xóa hoặc thả cơ sở dữ liệu
Để phá hủy một cơ sở dữ liệu, cú pháp rất đơn giản. Hãy thận trọng khi gõ lệnh này, vì lệnh này không yêu cầu bạn xác nhận!
psql -U postgres -c ‘drop database database_name’
Nếu cơ sở dữ liệu tồn tại, nó sẽ không còn nữa. Ngoài ra còn có một trình bao bọc dòng lệnh cho tác vụ tương tự:
dropdb -U postgres database_name
Xóa tài trợ
Tài trợ bị xóa khỏi người dùng bằng cách thu hồi chúng. Trước tiên, điều quan trọng là phải biết người dùng cụ thể có những tài trợ nào, vì vậy hãy tìm kiếm chúng bằng cách kết xuất lược đồ và tìm các dòng liên quan đến người dùng của chúng tôi.
pg_dumpall -U postgres -s | egrep -e '^(REVOKE|GRANT)' | grep database_user
Trong trường hợp của tôi, có một khoản trợ cấp trông giống như sau:
GRANT ALL ON DATABASE database_name TO database_user;
Để chống lại điều này, chúng tôi sẽ thu hồi cùng một bộ mô tả:
psql -U postgres -c ‘revoke all on database database_name from database_user;’
Lưu ý:Lưu ý những thay đổi nhỏ, GRANT đã được đổi thành REVOKE và TO đã được thay đổi thành FROM. Lệnh này được gói gọn trong các dấu ngoặc kép và được chuyển tới psql với cờ -c để thực thi lệnh trong PostgreSQL.
Điều này sẽ thay thế câu lệnh GRANT ban đầu bằng một REVOKE trong lược đồ. Chạy lại lệnh đầu tiên trong phần này bây giờ chỉ hiển thị dòng chúng ta vừa truyền:
REVOKE ALL ON DATABASE database_name FROM database_user;
Khôi phục cơ sở dữ liệu
Đối với cơ sở dữ liệu đã bị kết xuất bằng phương thức pg_dump được sử dụng trong bài viết này, chúng tôi có thể khôi phục toàn bộ cơ sở dữ liệu đó bằng lệnh sau:
pg_restore -U postgres -c -C -O -d database_name database_name.psql
Khá nhiều cờ cần thiết ở đây! -c hoặc –lạch , như trước đây, bỏ các đối tượng cơ sở dữ liệu trước khi ghi từ tệp vào PostgreSQL. Chúng tôi thêm điều này chỉ trong trường hợp nó không được sử dụng cho lệnh kết xuất. -C hoặc –tạo , sẽ tạo database_name cho cơ sở dữ liệu trong quá trình khôi phục nếu nó không tồn tại. Nếu cơ sở dữ liệu đã tồn tại, thì -c cờ sẽ phá hủy nó trước -C tái tạo nó. Tiếp theo, có -O hoặc –không có chủ sở hữu , xóa chủ sở hữu khỏi cơ sở dữ liệu. Điều này cho phép một bản sao lưu từ bất kỳ nguồn nào được thay đổi thành chủ sở hữu của người dùng thực hiện khôi phục, trong trường hợp của chúng tôi là postgres. -d database_name mô tả tên của cơ sở dữ liệu mà bạn sẽ khôi phục. Đây có thể là một tên khác với tên mà từ đó bản sao lưu được tạo, nếu cần. Đối số cuối cùng là tên của tệp sao lưu của chúng tôi, database_name.psql .
Khôi phục tài trợ
Vì tất cả các khoản tài trợ được lưu trữ trong tệp pg.grants.psql của chúng tôi, chúng tôi chỉ cần chọn người dùng mà chúng tôi cần khôi phục. Trong trường hợp của chúng tôi, chúng tôi sẽ khôi phục database_user:
grep database_user pg.grants.psql | psql -U postgres
Vì tệp pg.grants.psql có các vai trò và quyền cấp nên lệnh này sẽ tạo lại người dùng với các đặc quyền và mật khẩu ban đầu, sau đó cấp quyền truy cập vào cơ sở dữ liệu và lược đồ được yêu cầu.