আপনি কীভাবে সুনির্দিষ্ট সারণী (গুলি) সিকিউলেড করবেন?


403

বাকী ডিবি টেবিল না রেখে আমি কীভাবে একটি নির্দিষ্ট টেবিল বা টেবিলের সেট ডাম্প করতে পারি?


উত্তর:


540

আপনি যদি mydb থেকে টেবিল টি 1, t2, এবং t3 ডাম্প করছেন

mysqldump -u... -p... mydb t1 t2 t3 > mydb_tables.sql

আপনার যদি মাইডবিতে এক টন টেবিল থাকে এবং আপনি টি 1, টি 2, এবং টি 3 ব্যতীত সমস্ত কিছু ফেলে দিতে চান তবে এটি করুন:

DBTODUMP=mydb
SQL="SET group_concat_max_len = 10240;"
SQL="${SQL} SELECT GROUP_CONCAT(table_name separator ' ')"
SQL="${SQL} FROM information_schema.tables WHERE table_schema='${DBTODUMP}'"
SQL="${SQL} AND table_name NOT IN ('t1','t2','t3')"
TBLIST=`mysql -u... -p... -AN -e"${SQL}"`
mysqldump -u... -p... ${DBTODUMP} ${TBLIST} > mydb_tables.sql

একবার চেষ্টা করে দেখো !!!

আপডেট 2014-03-06 10:15 EST

@ ররিডনোহুয়ে আমাকে উল্লেখ করেছেন যে GROUP_CONCAT ফাংশনটির সর্বোচ্চ দৈর্ঘ্য প্রসারিত হওয়া দরকার। আমি আমার উত্তরে সেশন ভেরিয়েবল গ্রুপ_কনক্যাট_ম্যাক্স_লেন সর্বোচ্চ 10 কে দৈর্ঘ্যের সাথে যুক্ত করেছি added ধন্যবাদ, @ ররিডনোহুয়ে


43
মাত্র কয়েকটি সারণী বাদ দিতে আপনি --ignore-table = টেবিল 1 --ignore-table = টেবিল 2 --ignore-table = टेबल3 ইত্যাদি ব্যবহার করতে পারেন
কোডওগল

@codecowboy, আপনি পরিবর্তন করতে পারেন SQL="${SQL} AND table_name NOT IN ('t1','t2','t3')"থেকে SQL="${SQL} AND table_name NOT LIKE 'foo\_%'"। আমি এটি পরীক্ষা করেছি এবং এটি কাজ করে। আপনার নামে যে কোনও জায়গায় 'foo' রয়েছে এমন সমস্ত টেবিল পেতে ('খাবার', 'বোকা' ইত্যাদি) সারণিতে আপনি '% foo%' এ পরিবর্তন করতে পারেন।
বাটাল বুট্কাস

1
যুক্তিটির অস্তিত্ব প্রদত্ত এখানে অযৌক্তিক এবং অতিমাত্রায় ছকগুলি বাদ দেওয়ার জন্য দৃষ্টিভঙ্গি কী নয় --ignore-table? এবং যদি তা হয় তবে উত্তরটি থেকে আপনার স্ক্রিপ্টটি স্ক্র্যাপ করে কেবল --ignore-tableপরিবর্তে সুপারিশ করা ভাল না?
মার্ক আমেরিকা

@ কোডবেগল যা ত্রুটিটি দেয় Illegal use of option --ignore-table=<database>.<table>যদি না আমি টেবিলটি নির্দিষ্ট না করি schemaname.tablename
ডাব্লুএফএফ

দুর্দান্ত জিনিস, কোনও কারণে এসকিউএল ভেরিয়েবলটি মাল্টি-লাইন নয়?
sdkks

72

রোল্যান্ডোমাইএসকিউএলডিবিএর উত্তরে প্রসারিত করার জন্য একটি নোট ।

তিনি যে স্ক্রিপ্টটি অন্তর্ভুক্ত করেছিলেন তা হ'ল ( and table_name in) বা ( and table_name NOT in) সারণীর তালিকা অন্তর্ভুক্ত করার জন্য দুর্দান্ত পদ্ধতি ।

আপনার যদি কেবল একটি বা দুটি সারণী বাদ দিতে হয় তবে আপনি --ignore-tableবিকল্পটি দিয়ে আলাদাভাবে বাদ দিতে পারেন :

mysqldump -u -p etc. --ignore-table=Database.Table1 --ignore-table=Database.Table2 > dump_file.sql

29

আপনার যখন কয়েকটি টেবিলের বেশি রয়েছে তখন এটির থেকে ভাল চালানো আরও ভাল:

mysql databasename -u [user] -p[password] -e 'show tables like "table_name_%"' 
       | grep -v Tables_in 
       | xargs mysqldump [databasename] -u [root] -p [password] > [target_file]

বা এই মত কিছু:

mysqldump -u [user] -p[password] databasename `echo "show tables like 'table_name_%';" 
       | mysql -u[user] -p[password] databasename 
       | sed '/Tables_in/d'` > [target_file]

মনে রাখবেন যে কমান্ডগুলি কেবল একটি লাইনে টাইপ করতে হবে।


11

আপনি কেবল নীচের কমান্ডটি ব্যবহার করে এটি করতে পারেন:

mysqldump -uusername -ppassword dbname \
  --ignore-table=schema.tablename1    \
  --ignore-table=schema.tablename2    \
  --ignore-table=schema.tablename3 > mysqldump.sql

4
--ignore-টেবিলটি mysqldump থেকে নির্দিষ্ট টেবিলগুলি বাদ দেওয়া হয় না, অন্তর্ভুক্ত নয়। :)
প্রবীণ প্রসন্নান

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