একটি মাইএসকিউএল টেবিল থেকে একই ডাটাবেসের অন্য মাইএসকিউএল টেবিলটিতে অনুলিপি করুন


15

আমার একটি মাইএসকিউএল টেবিলের প্রায় 40 মিলিয়ন সারি রয়েছে এবং আমি এই টেবিলটিকে একই ডাটাবেসে অন্য টেবিলটিতে অনুলিপি করতে চাই। এটি করার সবচেয়ে কার্যকরী উপায় কী? এটি কত সময় নেবে (আনুমানিক)?


আপনার টেবিলের ইঞ্জিন কী?
আবদুল মানাফ

ইনোডিবি ইঞ্জিন ..
দেবাশীষ দীক্ষিত

উত্তর:


23

মনে করুন আপনার আছে mydb.mytbএবং আপনি তৈরি করতে চানmydb.mytbcopy

এই অনুলিপিটি করার জন্য আমার পাঁচ (5) পন্থা রয়েছে

আবেদন # 1

ইন mysqlক্লায়েন্ট, নিম্নলিখিত চালানো

USE mydb
CREATE TABLE mytbcopy LIKE mytb;
INSERT INTO mytbcopy SELECT * FROM mytb;

প্রচার # 2

MYSQL_USER=root
MYSQL_PASS=rootpassword
MYSQL_CONN="-u${MYSQL_USER} -p${MYSQL_PASS}"
mysql ${MYSQL_CONN} -ANe"CREATE DATABASE IF NOT EXISTS test"
mysqldump ${MYSQL_CONN} mydb mytb | mysql ${MYSQL_CONN} -Dtest
mysql ${MYSQL_CONN} -ANe"ALTER TABLE test.mytb RENAME mydb.mytbcopy"

আবেদন # 3

DUMPFILE=/some/path/tabledata.sql
MYSQL_USER=root
MYSQL_PASS=rootpassword
MYSQL_CONN="-u${MYSQL_USER} -p${MYSQL_PASS}"
mysql ${MYSQL_CONN} -ANe"CREATE DATABASE IF NOT EXISTS test"
mysqldump ${MYSQL_CONN} mydb mytb > ${DUMPFILE}
mysql ${MYSQL_CONN} -Dtest < ${DUMPFILE}
rm -f ${DUMPFILE}
mysql ${MYSQL_CONN} -ANe"ALTER TABLE test.mytb RENAME mydb.mytbcopy"

প্রচার # 4

MYSQL_USER=root
MYSQL_PASS=rootpassword
MYSQL_CONN="-u${MYSQL_USER} -p${MYSQL_PASS}"
mysqldump ${MYSQL_CONN} mydb mytb | sed 's/mytb/mytbcopy' | mysql ${MYSQL_CONN} -Dmydb

প্রচার # 5

DUMPFILE=/some/path/tabledata.sql
MYSQL_USER=root
MYSQL_PASS=rootpassword
MYSQL_CONN="-u${MYSQL_USER} -p${MYSQL_PASS}"
mysqldump ${MYSQL_CONN} mydb mytb | sed 's/mytb/mytbcopy' > ${DUMPFILE}
mysql ${MYSQL_CONN} -Dmydb < ${DUMPFILE}
rm -f ${DUMPFILE}

বিশ্লেষণ

  • আবেদন # 1পদক্ষেপের দিক থেকে সহজতম, তবে এক লেনদেনে 40 মিলিয়ন সারি ঠেলা প্রয়োজন। এটি ইনোডিবি স্টোরেজ ইঞ্জিনের উপর সর্বাধিক ট্যাক্স হবে।
  • অন্যান্য পদ্ধতির জন্য, মাইএসকিএলডাম্প কয়েক হাজার সারিতে 40 মিলিয়ন সারি পাঠাবে
    • অ্যাপোআরচ # 2 এবং অ্যাপোপ্রোচ # 3 টেস্টের ডাটাবেসে টেবিলটিকে মাইস্ক্ল্ডম্প্যাম্প করবে। পরীক্ষার ডাটাবেসে সারণী তৈরি করার পরে এটি পরবর্তীকালে নাম পরিবর্তন করে মূল ডাটাবেসে স্থানান্তরিত হয়
    • এপ্রোচ # 4 এবং এপ্রোচ # 5 পুনঃনামকরণ টেবিল ব্যবহার sed প্রবাহ mysqldump থেকে আসছে বিরুদ্ধে এটি সন্নিবেশ কমান্ড প্রতিধ্বনি
    • অ্যাপোআরচ # 2 এবং অ্যাপোআরচ # 4 একটি আউটপুট ফাইলের পরিবর্তে পাইপ ব্যবহার করে
    • অ্যাপোআরচ # 3 এবং অ্যাপোআরচ # 5 পরবর্তী লোডের জন্য একটি আউটপুট ফাইল ব্যবহার করে

আপনি যদি mydb.mytbইতিমধ্যে বিদ্যমান টেবিলটিতে অনুলিপি করতে চান mydb.mytbcopyএবং দুটি টেবিলের অভিন্ন কাঠামো রয়েছে:

আবেদন # 6

INSERT INTO mytbcopy SELECT * FROM mytb;

# এপ্রোচ 1 এর মতো , #APPROach 6 এর একক লেনদেন হবে 4 মিলিয়ন সারি

প্রচার # 7

MYSQL_USER=root
MYSQL_PASS=rootpassword
MYSQL_CONN="-u${MYSQL_USER} -p${MYSQL_PASS}"
mysqldump ${MYSQL_CONN} -t mydb mytb | sed 's/mytb/mytbcopy' | mysql ${MYSQL_CONN} -Dmydb

এই পদ্ধতির টেবিল বাদ দেয় না। এটি কেবল ইনসার্টগুলি উত্পন্ন করে

উপসংহার

আমি আপনাকে ডিবি সার্ভার, টেবিলের কাঠামো, সূচী বিন্যাস এবং এই জাতীয় জিনিসগুলি জানি না বলে আমি আপনাকে একটি সময় অনুমান দিতে পারি না।

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


0

মাইআইএসএএম * এর বিপরীতে ইনোডিবি টেবিলগুলি "কেবল অনুলিপি করা যায় না", কারণ এটির ডেটা ডিকশনারির অংশ হিসাবে (এবং সম্ভবত অন্যান্য কাঠামোগুলি যেমন টেবিলের উপর নির্ভর করে যেমন মার্জ বাফারটি থাকে) মেমরিতে অবস্থিত (যদি সার্ভার চলমান থাকে) এবং এতে সাধারণ / প্রধান টেবিল স্পেস, ওরফে যে বড় ফাইলটিকে ডাকা হয় ibdata1

আপনি যদি পারকোনা সার্ভার> = 5.1 বা মাইএসকিউএল> = 5.6 ব্যবহার করেন তবে পরিবহনযোগ্য টেবিলস্পেসগুলির জন্য সমর্থন রয়েছে, যা আপনাকে সরাসরি ফাইল সিস্টেম থেকে টেবিলগুলি রফতানি এবং আমদানির অনুমতি দেয়। এটি মাইএসকিউএল এবং পারকোনার জন্য পদ্ধতি । উভয় ক্ষেত্রেই, এটি প্রয়োজনীয় যে আপনি innodb_file_per_tableবিকল্পটি দিয়ে টেবিলটি তৈরি করেছিলেন এবং DISCARD TABLESPACE/IMPORT TABLESPACEএবং / অথবা পারকোনা এক্সট্রাবাকআপ (যদি আপনি রফতানিটি অনলাইনে করাতে চান) ব্যবহারের সাথে জড়িত । দয়া করে মনে রাখবেন যে পারকোনা সার্ভার বা এক্সট্রাবাকআপ উইন্ডোজের জন্য উপলভ্য নয়।

এই পদ্ধতিটি সাধারণভাবে বলতে গেলে ফাইল সিস্টেম কমান্ড (সিপি, আরএসসিএনসি) ব্যবহার করে ফাইলটি অনুলিপি করার পক্ষে তত দ্রুত হবে

যদিও এমন কিছু ক্ষেত্রে থাকতে পারে যে এটি পুনরুদ্ধারের জন্য মাইএসকিউএল <5.6 (একটি হ্যাকি উপায়ে) এ কাজ করতে পারে তবে এটি কোনও টেবিল অনুলিপিটির জন্য কাজ করবে না। এই ক্ষেত্রে, এটি করার একটি উপায় হ'ল এসকিউএল ব্যবহার করে :

CREATE TABLE new_table LIKE old_table;
INSERT INTO new_table SELECT * FROM old_table;

এটি ইনোডিবি যত তাড়াতাড়ি কার্যকর করতে পারে Handler_read_rnd_nextএবং Handler_writeপ্রতি সারিতে একবারে। আপনি যদি এই পদ্ধতিটি ব্যবহার করেন তবে নিশ্চিত হয়ে নিন যে আপনি স্থায়িত্বের বিকল্পগুলি অন্তত অস্থায়ীভাবে অক্ষম করেছেন এবং আপনার কাছে একটি বড় বাফার পুল এবং লেনদেন লগ রয়েছে। এই পরিস্থিতিতে, এটি আমদানির সময় হ্রাস করতে পারে, তবে এটি অবশ্যই পুরোপুরি মেমরির সাথে খাপ খায় না, তাই অনেক সময় আশা করে। এছাড়াও, আপনি একক লেনদেনে 40 এম সারি আমদানির চেষ্টা করছেন, যা সমস্যার সৃষ্টি করতে পারে।

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

চূড়ান্ত বিকল্পটি হ'ল সিএসভি (বা টিএসভি) ফর্ম্যাট ব্যবহার করে রফতানি এবং আমদানি করা হবে , নির্বাচন করুন আউটফিল / মাইএসকিএলডাম্প এবং লোড ডেটা / মাইএসকিলিম্পোর্টের সমন্বয়ে। এটি আপনার খুব সাধারণ বিকল্প ছিল যদি আপনার মাইএসকিএল-এর কয়েকটি পুরানো সংস্করণে একত্রীকরণের প্রয়োজন হয়, কারণ এসকিউএল ব্যবহার করে বৃহত্তর লক তৈরি হয়েছিল (সঠিকভাবে করা হলে আর সত্য নয়)। যেহেতু মাইএসকিএলডাম্প / আমদানি কেবল সিরিয়ালাইজড পদ্ধতিতে কাজ করে, আমি আপনাকে এটির সমান্তরালে বিকল্পগুলি গবেষণা করার পরামর্শ দিচ্ছি, এটি বড় টেবিলগুলির জন্য খুব দরকারী।

যাই হোক না কেন, একাধিক এসকিউএল বাক্যগুলি এড়িয়ে চলার চেষ্টা করুন, কারণ আপনি যদি অনেকগুলি বিভিন্ন ক্যোরিয়াস কার্যকর করেন (তবে এটি পৃথকভাবে মৃত্যুদন্ড কার্যকর করতে হবে, পার্স করতে হবে এবং অনুকূলিত করতে হবে) তবে এটি আপনার সবচেয়ে গুরুত্বপূর্ণ বাধা।


* মাইআইএসএএম স্ট্রাকচারগুলি উত্তপ্ত উপায়ে অনুলিপি করা যায় না, তবে এগুলি অস্থায়ীভাবে ডিস্কের সাথে সিঙ্ক করা খুব সহজ FTWRL


0

স্কিমায় ডেটা এক টেবিল থেকে অন্য টেবিলের দিকে সরানো

create table your_table_name select * from old_schema_table;

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