ตัวเลือกใด ๆ สำหรับ mysqldump เพื่อละเว้นฐานข้อมูลสำหรับการสำรองข้อมูลหรือไม่


23

เรามี 40 ฐานข้อมูลในเซิร์ฟเวอร์ของเรา

เราต้องการสำรองฐานข้อมูล 36 ไฟล์โดยใช้ mysqldump ฉันจะเพิกเฉยฐานข้อมูล 4 ที่เหลือในคำสั่ง mysqldump ได้อย่างไร มีตัวเลือกสำหรับ mysqldump ที่จะไม่สนใจฐานข้อมูลสำรองใน MySQL หรือไม่?

ฉันรู้ว่าคำสั่ง mysqldump ทั่วไป แต่มันมีความยาวมาก ฉันต้องการที่จะเพิกเฉยฐานข้อมูลเพียง 4 และต้องการสำรองข้อมูล dbs ที่เหลืออยู่

คำตอบ:


16

ย้อนกลับไปวันที่ 16 ธันวาคม 2011 ฉันตอบคำถามคุณทำตาราง mysqldump เฉพาะอย่างไร

ฉันรวบรวมตารางทั้งหมดไม่รวมชื่อตารางบางชุด

โดยใช้หลักการเดียวกันคุณสามารถรวบรวมชื่อฐานข้อมูลทั้งหมดจากตารางข้อมูลเมตาinformation_schema.schemataที่คุณต้องการ mysqldump'd สร้างแบบสอบถามเพื่อส่งคืนรายการนั้นจากนั้นใช้รายการฐานข้อมูลเพื่อกำหนดคำสั่ง mysqldump

DATABASES_TO_EXCLUDE="db1 db2 db3"
EXCLUSION_LIST="'information_schema','mysql'"
for DB in `echo "${DATABASES_TO_EXCLUDE}"`
do
    EXCLUSION_LIST="${EXCLUSION_LIST},'${DB}'"
done
SQLSTMT="SELECT schema_name FROM information_schema.schemata"
SQLSTMT="${SQLSTMT} WHERE schema_name NOT IN (${EXCLUSION_LIST})"
MYSQLDUMP_DATABASES="--databases"
for DB in `mysql -ANe"${SQLSTMT}"`
do
    MYSQLDUMP_DATABASES="${MYSQLDUMP_DATABASES} ${DB}"
done
MYSQLDUMP_OPTIONS="--routines --triggers"
mysqldump ${MYSQLDUMP_OPTIONS} ${MYSQLDUMP_DATABASES} > MySQLDatabases.sql

สิ่งที่คุณต้องทำคือใส่ฐานข้อมูลที่คุณไม่ต้องการให้ mysqldump ใส่เข้าไป DATABASES_TO_EXCLUDE

ให้มันลอง !!!


ไม่จำเป็นต้องแยกinformation_schemaว่าจะไม่ถูกทิ้งเลย mysqldump does not dump the INFORMATION_SCHEMA or performance_schema database by default. To dump either of these, name it explicitly on the command line and also use the --skip-lock-tables option. You can also name them with the --databases option. Before MySQL 5.5 mysqldump silently ignores INFORMATION_SCHEMA even if you name it explicitly on the command line. dev.mysql.com/doc/refman/5.5/en/mysqldump.html
Luka

15

ใช้ grep เพื่อแยกฐานข้อมูลที่คุณไม่ต้องการ:

candidates=$(echo "show databases" | mysql | grep -Ev "^(Database|mysql|performance_schema|information_schema)$")
mysqldump --databases $candidates 

จากการดูที่/programming/19354870/bash-command-line-and-input-limitดูเหมือนว่าคุณจะสามารถจัดการกับสายยาว ๆ ได้ มิฉะนั้นคุณสามารถ

candidates=$(echo "show databases" | mysql | grep -Ev "^(Database|mysql|performance_schema|information_schema)$")
for candidate in $candidates[*]; do
    mysqldump $candidate 
done

หนึ่งควรเพิ่ม `| วาง -SD "" -` หลังเพื่อที่จะผ่านจากการส่งออกไปยังหลายบรรทัดเดียวกับชื่อฐานข้อมูลแต่ละคั่นด้วยพื้นที่ซึ่งถูกต้องตามgrep mysqldumpดังนั้นคำสั่งจะเป็นcandidates=$(echo "show databases" | mysql | grep -Ev "^(Database|mysql|performance_schema|information_schema)$" | paste -sd " " -)
Anthony O.

8

ฉันไม่คิดว่ามันเป็นไปได้ แต่คุณสามารถลองวิธีแก้ปัญหาเหล่านี้ซึ่งคุณจะต้องพิมพ์ชื่อของฐานข้อมูลทั้งหมดที่คุณต้องการถ่ายโอนข้อมูล

mysqldump -u root -password --databases db1 db2 db3 ... db36 > mydb_dump.sql

แจ้งให้เราทราบว่าวิธีแก้ปัญหาช่วยได้หรือไม่


1
ฉันรู้ว่าคำสั่งนี้ แต่มันมีความยาวมากฉันต้องการเพิกเฉยต่อฐานข้อมูล 4 ฐานและจำเป็นต้องสำรองข้อมูล dbs ที่เหลืออยู่
ashuthosh

3

แม้ที่นี่จะมีคำตอบที่ยอดเยี่ยมมากมายดังนั้นโพสต์นี้เป็นเพียงการเพิ่มทางเลือกอีกทางเลือกหนึ่ง ในสคริปต์ด้านล่าง 2 บรรทัดคุณสามารถนำเซิร์ฟเวอร์ของคุณไปสำรองฐานข้อมูลทั้งหมดโดยไม่สนใจฐานข้อมูลบางส่วน

DB_LIST=`mysql -Nse "SELECT GROUP_CONCAT(SCHEMA_NAME SEPARATOR ' ') FROM information_schema.SCHEMATA WHERE SCHEMA_NAME NOT IN ('mysql','information_schema','performance_schema','sys');"`

mysqldump -R -B $DB_LIST > BACKUPNAME.sql

1
ขอบคุณสำหรับการรวมsysตั้งแต่นั้นเป็นส่วนหนึ่งของ MySQL 5.7
RolandoMySQLDBA

ขอบคุณ @RolandoMySQLDBA ผมมักจะได้รับความช่วยเหลือจากโพสต์ที่ยอดเยี่ยมของคุณ / บล็อก ... ขอบคุณอีกครั้งสำหรับคำชมเชยของคุณ ...
Zafar มาลิก

2

หรือคุณสามารถดูลิงค์ต่อไปนี้

ตัวเลือกฐานข้อมูล Mysqldump ละเว้น

            OR

แฮ็กไม่กี่ตัวเพื่อจำลอง mysqldump --ignore-database

การใช้ mysqldump –ignore-database

แจ้งให้เราทราบว่าวิธีแก้ปัญหาช่วยได้หรือไม่

โชคดี!


1

หลายคนต้องการให้ mysqldump ละเลยฐานข้อมูลเสมอ

คุณเชื่อไหมว่าตอนนี้มีตัวเลือกอยู่หรือไม่ ??? ไม่ไม่ได้อยู่ใน mysqldump

Oracle (Yuck, toowee, ยังไม่แผ่ออกไป) มีDataPump (expdb impdp)เพื่อถ่ายโอนฐานข้อมูล Oracle ตั้งแต่ MySQL 5.7 ในตระกูล Oracle (ยังเจ็บอยู่) โปรแกรมอรรถประโยชน์การสำรองข้อมูลใหม่นี้เรียกว่าmysqlpumpซึ่งมาพร้อมกับ- ยกเว้นฐานข้อมูลและตัวเลือกอื่น ๆ ที่เรียบร้อย เช่นเดียวกับน้องเก่าของdatapump , mysqlpumpยังมีความคล้ายคลึงกันที่จะช่วยเพิ่มความเร็วในการถ่ายโอนข้อมูลและการทำงานแบ่ง ในเวลานี้ฉันยังไม่ได้รวมเข้าไปในงาน แต่มันก็ดูมีแนวโน้มมาก เมื่อฉันดำน้ำลึกลงไปในmysqlpumpฉันอาจจะพบว่ามันจะนำลักษณะเดียวกันและความรู้สึกเป็นของออราเคิลdatapump

หากมีใครใน MySQL Parallel Universe ที่มีเรื่องราวเกี่ยวกับเรื่องนี้โปรดโพสต์ไว้ที่นี่


0

คำตอบของ Rolando นั้นยอดเยี่ยมมาก แต่ฉันต้องการสคริปต์ที่สามารถนำกลับมาใช้ใหม่ในโครงการต่างๆ ดังนั้นฉันจึงใช้สคริปต์ของเขาและแก้ไขเพื่อให้คุณสามารถทำสิ่งต่าง ๆ เช่น:

$ mysqldump-ignore-databases.sh 'myuser' 'mypwd' 'information_schema mysql performance_schema' '--skip-lock-tables' > mydbs.sql

นี่คือสคริปต์ที่แก้ไขแล้ว:

#!/usr/bin/env bash

# This is an adapted version of Rolando's awesome script at
# /dba//a/35104/94046

# Usage: mysqldump-ignore-databases.sh username password dbs-to-exclude mysqldump-options
# e.g.
#   mysqldumpIgnoreDatabases.sh 'myuser' 'mypwd' 'information_schema mysql performance_schema'
#                               '--skip-lock-tables' > dbs.sql
#
#   mysqldumpIgnoreDatabases.sh 'myuser' 'mypwd' 'mysql' '-h example.com' '-h example.com' > dbs.sql

USERNAME=$1
PASSWORD=$2
DATABASES_TO_EXCLUDE=$3
MYSQLDUMP_OPTIONS=$4
MYSQL_OPTIONS=$5

EXCLUSION_LIST=""
for DB in `echo "${DATABASES_TO_EXCLUDE}"`
do
  if [ "${EXCLUSION_LIST}" != "" ]
  then
    EXCLUSION_LIST="${EXCLUSION_LIST},"
  fi
  EXCLUSION_LIST="${EXCLUSION_LIST}'${DB}'"
done

SQLSTMT="SELECT schema_name FROM information_schema.schemata"
SQLSTMT="${SQLSTMT} WHERE schema_name NOT IN (${EXCLUSION_LIST})"

MYSQLDUMP_DATABASES="--databases"
for DB in `mysql -u${USERNAME} -p${PASSWORD} ${MYSQL_OPTIONS} -ANe"${SQLSTMT}"`
do
  MYSQLDUMP_DATABASES="${MYSQLDUMP_DATABASES} ${DB}"
done

mysqldump -u${USERNAME} -p${PASSWORD} ${MYSQLDUMP_OPTIONS} ${MYSQLDUMP_DATABASES}

(ฉันยังหวังว่า--ignore-databaseจะมีการเพิ่มตัวเลือกใน mysqldump เวอร์ชันอนาคต)


0

ตั้งแต่ MySQL 5.7.8 คุณสามารถใช้mysqlpump(ซึ่งไม่เหมือนกับmysqldump) ดังนี้:

mysqlpump --user=user --password --exclude-databases=db1,db2,db3,db4 --result-file=partial_backup.sql

เพียงแทนที่db1,db2,db3,db4ด้วยสี่ฐานข้อมูลที่คุณต้องการยกเว้น

ที่มา: บล็อกเซิร์ฟเวอร์ MySQL

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.