Làm cách nào để di chuyển thư mục dữ liệu MySQL?


57

Tôi đang cố gắng di chuyển thư mục dữ liệu của cơ sở dữ liệu MySQL của tôi sang một mảng đĩa thứ hai mà tôi có như một điểm gắn kết /array2/.

Vấn đề tôi gặp phải là tôi đã thử tất cả mọi thứ và sau khi tôi sửa đổi vị trí của datadir trong my.cnf mysql sẽ không khởi động lại.

Tất cả tôi nhận được là:

start: Job failed to start

Câu trả lời:


62

Quên về áo giáp ứng dụng.

Đối với bất cứ ai quan tâm tôi đã làm như sau để di chuyển thư mục.

Dừng máy chủ mysql:

stop mysql

Tạo thư mục mới:

mkdir /array2/mysql

Sao chép CHỈ các thư mục cơ sở dữ liệu:

cp -R /var/lib/mysql /array2/mysql
cp -R /var/lib/mysql/users /array2/mysql

Sao lưu my.cnftệp:

cp /etc/mysql/my.cnf /root/my.cnf.backup

Chỉnh sửa my.cnftập tin:

nano /etc/mysql/my.cnf

Thay đổi tất cả các đề cập của datadir cũ và ổ cắm sang vị trí mới của bạn

Của tôi đã trở thành:

datadir=/array2/mysql
socket=/array2/mysql/mysql.sock

Cập nhật quyền truy cập thư mục:

chown -R mysql:mysql /array2/mysql

Đổi tên thư mục cũ:

mv /var/lib/mysql /var/lib/mysql-old

Tạo một liên kết tượng trưng, ​​chỉ trong trường hợp:

ln -s /array2/mysql /var/lib/mysql 

Hãy cho AppArmor biết về datadir mới:

echo "alias /var/lib/mysql/ -> /your/new/datadir/," >> /etc/apparmor.d/tunables/alias

Tải lại hồ sơ apparmor

sudo /etc/init.d/apparmor reload

Sau đó bắt đầu mysql:

start mysql

Đây là một câu trả lời tốt nhưng bạn có thể cần thêm một bước nữa để cho phép khách hàng kết nối với mysql. Thêm một nhóm mới với một dòng bên dưới nó ... [client] socket = / Array2 / mysql / mysql.sock trong đó socket = part trỏ đến vị trí mới của tệp mysql.sock của bạn.
Cú đêm

1
Nếu bạn không muốn bị làm phiền khi hợp nhất /etc/apparmor.d/usr.sbin.mysqldmỗi khi mysql nhận được bản cập nhật, bạn có thể thêm /array2/mysql/** rwk,vào để /etc/apparmor.d/local/usr.sbin.mysqldthay thế. Mysql vẫn sẽ có quyền truy cập vào thư mục dữ liệu cũ, nhưng đó có lẽ không phải là vấn đề.
drevicko

sed -i "s,datadir.*=.*,datadir=$new_dir,g" /etc/mysql/my.cnf. Tại sao chỉ có các thư mục cơ sở dữ liệu?
int_ua

Đối với bất kỳ ai chuyển datadir của họ sang ZFS (như tôi đã làm), hãy đảm bảo bạn cũng thêm: innodb_use_native_aio=0trong [mysqld]phần my.cnftệp của bạn , vì ZFS trên linux không hỗ trợ AIO. dev.mysql.com/doc/refman/5.5/en/ từ
Andrew Oblley

23

Tôi thấy rằng AppArmor là thủ phạm bằng cách kiểm tra syslogvà có thể thay đổi thành công mysqlvị trí dữ liệu bằng cách làm theo quy trình này.

Xin lưu ý rằng, trong các tệp được chỉnh sửa bên dưới, các dòng bắt đầu bằng +đã được thêm và các dòng bắt đầu bằng -đã bị xóa. Bạn không nên thực sự gõ / dán các +dấu hiệu khi thêm dòng vào các tệp này.

Tôi nhân bản mysqlthư mục đến vị trí mới:

sudo rsync -av /var/lib/mysql /new_dir

Sau đó, tôi chỉnh sửa datadirdòng trong /etc/mysql/my.cnf:

sudo vi /etc/mysql/my.cnf
-datadir     = /var/lib/mysql
+datadir     = /new_dir/mysql

Sau đó tôi chỉnh sửa /etc/apparmor.d/usr.sbin.mysqld:

sudo vi /etc/apparmor.d/usr.sbin.mysqld
-  /var/lib/mysql/ r,
-  /var/lib/mysql/** rwk,
+  /new_dir/mysql/ r,
+  /new_dir/mysql/** rwk,

Sau đó tôi khởi động lại mysql.


13

Hãy nhận biết.

Nếu bạn có các bảng InnoDB, bạn PHẢI sao chép qua các tệp ibdata*ib_logfile*nếu không bạn sẽ không thể sử dụng các bảng. Bạn sẽ nhận được:

'Bảng' cơ sở dữ liệu.tableName 'không tồn tại'

lỗi.

Chạy lệnh sao chép này để sao chép trên ibdata*ib_logfile*các tập tin.

sudo cp -p /var/lib/mysql/ib* /array2/mysql/

Đây phải là một nhận xét, nó không phải là một câu trả lời hoàn chỉnh
Postadelmaga

4

Tôi vừa thử một cách khác, mà một số có thể thấy hữu ích:

sao chép với quyền còn nguyên vẹn:

rsync -avzh /var/lib/mysql /path/to/new/place

sao lưu (trong trường hợp có sự cố):

mv /var/lib/mysql /var/lib/_mysql

tạo một thư mục trống mới thay cho thư mục cũ:

mkdir /var/lib/mysql

liên kết gắn kết vị trí mới với cái cũ:

mount -B /path/to/new/place /var/lib/mysql

Hy vọng điều đó sẽ giúp được ai đó, vì liên kết tượng trưng không hiệu quả với tôi và đây là cách đơn giản nhất


3

Nếu bạn di chuyển datadir của mình, bạn không chỉ cần cấp quyền datadir mới mà còn cần đảm bảo tất cả các thư mục cha mẹ đều có quyền.

Tôi đã chuyển datadir của mình sang ổ cứng, được gắn vào Ubuntu dưới dạng:

/media/*user*/Data/

và datadir của tôi là Cơ sở dữ liệu .

Tôi đã phải đặt quyền thành 771 cho mỗi thư mục phương tiện, người dùng và Dữ liệu:

sudo chmod 771 *DIR*

Nếu điều này không hoạt động, một cách khác mà bạn có thể khiến mysql hoạt động là thay đổi người dùng trong /etc/mysql/my.cnf thành root; mặc dù không có nghi ngờ gì về một số vấn đề với việc làm điều đó từ góc độ bảo mật.


2

Tôi thích sử dụng mount với tùy chọn liên kết để tôi tránh mọi thay đổi hơn nữa trong cấu hình Apparmor và Mysql.


Ví dụ:

Giả sử tôi muốn di chuyển mọi thứ vào /var/www. Hãy nói rằng thư mục này là môi trường dev của tôi và nó được gắn kết trong một phân vùng khác

  1. Đầu tiên chúng ta cần dừng mysql :

    sudo systemctl stop mysql.service
    
  2. Chúng tôi di chuyển các tập tin (bảo vệ quyền)

    sudo rsync -av /var/lib/mysql /var/www
    

    Điều này sẽ tạo ra một thư mục /var/www/mysql/với tất cả các nội dung.

  3. Chúng tôi xóa mọi thứ trong thư mục cũ:

    sudo rm -r /var/lib/mysql/*
    
  4. Chúng tôi gắn thư mục mới với bindtùy chọn trong thư mục cũ.
    chỉnh sửa /etc/fstabvà thêm dòng này:

    /var/www/mysql /var/lib/mysql  none  bind 0 0
    

    Điều này sẽ gắn kết /var/www/mysqltrong dir trống của chúng tôi /var/lib/mysql
    Các bindtùy chọn ở đây làm sự kỳ diệu, nó sẽ cư /var/lib/mysqlvới nội dung của /var/www/mysqlnhư vậy cho mysql và AppArmor nó sẽ được như thế không có gì đã thay đổi.

  5. Bây giờ chúng tôi thực hiện gắn kết:

    sudo mount -a
    

    và khởi động lại mysql.


0

Bạn nhận ra nếu bạn làm theo các nguyên văn từ câu trả lời được chấp nhận thì nó sẽ thất bại?

cp -R / var / lib / mysql / mảng2 / mysql

Sẽ sao chép / var / lib / mysql sang / mảng2 / mysql / mysql.

Khi bạn thiết lập tệp cấu hình của mình, tốt hơn bạn nên đặt / mảng2 / mysql / mysql làm thư mục nếu không mysqld của bạn sẽ không khởi động được.

Các lệnh sao chép tốt hơn sẽ là:

cp -R / var / lib / mysql / mảng2 / cp -R / var / lib / mysql / users / mảng2 / mysql

Chỉ cần 2 xu của tôi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.