এক ডাটাবেস থেকে অন্য ডাটাবেসে কোনও টেবিল অনুলিপি করার সহজ উপায়?


151

যখন ডাটাবেসগুলি বিভিন্ন ব্যবহারকারীর অধীনে থাকে তখন একটি ডাটাবেসে কোনও টেবিল থেকে অন্য ডাটাবেসে একটি টেবিলে ডেটা অনুলিপি করার সর্বোত্তম পদ্ধতি কী?

আমি জানি যে আমি ব্যবহার করতে পারি

INSERT INTO database2.table2 SELECT * from database1.table1

তবে এখানে সমস্যাটি হ'ল উভয়ই database1এবং database2বিভিন্ন মাইএসকিউএল ব্যবহারকারীদের অধীনে। সুতরাং কেবল user1অ্যাক্সেস করতে পারে database1এবং কেবল user2অ্যাক্সেস করতে পারে database2। কোন ধারণা?


6
আপনি ব্যবহারকারীদের টেবিল স্তরের অনুদান দিতে পারেন। দেখুন: dev.mysql.com/doc/refman/5.5/en/grant.html
ওমেশ

2
দুর্ভাগ্যক্রমে এটি আমার ক্ষেত্রে কাজ করবে না, কারণ আমি একটি গডাড্ডি শেয়ার্ড হোস্টিং সার্ভার ব্যবহার করছি। তারা ডেটাবেস দিয়ে এ জাতীয় জিনিস করার অনুমতি দেয় না।
স্পার্কি

@mmdemirbas ডাটাবেসের একটি টেবিলটিতে প্রায় 1 মিলিয়ন সারি রয়েছে। ডাটাবেস ডাম্প বিশাল হবে। এছাড়াও আমি যখন রফতানি করার চেষ্টা করেছি তখন প্রায় 10000 সারি রফতানি করা হচ্ছে - সম্ভবত বড় আকারের কারণে।
স্পার্কি

আমি জানি আপনি টেবিলগুলি সরাতে RENAME ব্যবহার করতে পারেন এবং এটি অত্যন্ত দ্রুত। টেবিলগুলি অনুলিপি করার জন্য কি কোনও সমতুল কৌশল আছে?
ড্যান

বিটিডাব্লু: আপনার খেয়াল রাখতে হবে যে ফিল্ডের তালিকাটি উভয় সারণীতে একই ক্রমে রয়েছে। অন্যথায় ডাটাবেস 1-এ টেবিল থেকে নামগুলি দিয়ে ক্ষেত্রগুলি নির্বাচন করা প্রয়োজন যাতে তারা ডাটাবেস 2-এ টেবিলের সঠিক ক্ষেত্রগুলিতে ম্যাপ করে। এই সমস্যাটি আমার জন্য উপস্থিত হয়েছিল যেখানে আমি প্রাথমিকভাবে তৈরির পরে টেবিল 1 সংশোধন করা হয়েছিল এমন একটি ডাটাবেস এবং যেখানে এটি একটি মাইএসকিल्ड্প ফাইল থেকে তৈরি হয়েছিল সেখানে নতুন ডাটাবেসটিকে ব্যাক আপ করেছিলাম।
স্টিভ এল

উত্তর:


113

আপনি শেল অ্যাক্সেস না থাকে আপনি ব্যবহার করতে পারেন mysqldumpবিষয়বস্তুর ডাম্প database1.table1এবং এটি পাইপ mysqlথেকে database2। এখানে সমস্যাটি table1এখনও রয়েছে table1

mysqldump --user=user1 --password=password1 database1 table1 \
| mysql --user=user2 --password=password2 database2

হতে পারে আপনি নামান্তর করতে প্রয়োজন table1থেকে table2আরেকটি ক্যোয়ারি সহ। অন্যভাবে আপনি টেবিল 1 টেবিল 2 থেকে পাইপগুলির মধ্যে পরিবর্তন করতে শেড ব্যবহার করতে পারেন।

mysqldump --user=user1 --password=password1 database1 table1 \
| sed -e 's/`table1`/`table2`/' \
| mysql --user=user2 --password=password2 database2

যদি টেবিল 2 ইতিমধ্যে বিদ্যমান থাকে তবে আপনি প্রথম মাইএসকিলডম্পে প্যারামিটারগুলি যুক্ত করতে পারেন যা টেবিল-তৈরি করতে দেয় না।

mysqldump --no-create-info --no-create-db --user=user1 --password=password1 database1 table1 \
| sed -e 's/`table1`/`table2`/' \
| mysql --user=user2 --password=password2 database2

এটি যখন স্বয়ংক্রিয় হয় তখন আপনার সাথে পাসওয়ার্ডটি দেখাতে হবে show যদি স্বয়ংক্রিয় না হয় এবং কমান্ড লাইন থেকে ব্যবহারকারী দ্বারা করা ঠিক হয়।
নেলিস

100

CREATE TABLE db1.table1 SELECT * FROM db2.table1

যেখানে db1 গন্তব্য এবং db2 উত্স


যদি এই দুটি ব্যবহারকারীর একে অপরের থেকে ডেটা নির্বাচন করার অনুমতি না থাকে তবে এটি কী কাজ করে?
বেরিলিয়াম

1
যদিও এটি বিভিন্ন মাইএসকিএল সার্ভার জুড়ে কাজ করবে না?
পিইজিজি

8
এটি সূচীতে অনুলিপি করে না
বিকোফ্লান

@ বেরিলিয়াম এটির জন্য এটির উভয় ডিবি-র জন্যই অনুমতি থাকা প্রয়োজন। জ্যামিনেটর না এটি বিভিন্ন সার্ভার জুড়ে কাজ করবে না, তবে আমি মনে করি না যে প্রশ্নটি এটি সম্পর্কে জিজ্ঞাসা করেছিল। আপনি ঠিক আছেন। এটি এই পদ্ধতির একটি বড় ত্রুটি: এটি টেবিলের কাঠামোটি সঠিকভাবে সংরক্ষণ করে না।
থোমাসরুটটার

4
অনুলিপি করা টেবিলটিতে প্রাথমিক কী এবং অটো ইনক্রিমেন্ট সেট নেই। আপনাকে ALTER TABLE db1.table1 ADD PRIMARY KEY (id); ALTER TABLE db1.table1 MODIFY COLUMN id INT AUTO_INCREMENT;
এটির

60

আপনি যদি পিএইচপিএমইএডমিন ব্যবহার করেন তবে এটি সত্যিই সহজ হতে পারে। ধরুন আপনার কাছে নিম্নলিখিত ডাটাবেস রয়েছে:

DB1 & DB2

ডিবি 1 এর একটি টেবিল ব্যবহারকারী রয়েছে যা আপনি ডিবি 2 এ অনুলিপি করতে চান

পিএইচপিএমআইএডমিনের অধীনে, ডিবি 1 খুলুন, তারপরে ব্যবহারকারীদের টেবিলে যান।

এই পৃষ্ঠায় উপরের ডানদিকে "অপারেশনস" ট্যাবে ক্লিক করুন । অপারেশনগুলির অধীনে বিভাগটি অনুলিপি করুন টেবিলটিতে (ডাটাবেস.ট্যাবল):

& তুমি পেরেছ!


1
মৃত সরল! আমি যখন অলস হয়ে উদযাপন করতে পারি!
ড্যানিয়েল দত্ত

1
আপনি আমার সময় বাঁচান..আমি নিরীহ পন্থা করছি ... প্রথম রফতানি এবং তারপরে আমদানি করছি।
হামজা জাফির

1
অন্যান্য উত্তরগুলির
কোনওটিই

1
টেবিলটি বিশেষত বড় হলে, 4 গিগাবাইটের বেশি হলে এটি কাজ করবে না। উদাহরণস্বরূপ, আমার কাছে একটি টেবিল রয়েছে যা 22 গিগাবাইট যা পিএইচপিএমআইএডমিন কেবল কাজ করতে পারে না।
মার্ক ডি

1
নিখুঁত উত্তর. Phpmyadmin এর এই বৈশিষ্ট্যটি সম্পর্কে জানেন না।
zookastos

23

মাইএসকিউএল ওয়ার্কবেঞ্চ : দৃly ়ভাবে প্রস্তাবিত

মাইএসকিএল ওয়ার্কবেঞ্চ থেকে ডেটাবেস মাইগ্রেশন সরঞ্জাম

এটি মাইগ্রেশন সমস্যাগুলি সহজেই পরিচালনা করবে। আপনি MySQL এবং SQLl সার্ভারের মধ্যে নির্বাচিত ডাটাবেসের নির্বাচিত টেবিলগুলি স্থানান্তর করতে পারেন। আপনার অবশ্যই এটি চেষ্টা করে দেখা উচিত।


আমি এটিকে একবার যেতে যাচ্ছি, আমার এটি সেটআপ আছে তবে আশ্চর্য কি আপনি mysql Workbenchস্থানান্তরকে SQLYogডেটাবেস অনুলির সাথে তুলনা করেছেন ? আমার তাত্ক্ষণিক চেহারা থেকে দেখে মনে হচ্ছে এগুলি খুব একই রকম, তবে
মাইএসকিএল

না, আমি এসকিউএলওয়াইগ চেষ্টা করিনি।
মিমডিমিরবাস

মাইএসকিউএল ওয়ার্কবেঞ্চ ব্যবহার করে কীভাবে মাইএসকিউএল থেকে এসকিউএল সার্ভারে মাইগ্রেট করা যায় তা স্পষ্ট নয়। আমি ওয়ার্কবেঞ্চে আছি এবং সহায়তা বা ইউআইয়ের কোনও চিহ্ন খুঁজে পাই না। আমি জানি মাইএসকিউএল এর জন্য এসএসএমএ আমার পক্ষে কাজ করে।
সাবসি

2
আকর্ষণীয়, তবে প্রোগ্রামটি একটি বৃহত ডাটাবেস সহ স্থানান্তরিত করায় কমান্ড লাইনটি সবচেয়ে ভাল কাজ করেছে।
ক্লাউডিওনর অলিভিরা

1
@ ম্মেডিমিরবাস, " আপনি মাইএসকিএল এবং স্কেল সার্ভারের মধ্যে নির্বাচিত ডাটাবেসের নির্বাচিত টেবিলগুলি স্থানান্তর করতে পারেন " "ওপির প্রশ্নটি এসকিউএল সার্ভার সম্পর্কে নয়, যদিও।
সাম্পাব্লুকুপার

19

আমি মাইএসকিউএল-এর জন্য নাভিচ্যাট ব্যবহার করি ...

এটি সমস্ত ডাটাবেস ম্যানিপুলেশনকে সহজ করে তোলে!

আপনি কেবল নাভিচ্যাট উভয় ডাটাবেস নির্বাচন করুন এবং তারপরে ব্যবহার করুন।

 INSERT INTO Database2.Table1 SELECT * from Database1.Table1

13

আমি জানি এটি পুরানো প্রশ্ন, কেবল উত্তর দেওয়া যাতে এখানে যে কেউ উপস্থিত হন তারা আরও ভাল পদ্ধতির পেতে পারেন।

5.6.10 হিসাবে আপনি করতে পারেন

CREATE TABLE new_tbl LIKE orig_tbl;

ডকুমেন্টেশন এখানে রেফারেন্স করুন: https://dev.mysql.com/doc/refman/5.7/en/create-table- Like.html


1
এটি ডেটা অনুলিপি করবে না! আপনি উল্লেখ করেছেন এমন ডকুমেন্টেশনটি পড়ুন:> ** টেবিল তৈরি করুন ...
লাইক

11

যদি আপনার টেবিলগুলি একই মাইএসকিএল সার্ভারে থাকে তবে আপনি নিম্নলিখিতটি চালাতে পারেন

CREATE TABLE destination_db.my_table SELECT * FROM source_db.my_table;
ALTER TABLE destination_db.my_table ADD PRIMARY KEY (id); 
ALTER TABLE destination_db.my_table MODIFY COLUMN id INT AUTO_INCREMENT;

অন্য সূচকের কী হবে ?! প্রশ্নটি কেবল কোনও টেবিলটিকে কেবল তার ডেটা অনুলিপি করতে বলেছে
জর্জ

9

মাইএসকিউএল ওয়ার্কবেঞ্চের রফতানি এবং আমদানি কার্যকারিতা ব্যবহার করুন। পদক্ষেপগুলি:
1. আপনি যে মানগুলি চান তা নির্বাচন করুন

E.g. select * from table1; 
  1. এক্সপোর্ট বাটনে ক্লিক করুন এবং এটি সিএসভি হিসাবে সংরক্ষণ করুন।
  2. প্রথমটি হিসাবে একই ধরণের কলামগুলি ব্যবহার করে একটি নতুন টেবিল তৈরি করুন

    E.g. create table table2 like table1; 
  3. নতুন টেবিল থেকে সমস্ত নির্বাচন করুন

    E.g. select * from table2;  
  4. আমদানিতে ক্লিক করুন এবং সিএসভি ফাইলটি আপনি ধাপ 2 এ রফতানি করুন নির্বাচন করুন

মাইএসকিএল ওয়ার্কবেঞ্চে রফতানি এবং আমদানি বোতামগুলির নমুনা


1
এটি কেবলমাত্র আমার মনে হয় এক বিলিয়ন সারি কম সারণীগুলির জন্য কাজ করে works
ডায়োগো পাইম

9

এখানে আরও একটি সহজ উপায়:

  1. ডিবি 1 ব্যবহার করুন; টিবি 1 তৈরি টেবিল প্রদর্শন করুন;
    • ডিবি 2 তে টিবি 1 তৈরি করতে এখানে সিনট্যাক্সটি ক্লিপবোর্ডে অনুলিপি করুন
  2. ডিবি 2 ব্যবহার করুন;
    • সারণি টিবি 1 তৈরি করতে এখানে সিনট্যাক্সটি আটকে দিন

INSERT INTO DB2.TB1 SELECT * from DB1.TB1;


ধন্যবাদ এটি একটি গি প্রোগ্রাম ব্যবহার না করেই একটি ডাটাবেস অনুলিপি স্বয়ংক্রিয় করতে সাহায্য করেছে, ধন্যবাদ।
নিউ 2 এইচটিএমএল

4

চেষ্টা করুন mysqldbcopy( ডকুমেন্টেশন )

অথবা আপনি আপনার টার্গেট হোস্টে একটি " সংযুক্ত টেবিল " তৈরি করতে পারেন । ফেডারেটেড টেবিলগুলি আপনাকে কোনও পৃথক ডাটাবেস সার্ভার থেকে কোনও টেবিল দেখার অনুমতি দেয় it ( ডকুমেন্টেশন )

ফেডারেটেড টেবিল তৈরি করার পরে, আপনি স্বাভাবিকের সাথে ডেটা অনুলিপি করতে পারেন insert into TARGET select * from SOURCE


1
আমি ফেডারেটেড টেবিলগুলি সম্পর্কে পড়েছি, তবে অ্যামাজন আরডিএস (এখনই) এর পক্ষে সমর্থন নেই ... এক্সপি
চোকোক্রোক

4

মাইএসকিউএল ওয়ার্কবেঞ্চের সাহায্যে আপনি স্থানীয় এসকিউএল ফাইলের জন্য কেবল টেবিলটি ডাম্প করতে ডেটা এক্সপোর্ট ব্যবহার করতে পারেন (কেবলমাত্র ডেটা, স্ট্রাকচার কেবল বা স্ট্রাকচার এবং ডেটা) এবং তারপরে অন্য ডিবিতে এটি লোড করার জন্য ডেটা আমদানি করতে পারেন।

আপনার একসাথে একাধিক সংযোগ (বিভিন্ন হোস্ট, ডাটাবেস, ব্যবহারকারী) খোলা থাকতে পারে।


3

আপনার প্রয়োজনীয় সমস্ত প্রশ্নগুলি পাওয়ার একটি সহজ উপায় হ'ল তথ্য_সেমিমা এবং কনক্যাট থেকে ডেটা ব্যবহার করা।

SELECT concat('CREATE TABLE new_db.', TABLE_NAME, ' LIKE old_db.', TABLE_NAME, ';') FROM `TABLES` WHERE TABLE_SCHEMA = 'old_db';

এরপরে এমন ফলাফলগুলির তালিকা পাবেন যা দেখে মনে হচ্ছে:

CREATE TABLE new_db.articles LIKE old_db.articles;
CREATE TABLE new_db.categories LIKE old_db.categories;
CREATE TABLE new_db.users LIKE old_db.users;
...

তারপরে আপনি কেবল সেগুলি চালাতে পারেন।

তবে এটি মাইএসকিউএল ভিউগুলির সাথে কাজ করবে না। আপনি AND TABLE_TYPE = 'BASE TABLE'প্রাথমিক জিজ্ঞাসাটি যোগ করে এড়াতে পারেন :


1

এটি নিয়মিত আপনার কিছু করা দরকার বা কেবল একটি বন্ধ?

আপনি একটি রফতানি করতে পারেন (যেমন পিএইচপিএমআইএডমিন বা অনুরূপ ব্যবহার করে) যা আপনার টেবিল এবং এর বিষয়বস্তুকে কোনও পাঠ্য ফাইলে স্ক্রিপ্ট করে দেবে, তারপরে আপনি এটিকে অন্য ডেটাবেসে পুনরায় আমদানি করতে পারবেন।


আমার এটি একবারই করা দরকার। তবে সমস্যাটি ডাটাবেসে সারণীতে প্রায় 1 মিলিয়ন সারি রয়েছে। ডাটাবেস ডাম্প বিশাল হবে। এছাড়াও আমি যখন রফতানি করার চেষ্টা করেছি তখন প্রায় 10000 সারি রফতানি করা হচ্ছে - সম্ভবত বড় আকারের কারণে।
স্পার্কি

আহ, হ্যাঁ এটি একটি সীমাবদ্ধতা। এই ওয়ার্ডপ্রেস কোডেক্স নিবন্ধ সাহায্য করতে পারে? এটি একটি ওয়ার্ডপ্রেস নিবন্ধ, তবে আপনাকে কিছুটা অন্তর্দৃষ্টি প্রদান করতে পারে (পিএইচপিএমওয়াই অ্যাডমিন হ্যান্ডল করার ক্ষেত্রে ডিবি খুব বড় ক্ষেত্রে সেক্ষেত্রে কমান্ড লাইন ব্যবহার করে টেবিলগুলি কীভাবে ডাম্প করা যায় সে সম্পর্কে একটি বিভাগ রয়েছে)।
Sepster

মাইএসকিএলডাম্প কমান্ড লাইন সরঞ্জামটিতে 1 মিলিয়ন সারি, বা কয়েক বিলিয়ন সারি নিয়ে কোনও সমস্যা নেই - এটি প্রভাব ফেলবে তা হ'ল এটি কত সময় নেয় এবং আপনার হার্ড ড্রাইভের ফলাফলটি কতটা দখল করে (এটি কোনও ফাইলের আউটপুট ধরে নিলে)। পিএইচপিএমআইএডমিনের এক্সপোর্ট কমান্ডের সাথে আমার অভিজ্ঞতা হ'ল এটি মাইএসকিএলডাম্পের চেয়ে অনেক বেশি সীমাবদ্ধ।
থোমাসরুটটার

1

একটি ডাটাবেস টেবিল থেকে অন্য ডাটাবেস টেবিল থেকে কিছু কলাম অনুলিপি এবং সন্নিবেশ করতে নীচের পদক্ষেপগুলি ব্যবহার করুন -

  1. টেবিলের টেবিলের নাম তৈরি করুন (কলামের নাম ডেটাটাইপ (আকার), কলামের নাম ডাটাটাইপ (আকার));

2.INSERT INTO db2.tablename SELECT কলামনাম 1, কলামনাম 2 FROM db1.tablename;


1

প্রথমে ডাম্প তৈরি করুন। ইতিমধ্যে উপস্থিত --no-create-info --no-create-dbথাকলে পতাকাগুলি যুক্ত করা হয়েছে table2:

mysqldump -u user1 -p database1 table1 > dump.sql

তারপরে user1পাসওয়ার্ড লিখুন । তারপর:

sed -e 's/`table1`/`table2`/' dump.sql
mysql -u user2 -p database2 < dump.sql

তারপরে user2পাসওয়ার্ড লিখুন ।

@ হেলমর্সের জবাব যেমন হ'ল তবে কনসোলের কাছে পাসওয়ার্ডগুলি কাঁচা পাঠ্যে প্রকাশিত না হওয়ায় এ পদ্ধতিটি আরও সুরক্ষিত (বিপরীত-আই-অনুসন্ধান, পাসওয়ার্ড স্নিফার ইত্যাদি)। স্ক্রিপ্ট ফাইল থেকে এটির অনুমতিতে যথাযথ বিধিনিষেধ প্রয়োগ করে কার্যকর করা হলে অন্যান্য পদ্ধতি ঠিক আছে।


0

এক্সএএমএপপি-তে কেবলমাত্র এসকিএলএল ফাইল হিসাবে প্রয়োজনীয় টেবিলটি রফতানি করুন এবং তারপরে প্রয়োজনীয় এটিকে আমদানি করুন


-1

সাকিলা কাস্টমোমারের মতো টেবিল গন্তব্য_কাস্টমারের তৈরি করুন ( ডাটাবেস_নাম.টিটেবলনাম ), এটি কেবল উত্স টেবিলের কাঠামোটি অনুলিপি করে দেবে, কাঠামোর সাথে অনুলিপি করার জন্য এই সারণি কাস্টমথর থেকে টেক্সট গন্তব্য_কাস্টমার তৈরি করুন * নির্বাচন করুন


এটি সম্পূর্ণ ভিন্ন প্রশ্নের উত্তর বলে মনে হচ্ছে। কোন ব্যাপার CREATE TABLE LIKEকেন এটা ভুল উল্লেখ যে প্রশ্নে? এবং এই উত্তরটি কীভাবে সমস্যার সমাধান করে তার কোনও ব্যাখ্যা নেই যে কোনও ব্যবহারকারীরই অন্যের টেবিলগুলিতে অ্যাক্সেস নেই।
টবি স্পিড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.