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 đó?
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:
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
mysql -u root -p < alldb.sql
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
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 if
và fi
dòng. Trong biến ExcludeDatabases
bạ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].
-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;"
U+200C U+200B
giữa "c" và "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
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 mysqldump
tệ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;
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.cnf
hã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"
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'
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 :)
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ú:
ExcludeDatabases
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"