মাইএসকিএলডাম্প সহ নির্দিষ্ট টেবিলগুলি এড়িয়ে যান


556

মাইএসকিলডাম্প কমান্ড থেকে কিছু সারণী সীমাবদ্ধ করার কোনও উপায় আছে কি?

উদাহরণস্বরূপ, আমি কেবল টেবিল 1 এবং টেবিল 2 ডাম্প করার জন্য নিম্নলিখিত সিনট্যাক্সটি ব্যবহার করব:

mysqldump -u username -p database table1 table2 > database.sql

তবে কি টেবিল 1 এবং টেবিল 2 বাদে সমস্ত টেবিলটি ফেলে দেওয়ার মতো উপায় আছে ? আমি মাইএসকিলডম্প ডকুমেন্টেশনে কিছু পাইনি, তাই কি ব্রুট-ফোর্স (সমস্ত টেবিলের নাম নির্দিষ্ট করে) যাওয়ার একমাত্র উপায়?

উত্তর:


939

আপনি --ignore-table বিকল্পটি ব্যবহার করতে পারেন । সুতরাং আপনি করতে পারে

mysqldump -u USERNAME -pPASSWORD DATABASE --ignore-table=DATABASE.table1 > database.sql

পরে কোনও সাদা জায়গা নেই -p(এটি কোনও টাইপ নয়)।

আপনি যদি একাধিক টেবিল উপেক্ষা করতে চান তবে আপনি এর মতো একটি সাধারণ স্ক্রিপ্ট ব্যবহার করতে পারেন

#!/bin/bash
PASSWORD=XXXXXX
HOST=XXXXXX
USER=XXXXXX
DATABASE=databasename
DB_FILE=dump.sql
EXCLUDED_TABLES=(
table1
table2
table3
table4
tableN   
)

IGNORED_TABLES_STRING=''
for TABLE in "${EXCLUDED_TABLES[@]}"
do :
   IGNORED_TABLES_STRING+=" --ignore-table=${DATABASE}.${TABLE}"
done

echo "Dump structure"
mysqldump --host=${HOST} --user=${USER} --password=${PASSWORD} --single-transaction --no-data --routines ${DATABASE} > ${DB_FILE}

echo "Dump content"
mysqldump --host=${HOST} --user=${USER} --password=${PASSWORD} ${DATABASE} --no-create-info --skip-triggers ${IGNORED_TABLES_STRING} >> ${DB_FILE}

4
ধন্যবাদ! পুরোপুরি কাজ করেছেন ... আমি জানি না কীভাবে আমি এটি মিস করেছি।
জ্যাক

20
টেবিলের বিষয়বস্তুগুলি এড়িয়ে যাওয়ার কোনও উপায় আছে? কাঠামোটি আমি ব্যাকআপ করতে চাই।
আন্দ্রে এসকে

5
আপনি --no-data = সত্য বিকল্পটি ব্যবহার করতে পারেন তবে আপনি প্রতি টেবিল স্তরে এটি করতে পারবেন কিনা তা আমি জানি না।
ব্রায়ান ফিশার 15

60
যদি প্রতিটি --ignore-টেবিলের জন্য ডাটাবেসের নাম সেট না করা থাকে তবে আপনি'ignign-table = <ডাটাবেস> বিকল্পের অবৈধ ব্যবহার পাবেন <<টেবিল> 'ত্রুটি। আপনি সর্বদা ডেটাবেস ঘোষণা করুন তা নিশ্চিত করুন!
সুপজব

26
আপনি যদি কিছু টেবিলের ডেটা উপেক্ষা করতে চান তবে তার কাঠামোটি ফেলে ফেলতে চান তবে আপনি সেই টেবিলগুলির জন্য আবার মাইএসকিএলড্প চালাতে পারেন এবং এটি সবেমাত্র তৈরি ব্যাকআপের সাথে সংযুক্ত করতে পারেন
carpii

118

@ ব্রায়ান-ফিশারের কাছ থেকে উত্তর তৈরি করা এবং এই পোস্টে থাকা কিছু লোকের মন্তব্যের জবাব দেওয়া, আমার কাছে আমার ডাটাবেজে বিশাল (এবং অপ্রয়োজনীয়) টেবিল রয়েছে তাই অনুলিপি করার সময় আমি তাদের বিষয়বস্তু এড়িয়ে যেতে চেয়েছিলাম, তবে কাঠামোটি রেখেছি :

mysqldump -h <host> -u <username> -p <schema> --no-data > db-structure.sql
mysqldump -h <host> -u <username> -p <schema> --no-create-info --ignore-table=schema.table1 --ignore-table=schema.table2 > db-data.sql

ফলস্বরূপ দুটি ফাইল কাঠামোগতভাবে সাবলীল তবে ডাম্পড ডেটা 9 জিবি না করে এখন 500 এমবি me, এটি আমার পক্ষে আরও ভাল। 9 জিবি ডেটা ম্যানিপুলেট করার বা ডিস্কের জায়গার বাইরে চলে যাওয়ার চিন্তা না করেই এখন পরীক্ষার উদ্দেশ্যে এই দুটি ফাইলকে অন্য ডাটাবেসে আমদানি করতে পারি।


মাইএসকিউএল 5.5.43 এর অধীনে পরীক্ষিত এবং ব্যবহৃত হয়েছে (ডেবিয়ান-লিনাক্স-গ্নু (x86_64) এর জন্য) ধন্যবাদ
আবদেল

সহজ এবং মার্জিত। একটি দুর্দান্ত সমাধান।
গ্রেগ গ্লোকনার

4
দুর্দান্ত সমাধান পরে ডাম্পটি কাজ করার জন্য দ্বিতীয় বিবৃতিতে আমাকে --স্কিপ-ট্রিগার যুক্ত করতে হয়েছিল (ধরে নিলে আপনার ট্রিগার হয়েছে) তবে অন্যথায়: নিখুঁত
রাইনার মোহর

আপনাকে ধন্যবাদ, এটি কাজ করে এবং খুব দরকারী।
হিমালয় গার্গ

59

একাধিক ডাটাবেসের জন্য:

mysqldump -u user -p --ignore-table=db1.tbl1 --ignore-table=db2.tbl1 --databases db1 db2 ..

5
ইতিমধ্যে এই থ্রেডের একটি উত্তর রয়েছে যা বলছে যে এটি আরও ভাল।
alxgb

19
ঠিক আছে, তবে এই সমাধানটি একাধিক ডাটাবেসের সাথে কাজ করে।
অ্যালেক্স

আকর্ষণীয় - আমি প্রথম চিন্তা mysqldএবং mysqldumpএকই প্রোগ্রাম হতে হবে।
মার্টিন থোমা

4
এটিই আমি সন্ধান করছি - সমাধানের সাথে এক-লাইন উত্তর যা আমাকে 2-3 মিনিটের জন্য কিছু পড়তে বাধ্য করে না: P
jebbie

43

একাধিক সারণী উপেক্ষা করার জন্য আরেকটি উদাহরণ

/usr/bin/mysqldump -uUSER -pPASS --ignore-table={db_test.test1,db_test.test3} db_test> db_test.sql

--ignore-tableমত সিনট্যাক্স সহ টেবিলগুলির একটি অ্যারে ব্যবহার করে তৈরি করুনdatabase.table

--ignore-table={db_test.table1,db_test.table3,db_test.table4}

আপনাকে সাহায্য করবে এমন তথ্যের সাথে লিঙ্কগুলি

সংক্ষিপ্ত আউটপুট mysqldump

দ্রষ্টব্য: মাইএসকিএল ভের 14.14 ডিস্ট্রিবিউট 5.5.55 এর সাথে উবুন্টু সার্ভারে পরীক্ষিত

আমদানি ডাটাবেস

 mysql -uUSER  -pPASS db_test < db_test.sql

সারণী উপেক্ষা করার জন্য সরল স্ক্রিপ্ট

#!/bin/bash

#tables to ignore
_TIGNORE=(
my_database.table1
my_database.table2
my_database.tablex
)

#create text for ignore tables
_TDELIMITED="$(IFS=" "; echo "${_TIGNORE[*]/#/--ignore-table=}")"

#don't forget to include user and password
/usr/bin/mysqldump -uUSER -pPASSWORD --events ${_TDELIMITED} --databases my_database | gzip -v > backup_database.sql.gz

যখন আপনি একাধিক টেবিল উপেক্ষা করতে চান তখন কোনও স্ক্রিপ্ট ব্যবহার এড়ানোর দুর্দান্ত উপায়। এই উত্তরটির আরও "+1" পাওয়া উচিত
এসভিফাত

নিখুঁত উত্তর!!! +1 আমার দিন তৈরি করেছে :)
সাগরপঞ্চল

7

কিছু টেবিল ডেটা বাদ দিতে , তবে টেবিলের কাঠামো নয় । এখানে আমি এটি কীভাবে করছি:

কোনও তথ্য ছাড়াই সমস্ত টেবিলের ডাটাবেস কাঠামো ডাম্প করুন:

mysqldump -u user -p --no-data database > database_structure.sql

তারপরে বাদ পড়া টেবিলগুলি ব্যতীত ডেটাবেস সহ ডেটাবেস ডাম্প করুন এবং কাঠামোটি ডাম্প করবেন না:

mysqldump -u user -p --no-create-info \
    --ignore-table=database.table1 \
    --ignore-table=database.table2 database > database_data.sql

তারপরে, এটি একটি নতুন ডাটাবেসে লোড করতে:

mysql -u user -p newdatabase < database_structure.sql
mysql -u user -p newdatabase < database_data.sql

1

আপনি mysqlpumpকমান্ডটি ব্যবহার করতে পারেন

--exclude-tables=name

কমান্ড। এটি বাদ দেওয়ার জন্য কমা-বিচ্ছিন্ন টেবিলগুলির তালিকা নির্দিষ্ট করে।

মাইএসকিপ্ল্যাম্পের সিনট্যাক্সটি মাইএসকিলডাম্পের সাথে খুব একই রকম, আরও বেশি পারফর্ম্যান্ট করে তার উপায়টি। আপনি কীভাবে বাদ পড়ুন বিকল্পটি এখানে ব্যবহার করতে পারেন সে সম্পর্কে আরও তথ্য: https://dev.mysql.com/doc/refman/5.7/en/mysqlpump.html#mysqlpump- ফিল্টারিং


0

সমস্ত টেবিলের সাথে সমস্ত ডাটাবেস ফেলে দিন তবে নির্দিষ্ট সারণীগুলি এড়িয়ে যান

অন ​​গিথুব: https://github.com/rubo77/mysql-backup.sh/blob/master/mysql-backup.sh

#!/bin/bash
# mysql-backup.sh

if [ -z "$1" ] ; then
  echo
  echo "ERROR: root password Parameter missing."
  exit
fi
DB_host=localhost
MYSQL_USER=root
MYSQL_PASS=$1
MYSQL_CONN="-u${MYSQL_USER} -p${MYSQL_PASS}"
#MYSQL_CONN=""

BACKUP_DIR=/backup/mysql/

mkdir $BACKUP_DIR -p

MYSQLPATH=/var/lib/mysql/

IGNORE="database1.table1, database1.table2, database2.table1,"

# strpos $1 $2 [$3]
# strpos haystack needle [optional offset of an input string]
strpos()
{
    local str=${1}
    local offset=${3}
    if [ -n "${offset}" ]; then
        str=`substr "${str}" ${offset}`
    else
        offset=0
    fi
    str=${str/${2}*/}
    if [ "${#str}" -eq "${#1}" ]; then
        return 0
    fi
    echo $((${#str}+${offset}))
}

cd $MYSQLPATH
for i in */; do
    if [ $i != 'performance_schema/' ] ; then 
    DB=`basename "$i"` 
    #echo "backup $DB->$BACKUP_DIR$DB.sql.lzo"
    mysqlcheck "$DB" $MYSQL_CONN --silent --auto-repair >/tmp/tmp_grep_mysql-backup
    grep -E -B1 "note|warning|support|auto_increment|required|locks" /tmp/tmp_grep_mysql-backup>/tmp/tmp_grep_mysql-backup_not
    grep -v "$(cat /tmp/tmp_grep_mysql-backup_not)" /tmp/tmp_grep_mysql-backup

    tbl_count=0
    for t in $(mysql -NBA -h $DB_host $MYSQL_CONN -D $DB -e 'show tables') 
    do
      found=$(strpos "$IGNORE" "$DB"."$t,")
      if [ "$found" == "" ] ; then 
        echo "DUMPING TABLE: $DB.$t"
        mysqldump -h $DB_host $MYSQL_CONN $DB $t --events --skip-lock-tables | lzop -3 -f -o $BACKUP_DIR/$DB.$t.sql.lzo
        tbl_count=$(( tbl_count + 1 ))
      fi
    done
    echo "$tbl_count tables dumped from database '$DB' into dir=$BACKUP_DIR"
    fi
done

Https://stackoverflow.com/a/17016410/1069083 এর সামান্য সহায়তায়

এটি lzop ব্যবহার করে যা অনেক দ্রুত, দেখুন: http://pokecraft.first-world.info/wiki/Quick_Benchmark:_Gzip_vs_Bzip2_vs_LZMA_vs_XZ_vs_LZ4_vs_LZO


আপনি যে দস্তাবেজটি ভাগ করেছেন তা জিজিপ লজপের চেয়ে দ্রুত।
jrosell

0

আমি রুবো's77 এর সমাধান পছন্দ করি, পলের পরিবর্তন করার আগে আমি এটি দেখিনি। আপনি চান না এমন কোনও টেবিল বাদ দিয়ে এই একক একটি ডাটাবেস ব্যাকআপ করবে। এটি তখন gzip করবে এবং 8 দিনেরও বেশি পুরানো কোনও ফাইল মুছে ফেলবে। আমি সম্ভবত এটির 2 টি সংস্করণ ব্যবহার করব যা দিনে একবার পূর্ণ (মাইনাস লগ টেবিল) করে এবং অন্যটি যা সর্বাধিক গুরুত্বপূর্ণ টেবিলগুলিকে ব্যাক আপ করে যা একটি দম্পতি ক্রোন জব ব্যবহার করে প্রতি ঘন্টা সবচেয়ে বেশি পরিবর্তন করে।

#!/bin/sh
PASSWORD=XXXX
HOST=127.0.0.1
USER=root
DATABASE=MyFavoriteDB

now="$(date +'%d_%m_%Y_%H_%M')"
filename="${DATABASE}_db_backup_$now"
backupfolder="/opt/backups/mysql"
DB_FILE="$backupfolder/$filename"
logfile="$backupfolder/"backup_log_"$(date +'%Y_%m')".txt

EXCLUDED_TABLES=(
logs
)
IGNORED_TABLES_STRING=''
for TABLE in "${EXCLUDED_TABLES[@]}"
do :
   IGNORED_TABLES_STRING+=" --ignore-table=${DATABASE}.${TABLE}"
done

echo "Dump structure started at $(date +'%d-%m-%Y %H:%M:%S')" >> "$logfile"
mysqldump --host=${HOST} --user=${USER} --password=${PASSWORD} --single-transaction --no-data --routines ${DATABASE}  > ${DB_FILE} 
echo "Dump structure finished at $(date +'%d-%m-%Y %H:%M:%S')" >> "$logfile"
echo "Dump content"
mysqldump --host=${HOST} --user=${USER} --password=${PASSWORD} ${DATABASE} --no-create-info --skip-triggers ${IGNORED_TABLES_STRING} >> ${DB_FILE}
gzip ${DB_FILE}

find "$backupfolder" -name ${DATABASE}_db_backup_* -mtime +8 -exec rm {} \;
echo "old files deleted" >> "$logfile"
echo "operation finished at $(date +'%d-%m-%Y %H:%M:%S')" >> "$logfile"
echo "*****************" >> "$logfile"
exit 0

0

সম্পূর্ণতার জন্য, এখানে একটি স্ক্রিপ্ট যা সমস্ত ভিউ বাদ দিয়ে (উপেক্ষা করে) বাদ দিয়ে ডাটাবেস থেকে ব্যাকআপ পেতে আসলে এক-লাইনার হতে পারে। ডিবি নামটি কর্মচারী হিসাবে ধরে নেওয়া হয়:

ignore=$(mysql --login-path=root1 INFORMATION_SCHEMA \
    --skip-column-names --batch \
    -e "select 
          group_concat(
            concat('--ignore-table=', table_schema, '.', table_name) SEPARATOR ' '
          ) 
        from tables 
        where table_type = 'VIEW' and table_schema = 'employees'")

mysqldump --login-path=root1 --column-statistics=0 --no-data employees $ignore > "./backups/som_file.sql"   

আপনি ক্যোয়ারির যুক্তি আপডেট করতে পারেন। সাধারণভাবে ব্যবহার করে group_concatএবং concatআপনি প্রায় কোনও পছন্দসই স্ট্রিং বা শেল কমান্ড তৈরি করতে পারেন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.