বড় এসকিউএল ডাটাবেসে ক্রেট টেবিল এবং টেবিল স্টেটর স্টেটমেন্টগুলি ফিরিয়ে আনা সম্ভব?


108

আমি এমন একটি প্রোগ্রামে কাজ করছি যা ডিডিএল জারি করে। আমি জানতে চাই CREATE TABLEএবং অনুরূপ ডিডিএল আবার ফিরিয়ে আনা যায় কিনা

  • Postgres
  • মাইএসকিউএল
  • SQLite
  • ইত্যাদি

প্রতিটি ডাটাবেস কীভাবে ডিডিএল-এর মাধ্যমে লেনদেন পরিচালনা করে তা বর্ণনা করুন।


শুধু এই থ্রেড পরিপূর্ণ করার জন্য, ও H2 এছাড়াও এসকিউএল কমান্ড অধিকাংশ জন্য লেনদেনের DDL বিবৃতি সমর্থন করে না, অনুযায়ী এই
গ্যাব্রিয়েল পাইম

উত্তর:


148

http://wiki.postgresql.org/wiki/Transactional_DDL_in_PostgreSQL:_A_Competitive_Analysis পোস্টগ্রিসএসকিউএল এর দৃষ্টিকোণ থেকে এই সমস্যাটির একটি ওভারভিউ সরবরাহ করে।

এই ডকুমেন্ট অনুযায়ী ডিডিএল লেনদেন হয়?

  • পোস্টগ্রিএসকিউএল - হ্যাঁ
  • মাইএসকিউএল - না; ডিডিএল একটি অন্তর্নিহিত অঙ্গীকারের কারণ
  • ওরাকল ডেটাবেস 11 জি রিলিজ 2 এবং এর বেশি - ডিফল্টরূপে, না, তবে সংস্করণ-ভিত্তিক পুনর্নির্ধারণের বিকল্প হিসাবে উপস্থিত
  • ওরাকল এর পুরানো সংস্করণ - না; ডিডিএল একটি অন্তর্নিহিত অঙ্গীকারের কারণ
  • এসকিউএল সার্ভার - হ্যাঁ
  • সিবাজ অ্যাডাপ্টিভ সার্ভার - হ্যাঁ
  • ডিবি 2 - হ্যাঁ
  • ইনফর্মিক্স - হ্যাঁ
  • ফায়ারবার্ড (ইন্টারবাস) - হ্যাঁ

এসকিউএলাইটেও লেনদেনের ডিডিএল রয়েছে বলে মনে হয়। আমি এসকিউএলাইটে ROLLBACKএকটি CREATE TABLEবিবৃতি সক্ষম হয়েছি । এর CREATE TABLEডকুমেন্টেশনে কোনও বিশেষ লেনদেনের 'গোটচাস' উল্লেখ করা হয়নি।


8
তবে স্ক্লাইটের জন্য ডিফল্ট পাইথন ড্রাইভার লেনদেনের এসকিউএল প্রতিরোধ করে। bugs.python.org/issue10740
joeforker

সুতরাং উত্তরটি হ্যাঁ, হ্যাঁ, এগুলি আবার ঘুরিয়ে দেওয়া যেতে পারে, যদি না আপনি মাইএসকিউএল বা ওরাকেলের পুরানো সংস্করণ ব্যবহার না করেন "
rjmunro

না, তালিকাভুক্ত থাকা ছাড়াও অন্যান্য এসকিউএল ডাটাবেস রয়েছে।
জোফোরকার

3
লেনদেনের ডিডিএল সমর্থন যুক্ত করার জন্য মারিয়াডিবিতে একটি মুক্ত সমস্যা রয়েছে: jira.mariadb.org/browse/MDEV-4259 । এটির জন্য দয়া করে ভোট দিন।
গিলি

1
ALTER TABLEএসকিউএলাইটের কিছুটা সীমাবদ্ধ বিবৃতিটি আবার ঘোরানোও সক্ষম। ডকুমেন্টেশনে এটি স্পষ্টভাবে উল্লেখ করা হয়নি । সেখানে যা উল্লেখ করা হয়েছে তা হ'ল লেনদেনের অভ্যন্তরে কীভাবে "উন্নত" পরিবর্তনগুলি করা যায়।
থমাস

32

পোস্টগ্রিএসকিউএল-র বেশিরভাগ ডাটাবেস অবজেক্টের জন্য লেনদেনের ডিডিএল থাকে (অবশ্যই সারণী, সূচিপত্র ইত্যাদি তবে ডাটাবেস, ব্যবহারকারী নয়)। তবে কার্যত কোনও ডিডিএল ACCESS EXCLUSIVEলক্ষ্য বস্তুতে একটি লক পাবে , এটি ডিডিএল লেনদেন শেষ না হওয়া পর্যন্ত এটি সম্পূর্ণ অ্যাক্সেসযোগ্য করে তুলবে। এছাড়াও, সমস্ত পরিস্থিতি একেবারেই পরিচালিত হয় না - উদাহরণস্বরূপ, আপনি যদি fooঅন্য কোনও লেনদেনটি এটিকে নামা এবং প্রতিস্থাপন টেবিল তৈরি করার সময় টেবিল থেকে নির্বাচন করার চেষ্টা করেন foo, তবে অবরুদ্ধ লেনদেনটি নতুনটি আবিষ্কার করার পরিবর্তে অবশেষে একটি ত্রুটি পাবেfoo টেবিলটি । (সম্পাদনা করুন: পোস্টগ্র্রেএসকিউএল 9.3 বা এর আগে এটি ঠিক করা হয়েছিল)

CREATE INDEX ... CONCURRENTLY ব্যতিক্রমী, এটি একই সাথে একত্রে আপডেটের অনুমতি দেওয়ার সময় একটি টেবিলের সাথে একটি সূচক যুক্ত করতে তিনটি লেনদেন ব্যবহার করে, তাই এটি লেনদেনে নিজেই সম্পাদন করা যায় না।

এছাড়াও VACUUMএকটি লেনদেনে ডাটাবেস রক্ষণাবেক্ষণ কমান্ড ব্যবহার করা যাবে না।


আমি যুক্তি দিয়ে বলছি যে fooঅন্য ট্রানজেকশনটি নামার সময় এবং পুনরায় তৈরি করার সময় আমি যদি টেবিল থেকে নির্বাচন করার চেষ্টা করি তবে আমি পুরানো সংস্করণ বা ত্রুটিযুক্ত একটি ঠিক OK আমি নতুন সংস্করণে ঠিক নেই, কারণ এটি এখনও প্রতিশ্রুতিবদ্ধ ছিল না, তাই আমি অবশ্যই এটি দেখতে পাচ্ছি না। আমি একটি ত্রুটি সহ ঠিক আছি, কারণ একযোগে লেনদেনের অ্যাক্সেসে যে কোনওভাবে লেনদেন পুনরায় চালু করার জন্য প্রস্তুত থাকতে হবে। যদি ত্রুটিগুলি প্রয়োজনের তুলনায় প্রায়শই ঘটে তবে এটি কার্যকারিতা হ্রাস করতে পারে তবে এটি এখনও সঠিক।
জানু হুডেক

1
@ জানহুদেক: আপনি নতুন টেবিলের একটি অনির্দিষ্ট সংস্করণ দেখতে পাবেন না, কেবল এটিই পুরো লেনদেনের ফলাফল যা এটিকে বাদ দিয়েছে / পুনরায় তৈরি করেছে। যেমন একটি লেনদেন যা একটি টেবিলটি ড্রপ করে, পুনরায় তৈরি করে এবং পুনরায় সংযোজন করে তা কার্যকরভাবে পারমাণবিক কব্জি করে অন্য প্রক্রিয়াগুলি সেই টেবিল থেকে নির্বাচন করে। (তবে তারা এমনকি টেবিলের স্কিমাটি পড়ার চেষ্টা করার সাথে সাথে সমস্ত কিছু অবরুদ্ধ হয়ে যাবে)
আরাকনিড

5

এটি কঠোরভাবে একটি "রোলব্যাক" বলছে না, যদিও ওরাকলে FLASHBACK কমান্ডটি এই ধরণের পরিবর্তনগুলি পূর্বাবস্থায় ফেলার জন্য ব্যবহার করা যেতে পারে, যদি এটি ডাটাবেস সমর্থন করার জন্য কনফিগার করা থাকে।


5

দেখে মনে হচ্ছে অন্যান্য উত্তরগুলি বেশ পুরানো।

2019 হিসাবে:

  • পোস্টগ্রিস অনেক রিলিজের জন্য লেনদেনের ডিডিএল সমর্থন করেছে।
  • এসকিউএলাইট অনেক রিলিজের জন্য লেনদেনের ডিডিএল সমর্থন করেছে।
  • মাইএসকিউএল 8.0 সাল থেকে পরমাণু ডিডিএল সমর্থন করেছে (যা 2018 সালে প্রকাশ হয়েছিল)।

1
একটি লক্ষ্য করা উচিত যে মাইএসকিউএল 8 এ পারমাণবিক ডিডিএল কেবলমাত্র পারমাণবিক ডিডিএল বিবৃতিগুলিকে বোঝায়, তবে লেনদেনমূলক বিবৃতি নয়। একটি ডিডিএল বিবৃতি, পারমাণবিক বা না, এখনও বেশিরভাগ ক্ষেত্রে অন্তর্নিহিত অঙ্গীকারের কারণ হয় এবং সুতরাং অন্য কোনও লেনদেনের মধ্যেই মৃত্যুদন্ড কার্যকর করা যায় না (উদাহরণস্বরূপ, START TRANSACTION ... COMMIT;যদি আপনি একই লেনদেনের মধ্যে একটি ব্যর্থ হয় তবে আপনি লেনদেনে ডিডিএল স্টেটমেন্টগুলি ফিরিয়ে নিতে পারবেন না। ( দেবের অধীনে নোট দেখুন see mysql.com/doc/refman/8.0/en/... )
Lacek

4

মাইএসকিউএল দিয়ে করা যায় না বলে মনে হচ্ছে খুব বোবা তবে সত্য ... (স্বীকৃত উত্তর অনুসারে)

"InnoDB এ তৈরি টেবিল বিবৃতিটি একটি একক লেনদেন হিসাবে প্রক্রিয়া করা হয় This এর অর্থ হ'ল ব্যবহারকারীর কাছ থেকে একটি রোলব্যাক সেই লেনদেনের সময় ব্যবহারকারীরা তৈরি টেবিলের বিবৃতি পূর্বাবস্থায় ফিরিয়ে আনবে না।"

https://dev.mysql.com/doc/refman/5.7/en/implicit-commit.html

কয়েকটি ভিন্ন উপায়ে চেষ্টা করে দেখলে তা আর ফিরে আসে না ..

চারপাশের কাজটি হ'ল কেবল ব্যর্থতার পতাকা সেট করা এবং যদি কোনও প্রশ্নের ব্যর্থ হয় তবে "ড্রপ টেবিল tblname" করুন ..


1
অভিশাপ। আমি নির্ধারণ করার চেষ্টা করেছি যে পূর্ববর্তী তৈরি টেবিলগুলি কেন এক ঘন্টার জন্য নির্দিষ্ট (তৈরি) টেবিল ব্যর্থ হলে অদৃশ্য হবে না। আমি মারিয়াডিবি ব্যবহার করছি (এক্সএএমপিপি মাইএসকিউএল থেকে মারিয়াডিবিতে স্যুইচ করেছেন), তবে কেসটি একই। এটি নির্বোধ: |
আকিনুরি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.