Khôi phục cơ sở dữ liệu MySQL từ các tệp vật lý


139

Có thể khôi phục cơ sở dữ liệu MySQL từ các tệp cơ sở dữ liệu vật lý. Tôi có một thư mục có các loại tệp sau:

client.frm
client.MYD
client.MYI

nhưng cho khoảng 20 bảng nữa.

Tôi thường sử dụng mysqldump hoặc một công cụ tương tự để lấy mọi thứ trong 1 tệp SQL, vậy cách nào để xử lý các loại tệp này?


Tôi có cùng một vấn đề: nhiều tệp có phần mở rộng FRM, MYD và MYI. Tôi cũng có các tệp ib_logfile0, ib_logfile1 và ibdata1. Tôi không thể truy cập một máy chủ đang chạy hoặc tạo một bãi chứa. Tôi đã thử chạy một máy chủ MySQL mới và sử dụng các tệp, nhưng tôi không thành công ... Có ai có cách làm rõ ràng không?
flo5783

Câu trả lời:


132

Bảng MyISAM của MySQL là sự kết hợp của ba tệp:

  • Tệp FRM là định nghĩa bảng.
  • Tệp MYD là nơi lưu trữ dữ liệu thực tế.
  • Tệp MYI là nơi các chỉ mục được tạo trên bảng được lưu trữ.

Bạn sẽ có thể khôi phục bằng cách sao chép chúng trong thư mục cơ sở dữ liệu của bạn (Trong linux, vị trí mặc định là /var/lib/mysql/ )

Bạn nên làm điều đó trong khi máy chủ không chạy.


64
Điều này chỉ đúng với các bảng MyISAM. InnoDB lưu trữ các bảng và chỉ mục của nó trong một không gian bảng *, theo mặc định bao gồm 3 tệp ibdata1, ib_logfile0 và ib_logfile1. để khôi phục cơ sở dữ liệu, bạn cũng sẽ cần những tệp đó. * không gian bảng trên mỗi bảng có thể, nhưng không phải mặc định
ax.

21
Anh ta nói rằng anh ta có các tập tin .frm .myi và .myd. Sau đó tôi cho rằng đó là bảng MyISAM.
Vincent

5
Câu trả lời có giá trị, nhưng tôi phải tiến thêm một bước để mọi thứ hoạt động tốt: vì tôi phải đăng nhập bằng root để khôi phục các tệp, mysqlngười dùng đang chạy mysqldquá trình không thể truy cập chúng. Thực hiện một chmod -R mysql:mysql .thư mục dữ liệu mysql rất nhanh chóng và dễ dàng, nhưng tìm ra, trước đó, tại sao tất cả các DB resoterd của tôi dường như không có bảng nào mất nhiều thời gian hơn.
Edurne Pascual

10
herenvardo Tôi nghĩ bạn có nghĩa là chown không chmod
Oliver M Grech

2
Để tóm tắt một số ghi chú quan trọng, bạn có thể phải gửi chowncác tệp được sao chép như sau:sudo chown -R mysql:mysql /var/lib/mysql
Jacksonkr

50

Từ câu trả lời của @Vicent, tôi đã khôi phục cơ sở dữ liệu MySQL như dưới đây:

Bước 1. Tắt máy chủ Mysql

Bước 2. Sao chép cơ sở dữ liệu trong thư mục cơ sở dữ liệu của bạn (trong linux, vị trí mặc định là / var / lib / mysql). Giữ cùng tên của cơ sở dữ liệu và cùng tên của cơ sở dữ liệu trong chế độ mysql.

sudo cp -rf   /mnt/ubuntu_426/var/lib/mysql/database1 /var/lib/mysql/

Bước 3: Thay đổi chế độ riêng và thay đổi thư mục:

sudo chown -R mysql:mysql /var/lib/mysql/database1
sudo chmod -R 660 /var/lib/mysql/database1
sudo chown  mysql:mysql /var/lib/mysql/database1 
sudo chmod 700 /var/lib/mysql/database1

Bước 4: Sao chép ibdata1 trong thư mục cơ sở dữ liệu của bạn

sudo cp /mnt/ubuntu_426/var/lib/mysql/ibdata1 /var/lib/mysql/

sudo chown mysql:mysql /var/lib/mysql/ibdata1

Bước 5: sao chép các tập tin ib_logfile0 và ib_logfile1 trong thư mục cơ sở dữ liệu của bạn.

sudo cp /mnt/ubuntu_426/var/lib/mysql/ib_logfile0 /var/lib/mysql/

sudo cp /mnt/ubuntu_426/var/lib/mysql/ib_logfile1 /var/lib/mysql/

Hãy nhớ thay đổi riêng và thay đổi root của các tệp đó:

sudo chown -R mysql:mysql /var/lib/mysql/ib_logfile0

sudo chown -R mysql:mysql /var/lib/mysql/ib_logfile1

hoặc là

sudo chown -R mysql:mysql /var/lib/mysql

Bước 6 (Tùy chọn): Trang web của tôi có cấu hình để lưu trữ các tệp ở một vị trí cụ thể, sau đó tôi sao chép chúng vào vị trí tương ứng, chính xác.

Bước 7: Khởi động máy chủ Mysql của bạn. Mọi thứ trở lại và tận hưởng nó.

Thế là xong.

Xem thêm thông tin tại: https://biolinh.wordpress.com/2017/04/01/restoring-mysql-database-from-physical-files-debianub Ubuntu /


4
+1 cho hướng dẫn chi tiết từng bước. Nhưng tôi đã chỉnh sửa một số tuyên bố để thực sự phản ánh những gì họ nên được.
Peter

Có lỗi # 1932, không thể truy cập dữ liệu. Các cơ sở dữ liệu xuất hiện, nhưng dữ liệu không thể truy cập. Chạy XAMPP 7.2.12 trên MAC OS X Mojave.
Steve1754a

@ Steve1754a lỗi có thể từ nhiều lý do 1. Bạn có chuyển cơ sở dữ liệu từ Mac OS sang Mac OS không? 2. Vui lòng kiểm tra sự cho phép của các tệp / dữ liệu / bảng đó
biolinh

Đáp án: 1. Có; 2. Tôi đã làm. Tôi đã phải tiến hành xây dựng lại hoàn toàn DB của mình. Không thể tìm ra một giải pháp. Đạo đức cho câu chuyện: luôn tạo bản sao lưu của DB. Tôi ước có một cách dễ dàng để làm điều đó tự động trong XAMPP.
Steve1754a

1
bạn đã cứu mạng tôi
SpongePablo

8

Nếu bạn đang khôi phục thư mục, đừng quên chỉnh sửa các tệp thành mysql: mysql

chown -R mysql:mysql /var/lib/mysql-data

nếu không bạn sẽ gặp lỗi khi cố gắng hủy cơ sở dữ liệu hoặc thêm cột mới, v.v.

và khởi động lại MySQL

service mysql restart

2
đây không thực sự là một câu trả lời cho câu hỏi nhưng rất hữu ích.
ryantuck

Trên thực tế, bạn không nên truy cập mọi thứ vào mysql, thư mục cơ sở dữ liệu mysql sẽ giữ lại nhóm gốc
Galvani

8

Tôi có cùng một vấn đề nhưng không thể khôi phục thành công cơ sở dữ liệu, dựa trên các hướng dẫn ở trên.

Tôi chỉ có thể khôi phục các thư mục cơ sở dữ liệu mysql từ hệ điều hành Ubuntu của mình. Vấn đề của tôi là làm thế nào để khôi phục cơ sở dữ liệu của tôi với các thư mục dữ liệu mysql không thể đọc được. Vì vậy, tôi đã chuyển trở lại hệ điều hành win7 cho môi trường phát triển.

* LƯU Ý Tôi có một máy chủ cơ sở dữ liệu hiện có đang chạy trong win7 và tôi chỉ cần một vài tệp cơ sở dữ liệu để truy xuất từ ​​các tệp được khôi phục. Để khôi phục thành công các tệp cơ sở dữ liệu từ Ubuntu OS, tôi cần cài đặt mới máy chủ cơ sở dữ liệu mysql (cùng phiên bản từ Ubuntu OS trong HĐH win7 của tôi) để khôi phục mọi thứ trong máy chủ cơ sở dữ liệu cũ đó.

  1. Tạo một máy chủ cơ sở dữ liệu mysql mới cùng phiên bản từ các tệp được khôi phục.

  2. Dừng máy chủ mysql

  3. sao chép thư mục đã phục hồi và dán vào cơ sở dữ liệu mysql (C: \ ProgramData \ MySQL \ MySQL Server 5.5 \ data) được lưu trữ.

  4. sao chép tệp ibdata1 nằm trong thư mục cài đặt mys mys linux và dán nó vào (C: \ ProgramData \ MySQL \ MySQL Server 5.5 \ data). Chỉ cần ghi đè lên hiện có hoặc tạo bản sao lưu trước khi thay thế.

  5. khởi động máy chủ mysql và kiểm tra xem bạn đã khôi phục thành công các tệp cơ sở dữ liệu chưa.

  6. Để sử dụng cơ sở dữ liệu đã phục hồi trong máy chủ mysql hiện đang sử dụng của tôi, chỉ cần xuất cơ sở dữ liệu đã phục hồi và nhập vào máy chủ mysql hiện tại của tôi.

Hy vọng những điều này sẽ giúp ích, bởi vì không có gì khác làm việc cho tôi.


1
phương thức này cũng hoạt động trên ubfox / debian với các tệp ibdata1, ib_logfile0 và ib_logfile1 và thư mục cơ sở dữ liệu. người dùng sẽ không được sao chép, nhưng sau đó bạn có thể thêm người dùng mới vào cơ sở dữ liệu và kết xuất nó với cơ sở dữ liệu đó.
bokorben

2

Với MySql 5.1 (Win7). Để tạo lại DB (InnoDbs) Tôi đã thay thế tất cả nội dung của các thư mục sau (thông số my.ini):

datadir="C:/ProgramData/MySQL/MySQL Server 5.1/Data/"
innodb_data_home_dir="C:/MySQL Datafiles/"

Sau đó tôi bắt đầu Dịch vụ MySql và tất cả đều hoạt động tốt.


1

Vâng, đúng vậy! Chỉ cần thêm chúng vào thư mục cơ sở dữ liệu của bạn (tùy thuộc vào HĐH) và chạy một lệnh như "Quyền sửa lỗi của MySQL". Điều này lưu trữ lại cơ sở dữ liệu. Cũng thấy rằng các quyền chính xác được thiết lập trên các tệp là tốt.


Tôi đã làm nó, nhưng tôi không nhận ra các bảng. Như tôi đã nói trong nhận xét của tôi về câu trả lời trước.
orezvani

0

Tôi đã từng sao chép các tệp này vào thư mục lưu trữ cơ sở dữ liệu cho cơ sở dữ liệu mysql đang hoạt động, khởi động db và đợi nó "sửa chữa" các tệp, sau đó trích xuất chúng bằng mysqldump.


-1

Trong trường hợp của tôi, chỉ cần loại bỏ tc.log trong / var / lib / mysql là đủ để bắt đầu lại mariadb / mysql.


đây không phải là vấn đề có thể khởi động / khởi động lại máy chủ mysql.
Oluwatumbi
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.