Xuất và nhập tất cả các cơ sở dữ liệu MySQL cùng một lúc


354

Tôi muốn giữ một bản sao lưu của tất cả các cơ sở dữ liệu MySQL của tôi. Tôi có hơn 100 cơ sở dữ liệu MySQL. Tôi muốn xuất tất cả chúng cùng một lúc và nhập lại tất cả chúng vào máy chủ MySQL của tôi cùng một lúc. Làm thế nào tôi có thể làm điều đó?

Câu trả lời:


775

Xuất khẩu:

mysqldump -u root -p --all-databases > alldb.sql

Tra cứu tài liệu cho mysqldump . Bạn có thể muốn sử dụng một số tùy chọn được đề cập trong các bình luận:

mysqldump -u root -p --opt --all-databases > alldb.sql
mysqldump -u root -p --all-databases --skip-lock-tables > alldb.sql

Nhập khẩu:

mysql -u root -p < alldb.sql

1
mysqldump -uroot -p --opt --all-cơ sở dữ liệu> alldb.sql
một lập trình viên

7
mysqldump -uroot -p --all-cơ sở dữ liệu --skip-lock-bảng> alldb.sql
đền

12
Thêm tùy chọn --verbose hoặc -v để xem quá trình kết xuất đang diễn ra như thế nào.
bagonyi

4
@ HalilÖzgür từ trang man mysqldump: "mysqldump không kết xuất cơ sở dữ liệu Information_SCHema hoặc Performance_schema theo mặc định.
mmsters

2
CẢNH BÁO , nhập sẽ ghi đè lên tất cả người dùng MySQL hiện tại của bạn.
RousseauAlexandre

218

Giải pháp khác:

Nó sao lưu mỗi cơ sở dữ liệu vào một tệp khác nhau

#!/bin/bash

USER="zend"
PASSWORD=""
#OUTPUT="/Users/rabino/DBs"

#rm "$OUTPUTDIR/*gz" > /dev/null 2>&1

databases=`mysql -u $USER -p$PASSWORD -e "SHOW DATABASES;" | tr -d "| " | grep -v Database`

for db in $databases; do
    if [[ "$db" != "information_schema" ]] && [[ "$db" != "performance_schema" ]] && [[ "$db" != "mysql" ]] && [[ "$db" != _* ]] ; then
        echo "Dumping database: $db"
        mysqldump -u $USER -p$PASSWORD --databases $db > `date +%Y%m%d`.$db.sql
       # gzip $OUTPUT/`date +%Y%m%d`.$db.sql
    fi
done

3
Tôi thích cách tiếp cận này, vì điều này làm cho tất cả các cơ sở dữ liệu biến thành tập tin khác nhau.
Arda

10
Bạn có thể đơn giản hóa / cải thiện tập lệnh một chút: Thay thế dòng thứ 9 [cơ sở dữ liệu = ...] bằng hai dòng sau: ExcludeDatabases="Database|information_schema|performance_schema|mysql"[dòng tiếp theo] databases=`-u $USER -p$PASWORD -e "SHOW DATABASES;" | tr -d "| " | egrep -v $ExcludeDatabases`và loại bỏ hoàn toàn iffidòng. Trong biến ExcludeDatabasesbạn lưu trữ tên của cơ sở dữ liệu không nên bị bỏ [cơ sở dữ liệu hệ thống thông thường].
Peter VARGA

2
@jruzafa Bạn có thể sử dụng -Bse "show databases"để tránh đầu ra định dạng bổ sung và do đó bạn có thể xóa | tr -d "| " | grep -v Database. Trong kịch bản xuất của tôi, dòng này làdatabases=`mysql -u $USER -p$PASSWORD -Bse "SHOW DATABASES;"
miquel 7/11/2015

6
Tạo tập lệnh đảo ngược (nhập): gist.github.com/tenold/aa5e107d93c0f54436cb
Corey

1
CẢNH BÁO: Nhận xét rất hữu ích của @AlBundy ở trên có chứa chuỗi ký tự unicode U+200C U+200Bgiữa "c""h" của từ "lược đồ" . Điều này phá vỡ sao chép và dán bit đó. Thảo luận thêm về vấn đề này tại đây: meta.stackexchange.com/questions/170970/ trên
billynoah

29

Tất cả các câu trả lời tôi thấy trong câu hỏi này có thể có vấn đề với bộ ký tự trong một số cơ sở dữ liệu do vấn đề chuyển hướng thoát khỏi mysqldumptệp trong toán tử shell >.

Để giải quyết vấn đề này, bạn nên thực hiện sao lưu bằng một lệnh như thế này

mysqldump -u root -p --opt --all-databases -r backup.sql

Để thực hiện khôi phục BD tốt mà không có bất kỳ vấn đề nào với các bộ ký tự. Rõ ràng bạn có thể thay đổi bộ ký tự mặc định khi bạn cần.

mysql -uroot -p --default-character-set=utf8
mysql> SET names 'utf8';
mysql> SOURCE backup.sql;

-R làm gì?
Luca Reghellin

3
-r đặt tên của tệp đích nơi đầu ra sẽ được ghi vào.
NetVicy

Sẽ tốt hơn nếu sử dụng utf8mb4 thay vì utf8 cho bộ ký tự?
kojow7

1
Nó phụ thuộc vào những gì bạn đang lưu trữ trong bảng yout. bộ ký tự utf8 có tối đa 3 byte cho mỗi ký tự. utf8mb4 có tối đa 4 byte cho mỗi ký tự. Rõ ràng nếu cơ sở dữ liệu của bạn trên utf8mb4, bạn nên sử dụng bộ ký tự đó để khôi phục nó.
NetVicy

9

Dựa trên những câu trả lời này, tôi đã tạo tập lệnh sao lưu tất cả các cơ sở dữ liệu thành các tệp riêng biệt, nhưng sau đó nén chúng vào một kho lưu trữ với ngày là tên.

Điều này sẽ không yêu cầu mật khẩu, có thể được sử dụng trong cron. Để lưu mật khẩu, .my.cnfhãy kiểm tra câu trả lời này https://serverfault.com/a/143587/62749

Được thực hiện với các bình luận cho những người không quen thuộc với các tập lệnh bash.

#!/bin/bash

# This script will backup all mysql databases into 
# compressed file named after date, ie: /var/backup/mysql/2016-07-13.tar.bz2

# Setup variables used later

# Create date suffix with "F"ull date format
suffix=$(date +%F)
# Retrieve all database names except information schemas. Use sudo here to skip root password.
dbs=$(sudo mysql --defaults-extra-file=/root/.my.cnf --batch --skip-column-names -e "SHOW DATABASES;" | grep -E -v "(information|performance)_schema")
# Create temporary directory with "-d" option
tmp=$(mktemp -d)
# Set output dir here. /var/backups/ is used by system, 
# so intentionally used /var/backup/ for user backups.
outDir="/var/backup/mysql"
# Create output file name
out="$outDir/$suffix.tar.bz2"

# Actual script

# Check if output directory exists
if [ ! -d "$outDir" ];then
  # Create directory with parent ("-p" option) directories
  sudo mkdir -p "$outDir"
fi

# Loop through all databases
for db in $dbs; do
  # Dump database to temporary directory with file name same as database name + sql suffix
  sudo mysqldump --defaults-extra-file=/root/.my.cnf --databases "$db" > "$tmp/$db.sql"
done

# Go to tmp dir
cd $tmp

# Compress all dumps with bz2, discard any output to /dev/null
sudo tar -jcf "$out" * > "/dev/null"

# Cleanup
cd "/tmp/"
sudo rm -rf "$tmp"

1
Thật tốt khi bạn trở lại để đóng góp bổ sung của bạn. phiếu bầu từ tôi
Fr0zenFyr

7

Tại sao phân tích cú pháp định dạng đầu ra trong khi lệnh mysql có thể làm trực tiếp những gì bạn muốn?

databases=`mysql -u $USER -p$PASSWORD --batch --skip-column-names -e "SHOW DATABASES;" | grep -E -v "(information|performance)_schema"`

Liệt kê tên cơ sở dữ liệu và chỉ này.


3

Hãy cẩn thận khi xuất và nhập vào các phiên bản MySQL khác nhau vì các bảng mysql có thể có các cột khác nhau. Cấp đặc quyền có thể không hoạt động nếu bạn không gặp may. Tôi đã tạo tập lệnh này (mysql_export_grant.sql) để kết xuất các khoản tài trợ để nhập vào cơ sở dữ liệu mới, chỉ trong trường hợp:

#!/bin/sh
stty -echo
printf 'Password: ' >&2
read PASSWORD
stty echo
printf "\n"
if [ -z "$PASSWORD" ]; then
        echo 'No password given!'
        exit 1
fi
MYSQL_CONN="-uroot -p$PASSWORD"
mysql ${MYSQL_CONN} --skip-column-names -A -e"SELECT CONCAT('SHOW GRANTS FOR ''',user,'''@''',host,''';') FROM mysql.user WHERE user<>''" | mysql ${MYSQL_CONN} --skip-column-names -A | sed 's/$/;/g'

3

Khi bạn đang bán phá giá tất cả các cơ sở dữ liệu. Rõ ràng nó đang có dữ liệu lớn. Vì vậy, bạn có thể thích dưới đây cho tốt hơn:

Tạo sao lưu:

mysqldump -u [user] -p[password]--single-transaction --quick --all-databases | gzip > alldb.sql.gz

Nếu lỗi

- Cảnh báo: Bỏ qua dữ liệu của bảng mysql.event. Chỉ định rõ ràng tùy chọn --events.

Sử dụng:

mysqldump -u [user] -p --events --single-transaction --quick --all-databases | gzip > alldb.sql.gz

Khôi phục sao lưu:

gunzip < alldb.sql.gz | mysql -u [user] -p[password]

Hy vọng nó sẽ giúp :)


3

Tôi đã viết bình luận này hơn 4 năm trước và quyết định đưa ra câu trả lời.

Các kịch bản từ jruzafa có thể được một chút đơn giản:

#!/bin/bash

USER="zend"
PASSWORD=""
#OUTPUT="/Users/rabino/DBs"

#rm "$OUTPUTDIR/*gz" > /dev/null 2>&1

ExcludeDatabases="Database|information_schema|performance_schema|mysql"
databases=`mysql -u $USER -p$PASSWORD -e "SHOW DATABASES;" | tr -d "| " | egrep -v $ExcludeDatabases`

for db in $databases; do
    echo "Dumping database: $db"
    mysqldump -u $USER -p$PASSWORD --databases $db > `date +%Y%m%d`.$db.sql
    # gzip $OUTPUT/`date +%Y%m%d`.$db.sql
done

Ghi chú:

  1. Các cơ sở dữ liệu bị loại trừ - phổ biến là các bảng hệ thống - được cung cấp trong biến ExcludeDatabases
  2. Xin lưu ý rằng mật khẩu được cung cấp trong dòng lệnh. Điều này được coi là không an toàn. Nghiên cứu câu hỏi này .

0

mysqldump -uroot -proot --all-cơ sở dữ liệu> allDB.sql

lưu ý: -u "tên người dùng của bạn" -p "mật khẩu của bạn"


Câu trả lời của bạn không thực sự giải quyết được vấn đề, bởi vì anh ta đang yêu cầu xuất tất cả các cơ sở dữ liệu cùng một lúc. Có lẽ bạn có thể cải thiện một chút: mysqldump -uroot -proot --all-cơ sở dữ liệu> allDB.sql lưu ý: -u "tên người dùng của bạn" -p "mật khẩu của bạn"
Marwan Salim

0

Xuất tất cả các cơ sở dữ liệu trong Ubuntu

1 - mysqldump -u root -p --databases database1 database2 > ~/Desktop/databases_1_2.sql

HOẶC LÀ

2 - mysqldump -u root -p --all_databases > ~/Desktop/all_databases.sql

nhập mô tả hình ảnh ở đây

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.