2014-06-24 20 views
154

Tôi đang sử dụng cơ sở dữ liệu PostgreSQL cho ứng dụng Ruby on Rails (trên Mac OS X 10.9).Làm thế nào để nâng cấp PostgreSQL từ phiên bản 9.6 lên phiên bản 10.1 mà không làm mất dữ liệu?

Có hướng dẫn chi tiết nào về cách nâng cấp cơ sở dữ liệu PostgreSQL không?

Tôi sợ rằng tôi sẽ phá hủy dữ liệu trong cơ sở dữ liệu hoặc làm hỏng nó.

+6

Thực hiện sao lưu trong mọi trường hợp. –

Trả lời

349

Giả sử bạn đã sử dụng pha chế nhà để cài đặt và nâng cấp Postgres, bạn có thể thực hiện các bước sau.

  1. Dừng hiện Postgres server:

    launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist

  2. Khởi tạo một 10,1 cơ sở dữ liệu mới:

    initdb /usr/local/var/postgres10.1 -E utf8

  3. chạy pg_upgrade(lưu ý: phiên bản bin thay đổi nếu bạn' nâng cấp lại từ thứ khác ngoài):

    pg_upgrade -v \ 
        -d /usr/local/var/postgres \ 
        -D /usr/local/var/postgres10.1 \ 
        -b /usr/local/Cellar/postgresql/9.6.5/bin/ \ 
        -B /usr/local/Cellar/postgresql/10.1/bin/ 
    
  4. Di chuyển dữ liệu mới vào vị trí:

    cd /usr/local/var 
    mv postgres postgres9.6 
    mv postgres10.1 postgres 
    
  5. Restart Postgres:

    launchctl load ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist

  6. Kiểm tra /usr/local/var/postgres/server.log để biết chi tiết và để chắc chắn rằng máy chủ mới bắt đầu đúng.

  7. Cuối cùng, cài đặt lại đường ray pg đá quý

    gem uninstall pg 
    gem install pg 
    

tôi đề nghị bạn dành chút thời gian để đọc các PostgreSQL documentation để hiểu chính xác những gì bạn đang làm trong các bước trên để giảm thiểu thất vọng.

+1

Cảm ơn bạn! Tất cả các công trình như một say mê! – Drakmail

+8

Tôi hade sử dụng lệnh sau để khởi tạo cơ sở dữ liệu: 'initdb /usr/local/var/postgres9.4 -E utf8 --lc-collate = C - lc-ctype = utf-8 --lc-currency = C --lc-numeric = C' – sunsations

+1

Cảm ơn, đã làm việc như một sự quyến rũ. – Tache

9

user manual bao gồm chủ đề này theo chiều sâu. Bạn có thể:

  • pg_upgrade tại chỗ; hoặc

  • pg_dumppg_restore.

Nếu nghi ngờ, làm điều đó với bãi. Không xóa thư mục dữ liệu cũ, chỉ cần giữ nó trong trường hợp một cái gì đó đi sai/bạn làm cho một sai lầm; theo cách đó bạn có thể quay trở lại bản cài đặt 9.3 không thay đổi của bạn.

Để biết chi tiết, hãy xem sách hướng dẫn.

Nếu bạn gặp khó khăn, hãy đăng câu hỏi chi tiết giải thích cách bạn bị kẹt, ở đâu và những gì bạn đã thử trước tiên. Nó phụ thuộc một chút vào cách bạn cài đặt PostgreSQL, vì có một vài "bản phân phối" khác nhau của PostgreSQL cho OS X (không may). Vì vậy, bạn cần phải cung cấp thông tin đó.

1

Điều này đã làm cho tôi.

https://gist.github.com/dideler/60c9ce184198666e5ab4

Ngắn và chính xác. Tôi thành thật không nhằm mục đích hiểu được sự can đảm của PostgreSQL, tôi muốn hoàn thành công việc.

+1

Điều này sử dụng công cụ pg_upgradecluster của Ubuntu có thể chậm hơn nhiều so với công cụ pg_upgrade của PostgreSQL và tất nhiên chỉ có sẵn trên Ubuntu. – alfonx

+0

@alfonx Không đúng. Tôi có nó trên Debian 'jessie'. Đã có hơn 10 DB và một lượng ~ 400MB dữ liệu cơ sở dữ liệu đã được chuyển đổi trong nháy mắt. Sau đó, một lần nữa, tôi đang sử dụng một Debian ảo trên một SSD. – dimitarvp

+0

Hãy để tôi tự sửa lỗi: pg_upgradecluster là một phần của "cơ sở hạ tầng PostgreSQL Debian", vì vậy chỉ có sẵn trên các bản phân phối dựa trên Debian. Về tốc độ, pg_upgrade cung cấp tùy chọn "--link", liên kết không sao chép dữ liệu nếu có thể: http://www.postgresql.org/docs/9.4/static/pgupgrade.html – alfonx

7

Đứng trên vai của các sinh vật nghèo khác trodding qua muck này, tôi đã có thể làm theo các bước sau để sao lưu và chạy sau khi nâng cấp đến Yosemite:

Giả sử bạn đã sử dụng home-brew để cài đặt và nâng cấp Postgres, bạn có thể thực hiện các bước sau.

  1. Dừng hiện Postgres server:

    launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist

  2. Khởi tạo 9.4 cơ sở dữ liệu mới:

    initdb /usr/local/var/postgres9.4 -E utf8

  3. Install postgres 9,3 (như nó đã không còn hiện diện trên của tôi máy):

    brew install homebrew/versions/postgresql93

  4. Thêm thư mục bị loại bỏ trong quá trình nâng cấp Yosemite:

    mkdir -p /usr/local/var/postgres/{pg_tblspc,pg_twophase,pg_stat_tmp}/touch /usr/local/var/postgres/{pg_tblspc,pg_twophase,pg_stat_tmp}/.keep

  5. chạy pg_upgrade:

    pg_upgrade -v -d /usr/local/var/postgres -D /usr/local/var/postgres9.4 -b /usr/local/Cellar/postgresql93/9.3.5/bin/ -B /usr/local/Cellar/postgresql/9.4.0/bin/

  6. Di chuyển dữ liệu mới vào vị trí:

    cd /usr/local/var 
    mv postgres postgres9.3 
    mv postgres9.4 postgres 
    
  7. Restart Postgres:

    launchctl load ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist

  8. Kiểm tra /usr/local/var/postgres/server.log để biết chi tiết và để chắc chắn rằng máy chủ mới bắt đầu đúng cách.

  9. Cuối cùng, cài đặt lại các thư viện liên quan?

    pip install --upgrade psycopg2 
    gem uninstall pg 
    gem install pg 
    
+1

pg_upgrade -v -d/usr/local/var/postgres -D /usr/local/var/postgres9.4 -b /usr/local/Cellar/postgresql93/9.3.*/bin/ -B/usr/local/Cellar/postgresql/9.4. */Bin/# Các phiên bản nhỏ có thể khác nhau. –

+1

Cảm ơn vì điều này. Tôi vô tình chạy 'brew cleanup' trước khi di chuyển dữ liệu và điều đó khiến cho postgres9.3 bị gỡ cài đặt. Điều này đã giúp. :) – markquezada

44

Dưới đây là giải pháp cho người dùng Ubuntu

Đầu tiên chúng ta phải dừng lại postgresql

sudo /etc/init.d/postgresql stop 

Tạo một file mới có tên gọi /etc/apt/sources.list.d/ pgdg.list và thêm dòng dưới đây

deb http://apt.postgresql.org/pub/repos/apt/ utopic-pgdg main 

Fol thấp dưới lệnh

wget -q -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add - 
sudo apt-get update 
sudo apt-get install postgresql-9.4 
sudo pg_dropcluster --stop 9.4 main 
sudo /etc/init.d/postgresql start 

Bây giờ chúng tôi có tất cả mọi thứ, chỉ cần nâng cấp nó như sau

sudo pg_upgradecluster 9.3 main 
sudo pg_dropcluster 9.3 main 

Vậy là xong. Chủ yếu là cụm nâng cấp sẽ chạy trên cổng số 5433. Kiểm tra nó với lệnh dưới đây

sudo pg_lsclusters 
+2

Câu thứ hai đến câu cuối cùng mà bạn nói "Cụm được nâng cấp chủ yếu sẽ chạy trên số cổng 5433" có lẽ nên nói "Cụm 9.3 sẽ chạy trên số cổng 5433 để bạn có thể hoàn nguyên nếu cần". –

+3

Lưu ý: Đối với ubuntu 14.04 hãy sử dụng "trusty-pgdb" thay vì utopic-pgdb – Johnny

+1

Lưu ý rằng điều này không ** KHÔNG ** thực hiện nâng cấp tại chỗ. do đó hoàn toàn vô dụng cho 700 GB DB của tôi với dung lượng 1TB. –

0

Giải pháp của tôi là để làm một sự kết hợp của hai nguồn sau đây:

https://gist.github.com/tamoyal/2ea1fcdf99c819b4e07d

http://www.gab.lc/articles/migration_postgresql_9-3_to_9-4

giây thứ hai một đã giúp thêm sau đó lần đầu tiên. Ngoài ra để không, không làm theo các bước như là một số là không cần thiết. Ngoài ra, nếu bạn không thể sao lưu dữ liệu qua bảng điều khiển postgres, bạn có thể sử dụng phương pháp thay thế và sao lưu bằng pgAdmin 3 hoặc một số chương trình khác, như tôi đã làm trong trường hợp của mình.

Ngoài ra, liên kết: https://help.ubuntu.com/stable/serverguide/postgresql.html Giúp đặt mật khẩu được mã hóa và đặt md5 để xác thực người dùng postgres.

Sau khi tất cả được thực hiện, kiểm tra postgres server phiên bản chạy trong terminal:

sudo -u postgres psql postgres 

Sau khi nhập thời gian mật khẩu trong postgres thiết bị đầu cuối:

SHOW SERVER_VERSION; 

Nó sẽ ra cái gì đó như:

server_version 
---------------- 
9.4.5 

Để thiết lập và bắt đầu postgres tôi đã sử dụng lệnh:

> sudo bash # root 
> su postgres # postgres 

> /etc/init.d/postgresql start 
> /etc/init.d/postgresql stop 

Và sau đó cho việc khôi phục cơ sở dữ liệu từ một tập tin:

> psql -f /home/ubuntu_username/Backup_93.sql postgres 

Hoặc nếu không hoạt động thử với cái này:

> pg_restore --verbose --clean --no-acl --no-owner -h localhost -U postgres -d name_of_database ~/your_file.dump 

Và nếu bạn đang sử dụng Rails làm một bundle exec rake db:migrate sau khi kéo mã :)

32

Mặc dù tất cả câu trả lời ở trên, đây là 5 xu của tôi.

Tính năng này hoạt động trên mọi hệ điều hành và từ bất kỳ phiên bản postgres nào.

  • Dừng bất kỳ trường hợp postgres đang chạy nào;
  • Cài đặt phiên bản mới và khởi động phiên bản mới; Kiểm tra xem bạn có thể kết nối với phiên bản mới không;
  • Thay đổi phiên bản cũ postgresql.conf ->port từ 5432 đến 5433;
  • Bắt đầu phiên bản phiên bản cũ;
  • Mở thiết bị đầu cuối và CD sang phiên bản mới bin thư mục;
  • Chạy pg_dumpall -p 5433 -U <username> | psql -p 5432 -U <username>
  • Dừng phiên bản chạy cũ sau khi chạy;
+2

Cảm ơn Christian, đây chắc chắn là một giải pháp tuyệt vời và dễ dàng, tôi đã thành công từ 9,3 đến 9,5 như thế này – fnicollet

+2

Làm việc rất đẹp để nâng cấp từ 9,1 lên 9,5 trên máy chủ Windows 2012. – Rolf

+2

Một vấn đề của giải pháp này là nếu bạn đã thay đổi một số tập tin cấu hình Postgres (ví dụ 'postgresql.conf' hoặc' pg_hba.conf'), bạn sẽ cần phải sao chép thủ công những thay đổi đó trong tiến trình cài đặt mới. Thay vào đó, nếu bạn sử dụng 'pg_upgradecluster', các tệp cấu hình sẽ được sao chép vào cụm mới: http://manpages.ubuntu.com/manpages/precise/man8/pg_upgradecluster.8.html – Alphaaa

0

Đối với Mac qua homebrew:

brew tap petere/postgresql,

brew install <formula> (ví dụ: brew install petere/postgresql/postgresql-9.6)

Di Postgres cũ:

brew unlink postgresql

brew link -f postgresql-9.6

Nếu xảy ra lỗi, đừng quên đọc và làm theo hướng dẫn pha trong mỗi bước.

Kiểm tra này ra để biết thêm: https://github.com/petere/homebrew-postgresql

1

On của Windows tôi vẫn tiếp tục phải đối mặt với các thông điệp lỗi khác nhau khi cố gắng sử dụng pg_upgrade.

lưu rất nhiều thời gian cho tôi để chỉ:

  1. Sao lưu DB
  2. Gỡ bỏ tất cả các bản sao của PostgreSQL
  3. Install 9,5
  4. Restore DB
+0

điều này cho 9,5 đến 9,6 và làm việc hoàn hảo là tốt. Tốt để có thể thực hiện nâng cấp chính xác dễ dàng, thay vì "mới nhất". Tôi đã sử dụng Big SQL để có được trình cài đặt phù hợp (https://www.openscg.com/bigsql/postgresql/installers.jsp/). –

3

Cập nhật: Quá trình này tương tự để nâng cấp từ 9,6 lên 10; chỉ cần sửa đổi các lệnh để phản ánh các phiên bản 9.610, trong đó 9.6phiên bản cũ và 10phiên bản mới. Đảm bảo điều chỉnh thư mục "cũ" và "mới" tương ứng.


Tôi vừa nâng cấp PostgreSQL 9.5 lên 9.6 trên Ubuntu và nghĩ rằng tôi chia sẻ các phát hiện của mình, vì có một vài sắc thái hệ điều hành/gói cụ thể cần lưu ý.

(Tôi không muốn phải đổ và khôi phục dữ liệu bằng tay, vì vậy một số trong những câu trả lời khác ở đây là không khả thi.)

Tóm lại, quá trình này bao gồm cài đặt các phiên bản mới của PostgreSQL cùng với phiên bản cũ (ví dụ: 9.5 và 9.6), và sau đó chạy mã nhị phân pg_upgrade, được giải thích trong (một số) chi tiết tại https://www.postgresql.org/docs/9.6/static/pgupgrade.html.

duy nhất "khéo léo" khía cạnh của pg_upgrade là thất bại trong việc vượt qua các giá trị chính xác cho một cuộc tranh cãi, hoặc không được đăng nhập như là người dùng đúng hay cd đến đúng vị trí trước khi thực hiện một lệnh, có thể dẫn đến khó hiểu thông báo lỗi.

Trên Ubuntu (và có thể là Debian), miễn là bạn đang sử dụng repo "chính thức", deb http://apt.postgresql.org/pub/repos/apt/ xenial-pgdg main và miễn là bạn không thay đổi đường dẫn hệ thống tệp mặc định hoặc tùy chọn thời gian chạy.

Cài đặt phiên bản mới (lưu ý rằng chúng tôi xác định 9.6, rõ ràng):

sudo apt install postgresql-9.6 

Sau khi cài đặt thành công, cả hai phiên bản sẽ được chạy side-by-side, nhưng trên các cổng khác nhau.Sản lượng cài đặt nhắc này, ở phía dưới, nhưng nó dễ dàng bỏ qua:

Creating new cluster 9.6/main ... 
    config /etc/postgresql/9.6/main 
    data /var/lib/postgresql/9.6/main 
    locale en_US.UTF-8 
    socket /var/run/postgresql 
    port 5433 

Dừng cả hai trường hợp máy chủ (điều này sẽ ngăn chặn cả hai cùng một lúc):

sudo systemctl stop postgresql 

Chuyển sang PostgreSQL chuyên dụng hệ thống sử dụng:

su postgres 

Move vào thư mục chính của mình (thất bại để làm điều này sẽ gây ra lỗi):

cd ~ 

pg_upgradeđòi hỏi đầu vào sau (pg_upgrade --help cho chúng ta biết điều này):

When you run pg_upgrade, you must provide the following information: 
    the data directory for the old cluster (-d DATADIR) 
    the data directory for the new cluster (-D DATADIR) 
    the "bin" directory for the old version (-b BINDIR) 
    the "bin" directory for the new version (-B BINDIR) 

Những đầu vào có thể được xác định với "tên dài", để làm cho họ dễ dàng hơn để hình dung:

-b, --old-bindir=BINDIR  old cluster executable directory 
    -B, --new-bindir=BINDIR  new cluster executable directory 
    -d, --old-datadir=DATADIR  old cluster data directory 
    -D, --new-datadir=DATADIR  new cluster data directory 

Chúng tôi cũng phải vượt qua khóa chuyển đổi --new-options, vì không thực hiện được như sau:

connection to database failed: could not connect to server: No such file or directory 
     Is the server running locally and accepting 
     connections on Unix domain socket "/var/lib/postgresql/.s.PGSQL.50432"? 

Điều này xảy ra do tùy chọn cấu hình mặc định được áp dụng khi không có công tắc này, kết quả là các tùy chọn kết nối không chính xác đang được sử dụng, do đó lỗi socket.

Thực hiện lệnh pg_upgrade từ mới phiên bản PostgreSQL:

/usr/lib/postgresql/9.6/bin/pg_upgrade --old-bindir=/usr/lib/postgresql/9.5/bin --new-bindir=/usr/lib/postgresql/9.6/bin --old-datadir=/var/lib/postgresql/9.5/main --new-datadir=/var/lib/postgresql/9.6/main --old-options=-cconfig_file=/etc/postgresql/9.5/main/postgresql.conf --new-options=-cconfig_file=/etc/postgresql/9.6/main/postgresql.conf 

Đăng xuất khỏi tài khoản người dùng hệ thống chuyên dụng:

exit 

Việc nâng cấp đã hoàn tất, nhưng, mới Ví dụ sẽ liên kết với cổng 5433 (mặc định chuẩn là 5432), vì vậy hãy ghi nhớ điều này nếu cố gắng kiểm tra trường hợp mới trước khi "cắt giảm" cho nó.

Khởi động máy chủ như bình thường (một lần nữa, điều này sẽ bắt đầu cả hai trường hợp cũ và mới):

systemctl start postgresql 

Nếu bạn muốn làm cho phiên bản mới mặc định, bạn sẽ cần phải chỉnh sửa file cấu hình có hiệu quả , ví dụ, /etc/postgresql/9.6/main/postgresql.conf, và đảm bảo rằng các cổng được định nghĩa như vậy:

port = 5432 

Nếu bạn làm điều này, hoặc thay đổi số cổng phiên bản cũ để 5433 cùng một lúc (trước khi bắt đầu các dịch vụ), hay đơn giản loại bỏ các phiên bản cũ (điều này sẽ không loại bỏ nội dung cơ sở dữ liệu thực tế của bạn, bạn sẽ cần phải sử dụng apt --purge remove postgresql-9.5 cho điều đó xảy ra):

apt remove postgresql-9.5 

lệnh trên sẽ ngừng tất cả các trường, vì vậy bạn sẽ cần phải khởi động mới ví dụ lần cuối cùng với:

systemctl start postgresql 

Là một điểm cuối cùng của lưu ý, đừng quên xem xét pg_upgrade 's lời khuyên tốt:

Upgrade Complete 
---------------- 
Optimizer statistics are not transferred by pg_upgrade so, 
once you start the new server, consider running: 
    ./analyze_new_cluster.sh 

Running this script will delete the old cluster's data files: 
    ./delete_old_cluster.sh 
+0

Đối với tôi trong Mac Yosemite, PostgreSQL 9.2 -> 9.5: 'sudo su postgres', thay đổi tất cả PHƯƠNG PHÁP trong pg_hba.conf của cả hai cài đặt để tin cậy trước pg_upgrade, chạy pg_upgrade trong/private/tmp không ~ không hoạt động như vậy' sudo mkdir/foobar' với 'chmod 777/foobar' và chạy nó ở đó. Cuối cùng lệnh pg_upgrade: '/Library/PostgreSQL/9.5/bin/pg_upgrade -b /Library/PostgreSQL/9.2/bin -B /Library/PostgreSQL/9.5/bin -d /Library/PostgreSQL/9.2/data -D/Thư viện/PostgreSQL/9.5/dữ liệu -o -cconfig_file =/Thư viện/PostgreSQL/9.2/dữ liệu/postgresql.conf -O -cconfig_file =/Thư viện/PostgreSQL/9.5/data/postgresql.conf' –

0

Tôi nghĩ rằng đây là liên kết tốt nhất cho giải pháp của bạn để cập nhật postgres 9,6

https://sandymadaan.wordpress.com/2017/02/21/upgrade-postgresql9-3-9-6-in-ubuntu-retaining-the-databases/ 
2

Hình như các giải pháp đã được nướng vào Homebrew bây giờ:

$ brew info postgresql 
... 
==> Caveats 
To migrate existing data from a previous major version of PostgreSQL run: 
    brew postgresql-upgrade-database 
.... 
0

Nếu bạn đang sử dụng dịch vụ homebrew và homebrew, bạn có thể có lẽ chỉ làm:

brew services stop postgresql 
brew upgrade postgresql 
brew postgresql-upgrade-database 
brew services start postgresql 

Tôi nghĩ rằng điều này có thể không hoạt động hoàn toàn nếu bạn đang sử dụng tính năng postgres tiên tiến, nhưng nó đã làm việc một cách hoàn hảo đối với tôi.

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