2012-02-28 60 views
6

Hi tôi phải di chuyển cơ sở dữ liệu mysql đến máy chủ khác,Làm thế nào để di chuyển cơ sở dữ liệu mysql dễ nhất và nhanh nhất?

Đó là gần 5 gb

tôi có thể có quyền truy cập gốc ở cả hai máy chủ?

+0

Tôi nghĩ rằng các câu hỏi như thế này thuộc về http://dba.stackexchange.com/ Tôi muốn di chuyển nó nhưng tôi không có Rep: p Hoặc có lẽ http://www.Superuser.com nhưng tôi muốn nghi ngờ trước đây vì nó là cơ sở dữ liệu cụ thể. – Jordan

Trả lời

22

Thông thường, bạn chạy mysqldump để tạo một bản sao cơ sở dữ liệu và sao lưu như sau:

$ mysqldump -u user -p db-name > db-name.out 

Sao chép tập tin db-name.out sử dụng SFTP/ssh vào máy chủ MySQL từ xa:

$ scp db-name.out [email protected]:/backup 

Khôi phục cơ sở dữ liệu tại máy chủ từ xa (đăng nhập qua ssh):

$ mysql -u user -p db-name < db-name.out 

HOẶC

$ mysql -u user -p 'password' db-name < db-name.out 

Làm cách nào để sao chép cơ sở dữ liệu MySQL từ máy tính này sang máy chủ khác?

Câu trả lời ngắn gọn là bạn có thể sao chép cơ sở dữ liệu từ một máy tính/máy chủ này sang máy tính/máy chủ khác bằng máy khách ssh hoặc mysql.

Bạn có thể chạy tất cả 3 lệnh trên trong một đường chuyền sử dụng mysqldump và lệnh mysql (phương pháp không an toàn, chỉ sử dụng nếu bạn đang sử dụng VPN hoặc tin tưởng mạng của bạn):

$ mysqldump db-name | mysql -h remote.box.com db-name 

Sử dụng ssh nếu bạn don' t có quyền truy cập trực tiếp đến máy chủ từ xa mysql (phương pháp an toàn):

$ mysqldump db-name | ssh [email protected] mysql db-name 

HOẶC

$ mysqldump -u username -p'password' db-name | ssh [email protected] mysql -u username -p'password db-name 

Bạn c một chỉ cần sao chép bảng gọi là foo cơ sở dữ liệu từ xa (remote và máy chủ remote.box.com mysql) gọi là thanh sử dụng cùng một cú pháp:

$ mysqldump db-name foo | ssh [email protected] mysql bar 

HOẶC

$ mysqldump -u user -p'password' db-name foo | ssh [email protected] mysql -u user -p'password' db-name foo 

Hầu như tất cả các lệnh có thể chạy bằng ống dưới UNIX/Linux oses.

Thêm từ Reference

Kính trọng,

+3

Hãy chắc chắn rằng bạn sử dụng tùy chọn chèn mở rộng trên bãi chứa của bạn (tôi nghĩ rằng nó có thể được bật theo mặc định, nhưng không tích cực) hoặc tốc độ khôi phục của bạn sẽ bị ảnh hưởng đáng kể. –

+2

* được lấy từ đây: http://www.cyberciti.biz/tips/howto-copy-mysql-database-remote-server.html –

13

Nếu bạn có Root, bạn có thể tìm thấy nó nhanh hơn để tránh mysqldump. Bạn có thể tạo DB trên máy chủ đích và sao chép trực tiếp các tệp cơ sở dữ liệu. Giả sử user có quyền truy cập vào thư mục mysql máy chủ đích của:

điều
[[email protected]]# /etc/init.d/mysqld stop 
[[email protected]]# cd /var/lib/mysql/[databasename] 
[[email protected]]# scp * [email protected]:/var/lib/mysql/[databasename] 
[[email protected]]# /etc/init.d/mysqld start 

Quan trọng ở đây là: Dừng mysqld trên cả hai máy chủ trước khi sao chép file DB, đảm bảo quyền sở hữu tập tin và quyền hạn đúng về đích trước khi bắt đầu mysqld trên máy chủ đích.

[[email protected]]# chown mysql:mysql /var/lib/mysql/[databasename]/* 
[[email protected]]# chmod 660 /var/lib/mysql/[databasename]/* 
[[email protected]]# /etc/init.d/mysqld start 

Với thời gian là ưu tiên hàng đầu của bạn ở đây, việc sử dụng nén chúng lại sẽ phụ thuộc vào việc thời gian bị mất chờ đợi nén/giải nén (với cái gì đó như gzip) sẽ lớn hơn thời gian lãng phí truyền dữ liệu không nén; đó là tốc độ kết nối của bạn.

+0

Đây là phương pháp dễ nhất. Không chắc tại sao điều này không cao hơn. Máy chủ MySQL sau đó là bản sao carbon của bản gốc. Tôi vừa sao chép toàn bộ máy chủ web vào một máy chủ duy nhất trong khoảng 5 phút. – David

+0

Tôi đã làm các bước trên, nhưng tôi nhận được "LRI 1146 (42S02): Bảng 'sample.user' không tồn tại", Khi tôi cố gắng in bảng người dùng. Bất kỳ ý tưởng ?? – Bathakarai

+0

Ý tưởng: tệp cho bảng người dùng sai đường dẫn, quyền truy cập tệp sai hoặc máy chủ được định cấu hình khác nhau. – Umbrella

2

Đối với một cách tự động để sao lưu cơ sở dữ liệu MySQL của bạn:

Các điều kiện tiên quyết để thực hiện bất kỳ hình thức sao lưu là tìm thời gian lý tưởng trong ngày để hoàn thành nhiệm vụ mà không gây trở ngại cho hoạt động của hệ thống chạy hoặc gây trở ngại với người dùng. Trên lưu ý đó, kích thước của cơ sở dữ liệu phải được xem xét cùng với tốc độ I/O của ổ đĩa - điều này trở nên quan trọng hơn theo cấp số nhân khi cơ sở dữ liệu phát triển (một yếu tố khác liên quan đến số lượng ổ đĩa) ổ đĩa thay thế nơi cơ sở dữ liệu không được lưu trữ sẽ làm tăng tốc độ do các đầu không thực hiện cả đọc và ghi.) Để giữ điều này dễ đọc, tôi sẽ giả sử cơ sở dữ liệu có kích thước quản lý (100MB) và công việc môi trường là một công việc từ 9 giờ sáng đến 5 giờ chiều mà không có sự căng thẳng thực sự hoặc các hệ thống đang hoạt động khác ngoài giờ làm việc.

Bước đầu tiên là đăng nhập vào máy cục bộ của bạn bằng các đặc quyền của root. Khi ở trình bao gốc, người dùng MySQL sẽ cần phải được tạo với các đặc quyền chỉ đọc. Để thực hiện việc này, hãy nhập vỏ MySQL bằng cách sử dụng lệnh:

mysql -uroot -ppassword 

Tiếp theo, người dùng sẽ cần được tạo với quyền chỉ đọc đối với cơ sở dữ liệu cần được sao lưu. Trong trường hợp này, một cơ sở dữ liệu cụ thể không cần phải được gán cho người dùng trong trường hợp kịch bản hoặc quy trình sẽ được sử dụng sau này. Để tạo một người dùng có đặc quyền đọc đầy đủ, hãy nhập các lệnh này vào vỏ MySQL:

grant SELECT on *.* TO [email protected] IDENTIFIED BY ' backuppassword'; 
FLUSH PRIVILEGES; 

Với người dùng MySQL được tạo, an toàn thoát khỏi vỏ MySQL và thả trở lại vào vỏ gốc bằng lối ra. Từ đây, chúng ta sẽ cần tạo kịch bản mà chúng ta muốn chạy các lệnh sao lưu của chúng ta, điều này có thể dễ dàng thực hiện bằng cách sử dụng BASH. Kịch bản này có thể được lưu trữ ở bất kỳ đâu, vì chúng ta sẽ sử dụng một công việc cron để chạy kịch bản hàng đêm, vì mục đích của ví dụ này, chúng ta sẽ đặt kịch bản trong một thư mục mới mà chúng ta tạo ra là "backupscripts". Để tạo thư mục này, hãy sử dụng lệnh này ở vỏ gốc:

mkdir /backupscripts 

Chúng tôi cũng sẽ cần phải tạo một thư mục để lưu trữ bản sao lưu cục bộ của chúng tôi. Chúng tôi sẽ đặt tên cho thư mục này là "backuplog." Ban hành lệnh này ở vỏ rễ để tạo ra các thư mục:

mkdir /backuplogs 

Bước tiếp theo sẽ là để đăng nhập vào máy từ xa bằng chứng chỉ gốc và tạo ra một "người sử dụng sao lưu" với lệnh:

useradd -c "backup user" -p backuppassword backupuser 

Tạo một thư mục để sao lưu của bạn:

mkdir /backuplogs/ 

Trước khi bạn đăng xuất, lấy địa chỉ IP của máy chủ từ xa để tham khảo trong tương lai bằng cách sử dụng lệnh:

ifconfig -a 

eth0 là giao diện chuẩn cho kết nối mạng có dây. Lưu ý IP_ADDR này.

Cuối cùng, đăng xuất khỏi máy chủ từ xa và quay lại máy chủ lưu trữ ban đầu của bạn.

Tiếp theo, chúng tôi sẽ tạo tệp là tập lệnh của chúng tôi trên máy cục bộ của máy chủ chứ không phải từ xa. Chúng tôi sẽ sử dụng VIM (không giữ nó chống lại tôi nếu bạn là một fan hâm mộ nano hoặc emacs - nhưng tôi sẽ không liệt kê cách sử dụng VIM để chỉnh sửa một tệp ở đây,) đầu tiên tạo tệp và sử dụng mysqldump , sao lưu cơ sở dữ liệu của bạn. Chúng tôi cũng sẽ sử dụng scp để Sau khi cơ sở dữ liệu đã được tạo, hãy nén tệp của bạn để lưu trữ. Đọc tệp tin STDOUT để đáp ứng các hướng dẫn. Cuối cùng, kiểm tra các tệp cũ hơn 7 ngày. Loại bỏ chúng. Để thực hiện việc này, tập lệnh của bạn sẽ trông giống như sau:

vim /backupscripts/mysqldbbackup.sh 

#!/bin/sh 

# create a temporary file for the schema to be stored 
BACKUPDIR = /backuplogs/ 
TMPFILE = tmpout.sql 
CURRTIME = $(date +%Y%m%d).tgz 

#backup your database 
mysqldump -ubackupdbuser -pbackuppassword databasename > $BACKUPDIR$TMPFILE 

#compress this file and store it locally with the current date 
tar -zvcf /backuplogs/backupdb-$CURRTIME $BACKUPDIR$TMPFILE 

#per instructions - cat the contents of the SQL file to STDOUT 
cat $BACKUPDIR$TMPFILE 

#cleanup script 
# remove files older than 7 days old 
find $BACKUPDIR -atime +7 -name 'backup-db-*.tgz' -exec rm {} \; 

#remove the old backupdirectory from the remote server 
ssh [email protected] find /backuplogs/ -name 'backup-db-*.tgz' -exec rm {} \; 

#copy the current backup directory to the remote server using scp 
scp -r /backuplogs/ [email protected]:/backuplogs/ 

################# 
# End script 
################# 

Với kịch bản này, chúng tôi sẽ không cần phải đặt mật khẩu mỗi khi tập lệnh chạy. Chúng tôi sẽ làm điều này với SSH-keygen và lệnh:

ssh-keygen -t rsa 

Nhập mật khẩu tại dấu nhắc - điều này tạo khóa riêng của bạn. Không chia sẻ điều này.

Tệp bạn cần chia sẻ là khóa công khai của bạn, tệp được lưu trữ trong tệp current_home/.ssh/id_rsa.pub. Bước tiếp theo là chuyển khóa công khai này đến máy chủ từ xa của bạn. Để lấy chìa khóa, hãy sử dụng lệnh:

cat current_home/.ssh/id_rsa.pub 

sao chép chuỗi trong tệp. Tiếp theo ssh vào máy chủ từ xa của bạn bằng cách sử dụng lệnh:

ssh [email protected] 

Nhập mật khẩu của bạn và sau đó chỉnh sửa tệp /.ssh/authorized_keys. Dán chuỗi được lấy từ tệp id_rsa.pub của bạn vào tệp authorized_keys. Viết các thay đổi cho tệp bằng trình soạn thảo của bạn và sau đó thoát khỏi trình chỉnh sửa. Đăng xuất khỏi máy chủ từ xa của bạn và kiểm tra các khóa RSA đã hoạt động bằng cách cố đăng nhập lại vào máy chủ từ xa bằng cách sử dụng lệnh ssh trước đó. Nếu không có mật khẩu được yêu cầu, nó đang hoạt động đúng. Đăng xuất khỏi máy chủ từ xa một lần nữa.

Điều cuối cùng chúng tôi cần làm là tạo một công việc cron để chạy điều này mỗi đêm sau khi người dùng đã đăng xuất. Sử dụng crontab, chúng tôi sẽ chỉnh sửa tệp người dùng hiện tại (root) để tránh tất cả các vấn đề về quyền. * Lưu ý - điều này có thể có ý nghĩa nghiêm trọng nếu có lỗi trong tập lệnh của bạn bao gồm xóa dữ liệu, lỗ hổng bảo mật, v.v. - kiểm tra kỹ tất cả công việc của bạn và đảm bảo bạn tin tưởng vào hệ thống của riêng mình, nếu điều này là không thể các quyền sẽ được thiết lập trên máy chủ hiện tại *. Để chỉnh sửa crontab hiện tại của bạn, chúng tôi sẽ phát hành lệnh:

crontab -e 

Trong khi trong trình soạn thảo crontab (nó sẽ mở trong trình soạn thảo văn bản mặc định của bạn), chúng ta sẽ thiết lập kịch bản của chúng tôi để chạy mỗi đêm lúc 12 : 30 giờ sáng. Nhập một dòng mới vào trình soạn thảo:

30 0 * * * bash /backupscripts/mysqldbbackup.sh

Lưu tập tin này và thoát khỏi trình soạn thảo. Để cronjob của bạn chạy đúng cách, chúng tôi sẽ cần phải khởi động lại dịch vụ crond. Để thực hiện việc này, hãy ra lệnh:

/etc/init.d/crond restart 
Các vấn đề liên quan