2013-05-21 25 views
36

Chúng tôi đã chạy postgresql 8.4 trong một thời gian. Như với bất kỳ cơ sở dữ liệu nào, chúng tôi đang dần đạt đến ngưỡng của chúng tôi cho không gian. Tôi thêm một ổ 8 GB EBS và gắn nó để dụ chúng tôi và cấu hình nó để làm việc đúng trên một thư mục có tên là/fileLàm cách nào để di chuyển dữ liệu postgresql sang một thư mục khác trên Ubuntu trên Amazon EC2?

Trong vòng/tác phẩm, tôi tự tạo ra

Đúng tôi nếu tôi sai, nhưng tôi tin rằng tất cả dữ liệu postgresql được lưu trữ trong /var/lib/postgresql/8.4/main

Tôi đã sao lưu cơ sở dữ liệu và chạy sudo /etc/init.d/postgresql. Điều này dừng máy chủ postgresql. Tôi đã cố gắng sao chép và dán nội dung của /var/lib/postgresql/8.4/main vào thư mục/files nhưng hóa ra lại là một MESS HUGE! do quyền truy cập tệp. Tôi phải đi vào và chmod nội dung của thư mục đó để tôi có thể sao chép và dán chúng. Một số tệp không sao chép hoàn toàn do quyền root. Tôi đã sửa đổi các tham số data_directory trong postgresql.conf để trỏ đến các tập tin thư mục

data_directory = '/files/postgresql/main' 

và tôi chạy sudo /etc/init.d/postgresql khởi động lại và máy chủ thất bại trong việc bắt đầu. Một lần nữa có thể do các vấn đề về quyền. Amazon EC2 chỉ cho phép bạn truy cập dịch vụ dưới dạng ubuntu theo mặc định. Bạn chỉ có thể truy cập root từ bên trong terminal mà làm cho mọi thứ phức tạp hơn nhiều.

Có bước nào sạch hơn và hiệu quả hơn bằng cách thực hiện bước này không?

Trả lời

74

Dừng máy chủ.

Sao chép dữ liệu trong khi giữ lại quyền - sử dụng cp -aRv.

Sau đó, (dễ nhất, vì nó tránh sự cần thiết phải sửa đổi initscripts) chỉ cần di chuyển datadir cũ sang một bên và symlink đường dẫn cũ đến vị trí mới.

+2

Xin chào, bạn có thể giải thích ý bạn bằng cách "di chuyển datadir cũ sang một bên" không? bạn có nghĩa là, chỉ cần loại bỏ nó hoặc sao chép nó vào một số thư mục sao lưu? và: bạn có nghĩa là thư mục dữ liệu nào? toàn bộ thư mục được trả về bởi 'show data_directory;'? –

+0

Đổi tên nó, vì vậy bạn không mất bất cứ điều gì nếu nó chỉ ra nó là quan trọng sau khi tất cả. –

+0

Các ý tưởng symlinlk không phải là xấu nhưng không hoàn hảo bởi vì nó đòi hỏi bạn phải giữ xung quanh vị trí datadir cũ. – yglodt

1

Làm rõ. Đó là AMI cụ thể mà bạn đã sử dụng tập hợp ubuntu làm người dùng mặc định, điều này có thể không áp dụng cho các AMI khác.

Về bản chất nếu bạn đang cố gắng di chuyển dữ liệu theo cách thủ công, có thể bạn sẽ cần phải làm như vậy với người dùng root, và sau đó đảm bảo có sẵn cho bất kỳ người dùng postgres nào đang chạy cùng.

Bạn cũng có tùy chọn chụp nhanh âm lượng và tăng kích thước của một ổ đĩa được tạo từ ảnh chụp nhanh. Sau đó, bạn có thể thay thế âm lượng trên thể hiện của bạn với âm lượng mới (Bạn có thể sẽ phải thay đổi kích thước phân vùng để tận dụng tất cả không gian).

12

Cảm ơn câu trả lời được chấp nhận. Thay vì liên kết tượng trưng, ​​bạn cũng có thể sử dụng số bind mount. Bằng cách đó, nó độc lập với hệ thống tệp. Nếu bạn muốn sử dụng ổ cứng chuyên dụng cho cơ sở dữ liệu, bạn cũng có thể mount it normally. vào thư mục dữ liệu.

Tôi đã làm việc sau. Dưới đây là các bước của tôi nếu ai đó cần tham khảo. Tôi chạy điều này như là một kịch bản trên nhiều trường hợp AWS.

# stop postgres server 
sudo service postgresql stop 

# create new filesystem in empty hard drive 
sudo mkfs.ext4 /dev/xvdb 

# mount it 
mkdir /tmp/pg 
sudo mount /dev/xvdb /tmp/pg/ 

# copy the entire postgres home dir content 
sudo cp -a /var/lib/postgresql/. /tmp/pg 

# mount it to the correct directory 
sudo umount /tmp/pg 
sudo mount /dev/xvdb /var/lib/postgresql/ 

# see if it is mounted 
mount | grep postgres 

# add the mount point to fstab 
echo "/dev/xvdb /var/lib/postgresql ext4 rw 0 0" | sudo tee -a /etc/fstab 

# when database is in use, observe that the correct disk is being used 
watch -d grep xvd /proc/diskstats 
+0

Làm việc như một nét duyên dáng, cảm ơn :) –