পোস্টগ্রিস: বাশ স্ক্রিপ্ট থেকে পুনর্নির্মাণ / পুনঃ-পপুলেটিংয়ের পূর্বে সম্পূর্ণ ডাটাবেস সাফ করুন


139

আমি একটি শেল স্ক্রিপ্ট লিখছি (ক্রোনজ হয়ে যাবে) যা করবে:

1: আমার উত্পাদন ডেটাবেস ডাম্প

2: আমার বিকাশ ডাটাবেসে ডাম্প আমদানি করুন

পদক্ষেপ 1 এবং 2 এর মধ্যে, আমার বিকাশ ডাটাবেস সাফ করা দরকার (সমস্ত টেবিল ছেড়ে দিন?) শেল স্ক্রিপ্ট থেকে এটি কীভাবে সেরা হয়? এখনও পর্যন্ত, এটি দেখতে এটির মতো দেখাচ্ছে:

#!/bin/bash
time=`date '+%Y'-'%m'-'%d'`
# 1. export(dump) the current production database
pg_dump -U production_db_name > /backup/dir/backup-${time}.sql

# missing step: drop all tables from development database so it can be re-populated

# 2. load the backup into the development database
psql -U development_db_name < backup/dir/backup-${time}.sql

3
তাড়াহুড়োয় লোকদের জন্য oneliner:dbname='db_name' && dropdb $dbname && createdb $dbname && psql -d $dbname -f dump.sql
রুটার

এই অনলাইনারের আপনার ডাটাবেস তৈরি / ড্রপ করার অনুমতি থাকতে হবে requires লেখক যে পদ্ধতির চেষ্টা করছেন তার জন্য বিশেষ সুবিধার দরকার নেই।
ribamar

উত্তর:


188

আমি কেবল ডাটাবেসটি ফেলে রেখে আবার তৈরি করব। ইউনিক্স বা লিনাক্স সিস্টেমে এটি করা উচিত:

$ dropdb development_db_name
$ createdb developmnent_db_name

আসলে আমি এটি কীভাবে করি।


এইভাবে আমি এটিও করি। তারপরে সদ্য তৈরি হওয়া ডিবিতে পুনরুদ্ধার করুন।
আর্থার থমাস

3
হাঁ। এটি আরও ভাল কারণ এমন কোনও বস্তু থাকতে পারে যা আপনি পুনরুদ্ধার করছেন এমন ডাম্পের অংশ নয়। এই ক্ষেত্রে তারা অবশ্যই হত্যা করা হবে।
pstanton

7
একটি কৌশল যা আমার সময় সাশ্রয় করে তা হ'ল do সুডু-পোস্ট পোস্ট্রেস ড্রপবি DATABASE_NAME
অ্যালভিন

36
কিন্তু ... ডাটাবেস অনুমতি এবং মালিকানা সম্পর্কে কি?
ইমানুওল পাওলিনি

6
@ ইমানিয়েলপোলিনি createdb --owner=db_owner [--template=template0 --encoding=UTF8] db_nameআমি শেষ দুটি দুটি ডেটাবেজে ডিফল্ট হিসাবে যুক্ত করেছি
এমকেলেেক্স

91

আপনি আসলে ডেটাবেসের ব্যাকআপ একটি প্লেইন টেক্সট .sql স্ক্রিপ্ট ফাইল ফর্ম্যাটে ডিস্কে ডাম্প প্রয়োজন না থাকে, তাহলে আপনি সংযোগ করতে পারে pg_dumpএবং pg_restoreএকটি নল উপর সরাসরি একসঙ্গে।

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

উপরের দু'জনকে এরকম কিছু দেখাবে:

pg_dump -U username --clean | pg_restore -U username

1
আমি এই সমাধানটি পছন্দ করি, যেহেতু আমি একটি ব্যাকআপ অনুলিপি চাই, এখন আমি এটি করছি: pg_dump -Ft -U product_db_name> /backup/dir/backup-${time}.tar -ক্যালান / ব্যাকআপ / ডায়ার / ব্যাকআপ-${টাইম.এটি একটি কবজির মতো কাজ করে, আপনার সহায়তার জন্য ধন্যবাদ!
হফ

38
সতর্কতা: - ক্ল্যান বিকল্পটি পুনরুদ্ধার ফাইলে পাওয়া সমস্ত সম্পর্কগুলি কেবল সরিয়ে দেয়। এর অর্থ হ'ল আপনি যদি পরীক্ষার জন্য কোনও সারণী যুক্ত করেন, তবে এটি মুছে ফেলতে চান (উদাহরণস্বরূপ প্রোডাকশন ডিবির সাথে সিঙ্ক্রোনাইজ করতে), এটি সরানো হবে না
ianaré

6
এটি মনে রাখা জরুরী যে pg_dump এর - বিজ্ঞান বিকল্পটি কেবল সরল পাঠ্য ব্যাকআপ সহ কাজ করে। যেভাবে ডকুমেন্টেশনে এখানে পরিষ্কারভাবে বলা হয়েছে postgresql.org/docs/9.4/static/app-pgdump.html , সংরক্ষণাগারবদ্ধ ব্যাকআপগুলির জন্য আপনাকে pg_restore- এ ক্ল্যান ব্যবহার করতে হবে।
কিকিন-সামা

6
"- ক্ল্যান" বিকল্পে ক্যাসকেড অন্তর্ভুক্ত করার কোনও উপায় আছে কি? এটি হ'ল এই বিকল্পটি অকেজো দেখাচ্ছে। আমি "ERROR" পাচ্ছি: স্কিমা পাবলিক ড্রপ করতে পারে না কারণ অন্যান্য বস্তুগুলি এর উপর নির্ভর করে "এটি ব্যবহারের 100% সময় মতো।
user4674453

সমস্ত টেবিল অপসারণ সম্পর্কে প্রশ্নটি করা হয়েছিল। এটি কেবলমাত্র ডাটাবেজে পাওয়া টেবিলগুলি সরিয়ে দেয় যা pg_dump থেকে ডাম্প করছে।
jbg

13

যদিও নীচের লাইনটি উইন্ডোজ ব্যাচের স্ক্রিপ্ট থেকে নেওয়া হয়েছে, কমান্ডটি বেশ অনুরূপ হওয়া উচিত:

psql -U username -h localhost -d postgres -c "DROP DATABASE \"$DATABASE\";"

এই কমান্ডটি পুরো ডাটাবেসটি সাফ করার জন্য ব্যবহার করা হয়, আসলে এটিকে ফেলে দিয়ে। $DATABASE(উইন্ডোজ থাকা উচিত %DATABASE%) কমান্ড একটি জানালা শৈলী এনভায়রনমেন্ট ভেরিয়েবল যে ডেটাবেস নাম মূল্যায়ন করে। আপনি এটি দ্বারা আপনার প্রয়োজন হবে development_db_name


4
তাহলে কেন ইতিমধ্যে উপলব্ধ dropdbএবং createdbকমান্ড ব্যবহার করবেন না ? আপনি যদি পিএসকিএল চালাতে পারেন তবে আপনি সেগুলিও চালাতে পারেন।
মাইক 'পোম্যাক্স' কামারম্যানস


7

আপনি যদি "উদাহরণ_db" নামক আপনার ডাটাবেস পরিষ্কার করতে চান:

1) অন্য ডিবিতে লগইন করুন (উদাহরণস্বরূপ 'postgres'):

psql postgres

2) আপনার ডাটাবেস সরান:

DROP DATABASE example_db;

3) আপনার ডাটাবেস পুনরুদ্ধার:

CREATE DATABASE example_db;


4

দ্রষ্টব্য: আমার উত্তরটি সত্যই টেবিলগুলি এবং অন্যান্য ডাটাবেস অবজেক্টগুলি মোছার বিষয়ে; জন্য সমস্ত ডেটা মুছে ফেলার মধ্যে সারণী, অর্থাত সব টেবিল ছিন্ন , Endre উভয় এক মাসে পরে একটি similarily ভালভাবে মৃত্যুদন্ড কার্যকর (সরাসরি মৃত্যুদন্ড) বিবৃতি প্রদান করেনি।

যেসব ক্ষেত্রে আপনি কেবল DROP SCHEMA public CASCADE;, DROP OWNED BY current_user;বা অন্য কিছু করতে পারবেন না , সেগুলির জন্য এখানে আমি লিখে রেখেছি একা একা এসকিউএল স্ক্রিপ্ট যা লেনদেন-নিরাপদ (যেমন আপনি এটির মধ্যে BEGIN;এবং ROLLBACK;এটি কেবল এটি পরীক্ষা করার জন্য বা COMMIT;কার্য সম্পাদন করতে পারেন) এবং "সমস্ত" ডাটাবেস অবজেক্টগুলি পরিষ্কার করে দেয় ... ভাল, আমাদের অ্যাপ্লিকেশন ব্যবহার করে এমন ডেটাবেজে ব্যবহৃত সমস্ত বা আমি বুদ্ধিমানের সাথে যুক্ত করতে পারি, যা হ'ল:

  • টেবিলের উপর ট্রিগার
  • টেবিলগুলিতে সীমাবদ্ধতা (এফকে, পিকে CHECK, UNIQUE)
  • সূচকের
  • VIEWগুলি (সাধারণ বা বস্তুগত)
  • টেবিল
  • সিকোয়েন্স
  • রুটিন (সামগ্রিক ফাংশন, ফাংশন, পদ্ধতি)
  • সমস্ত অ-ডিফল্ট (অর্থাত্ DB- publicঅভ্যন্তরীণ নয়) স্কিম্যাট “আমাদের” নিজস্ব: স্ক্রিপ্টটি কার্যকর হয় যখন "ডাটাবেস সুপারভাইজার নয়" হিসাবে চালানো হয়; একজন সুপারভাইজার সমস্ত স্কিমেটা ফেলে দিতে পারে (সত্যিকারের গুরুত্বপূর্ণগুলি এখনও স্পষ্টভাবে বাদ দেওয়া হয়, যদিও)
  • এক্সটেনশানগুলি (ব্যবহারকারী-অবদানযুক্ত তবে আমি সাধারণত ইচ্ছাকৃতভাবে এগুলিতে রেখে যাই)

বাদ দেওয়া হয়নি (কিছু কিছু ইচ্ছাকৃত; কিছু কারণ আমাদের ডিবিতে আমার কোনও উদাহরণ নেই):

  • publicস্কিমা (তাদের মধ্যে এক্সটেনশন প্রদত্ত কাপড় জন্য যেমন)
  • কোলেশন এবং অন্যান্য স্থানীয় স্টাফ
  • ইভেন্ট ট্রিগার
  • পাঠ্য অনুসন্ধান স্টাফ,… ( অন্যান্য জিনিসগুলি এখানে আমি মিস করেছি বলে দেখুন)
  • ভূমিকা বা অন্যান্য সুরক্ষা সেটিংস
  • যৌগিক প্রকারের
  • টোস্ট টেবিল
  • এফডিডাব্লু এবং বিদেশী টেবিলগুলি

এই সত্যিই যখন ডাম্প আপনি পুনরুদ্ধার করতে চান একটি ভিন্ন ডাটাবেসের স্কিমা সংস্করণ (যেমন ডেবিয়ান সঙ্গে হয় ক্ষেত্রেই জন্য দরকারী dbconfig-common, flyway বা Liquibase / ডিবি-Manul) ডাটাবেসের চেয়ে আপনি তা পুনরুদ্ধার করতে চান।

আমার কাছে এমন একটি সংস্করণও পাওয়া গেছে যা "দুটি টেবিল ব্যতীত সমস্ত কিছু মুছে ফেলবে এবং সেগুলির মধ্যে যা আছে" (যে অনুক্রমটি নিজেই পরীক্ষা করা হয়েছে, দুঃখিত, আমি জানি, বিরক্তিকর) যদি কেউ আগ্রহী হয় তবে; পার্থক্যটি ছোট আগ্রহী হলে আমার সাথে যোগাযোগ করুন বা এই রেপোটি পরীক্ষা করুন ।

এসকিউএল

-- Copyright © 2019, 2020
--      mirabilos <t.glaser@tarent.de>
--
-- Provided that these terms and disclaimer and all copyright notices
-- are retained or reproduced in an accompanying document, permission
-- is granted to deal in this work without restriction, including un‐
-- limited rights to use, publicly perform, distribute, sell, modify,
-- merge, give away, or sublicence.
--
-- This work is provided “AS IS” and WITHOUT WARRANTY of any kind, to
-- the utmost extent permitted by applicable law, neither express nor
-- implied; without malicious intent or gross negligence. In no event
-- may a licensor, author or contributor be held liable for indirect,
-- direct, other damage, loss, or other issues arising in any way out
-- of dealing in the work, even if advised of the possibility of such
-- damage or existence of a defect, except proven that it results out
-- of said person’s immediate fault when using the work as intended.
-- -
-- Drop everything from the PostgreSQL database.

DO $$
DECLARE
        q TEXT;
        r RECORD;
BEGIN
        -- triggers
        FOR r IN (SELECT pns.nspname, pc.relname, pt.tgname
                FROM pg_catalog.pg_trigger pt, pg_catalog.pg_class pc, pg_catalog.pg_namespace pns
                WHERE pns.oid=pc.relnamespace AND pc.oid=pt.tgrelid
                    AND pns.nspname NOT IN ('information_schema', 'pg_catalog', 'pg_toast')
                    AND pt.tgisinternal=false
            ) LOOP
                EXECUTE format('DROP TRIGGER %I ON %I.%I;',
                    r.tgname, r.nspname, r.relname);
        END LOOP;
        -- constraints #1: foreign key
        FOR r IN (SELECT pns.nspname, pc.relname, pcon.conname
                FROM pg_catalog.pg_constraint pcon, pg_catalog.pg_class pc, pg_catalog.pg_namespace pns
                WHERE pns.oid=pc.relnamespace AND pc.oid=pcon.conrelid
                    AND pns.nspname NOT IN ('information_schema', 'pg_catalog', 'pg_toast')
                    AND pcon.contype='f'
            ) LOOP
                EXECUTE format('ALTER TABLE ONLY %I.%I DROP CONSTRAINT %I;',
                    r.nspname, r.relname, r.conname);
        END LOOP;
        -- constraints #2: the rest
        FOR r IN (SELECT pns.nspname, pc.relname, pcon.conname
                FROM pg_catalog.pg_constraint pcon, pg_catalog.pg_class pc, pg_catalog.pg_namespace pns
                WHERE pns.oid=pc.relnamespace AND pc.oid=pcon.conrelid
                    AND pns.nspname NOT IN ('information_schema', 'pg_catalog', 'pg_toast')
                    AND pcon.contype<>'f'
            ) LOOP
                EXECUTE format('ALTER TABLE ONLY %I.%I DROP CONSTRAINT %I;',
                    r.nspname, r.relname, r.conname);
        END LOOP;
        -- indicēs
        FOR r IN (SELECT pns.nspname, pc.relname
                FROM pg_catalog.pg_class pc, pg_catalog.pg_namespace pns
                WHERE pns.oid=pc.relnamespace
                    AND pns.nspname NOT IN ('information_schema', 'pg_catalog', 'pg_toast')
                    AND pc.relkind='i'
            ) LOOP
                EXECUTE format('DROP INDEX %I.%I;',
                    r.nspname, r.relname);
        END LOOP;
        -- normal and materialised views
        FOR r IN (SELECT pns.nspname, pc.relname
                FROM pg_catalog.pg_class pc, pg_catalog.pg_namespace pns
                WHERE pns.oid=pc.relnamespace
                    AND pns.nspname NOT IN ('information_schema', 'pg_catalog', 'pg_toast')
                    AND pc.relkind IN ('v', 'm')
            ) LOOP
                EXECUTE format('DROP VIEW %I.%I;',
                    r.nspname, r.relname);
        END LOOP;
        -- tables
        FOR r IN (SELECT pns.nspname, pc.relname
                FROM pg_catalog.pg_class pc, pg_catalog.pg_namespace pns
                WHERE pns.oid=pc.relnamespace
                    AND pns.nspname NOT IN ('information_schema', 'pg_catalog', 'pg_toast')
                    AND pc.relkind='r'
            ) LOOP
                EXECUTE format('DROP TABLE %I.%I;',
                    r.nspname, r.relname);
        END LOOP;
        -- sequences
        FOR r IN (SELECT pns.nspname, pc.relname
                FROM pg_catalog.pg_class pc, pg_catalog.pg_namespace pns
                WHERE pns.oid=pc.relnamespace
                    AND pns.nspname NOT IN ('information_schema', 'pg_catalog', 'pg_toast')
                    AND pc.relkind='S'
            ) LOOP
                EXECUTE format('DROP SEQUENCE %I.%I;',
                    r.nspname, r.relname);
        END LOOP;
        -- extensions (only if necessary; keep them normally)
        FOR r IN (SELECT pns.nspname, pe.extname
                FROM pg_catalog.pg_extension pe, pg_catalog.pg_namespace pns
                WHERE pns.oid=pe.extnamespace
                    AND pns.nspname NOT IN ('information_schema', 'pg_catalog', 'pg_toast')
            ) LOOP
                EXECUTE format('DROP EXTENSION %I;', r.extname);
        END LOOP;
        -- aggregate functions first (because they depend on other functions)
        FOR r IN (SELECT pns.nspname, pp.proname, pp.oid
                FROM pg_catalog.pg_proc pp, pg_catalog.pg_namespace pns, pg_catalog.pg_aggregate pagg
                WHERE pns.oid=pp.pronamespace
                    AND pns.nspname NOT IN ('information_schema', 'pg_catalog', 'pg_toast')
                    AND pagg.aggfnoid=pp.oid
            ) LOOP
                EXECUTE format('DROP AGGREGATE %I.%I(%s);',
                    r.nspname, r.proname,
                    pg_get_function_identity_arguments(r.oid));
        END LOOP;
        -- routines (functions, aggregate functions, procedures, window functions)
        IF EXISTS (SELECT * FROM pg_catalog.pg_attribute
                WHERE attrelid='pg_catalog.pg_proc'::regclass
                    AND attname='prokind' -- PostgreSQL 11+
            ) THEN
                q := 'CASE pp.prokind
                        WHEN ''p'' THEN ''PROCEDURE''
                        WHEN ''a'' THEN ''AGGREGATE''
                        ELSE ''FUNCTION''
                    END';
        ELSIF EXISTS (SELECT * FROM pg_catalog.pg_attribute
                WHERE attrelid='pg_catalog.pg_proc'::regclass
                    AND attname='proisagg' -- PostgreSQL ≤10
            ) THEN
                q := 'CASE pp.proisagg
                        WHEN true THEN ''AGGREGATE''
                        ELSE ''FUNCTION''
                    END';
        ELSE
                q := '''FUNCTION''';
        END IF;
        FOR r IN EXECUTE 'SELECT pns.nspname, pp.proname, pp.oid, ' || q || ' AS pt
                FROM pg_catalog.pg_proc pp, pg_catalog.pg_namespace pns
                WHERE pns.oid=pp.pronamespace
                    AND pns.nspname NOT IN (''information_schema'', ''pg_catalog'', ''pg_toast'')
            ' LOOP
                EXECUTE format('DROP %s %I.%I(%s);', r.pt,
                    r.nspname, r.proname,
                    pg_get_function_identity_arguments(r.oid));
        END LOOP;
        -- nōn-default schemata we own; assume to be run by a not-superuser
        FOR r IN (SELECT pns.nspname
                FROM pg_catalog.pg_namespace pns, pg_catalog.pg_roles pr
                WHERE pr.oid=pns.nspowner
                    AND pns.nspname NOT IN ('information_schema', 'pg_catalog', 'pg_toast', 'public')
                    AND pr.rolname=current_user
            ) LOOP
                EXECUTE format('DROP SCHEMA %I;', r.nspname);
        END LOOP;
        -- voilà
        RAISE NOTICE 'Database cleared!';
END; $$;

পোস্টগ্র্রেএসকিউএল 9.6 ( ) পরে পরবর্তী সংযোজনগুলি ( ক্ল্যামেন্ট প্রিভস্টextensions দ্বারা অবদান ) বাদে পরীক্ষিত । 9.6 এবং 12.2 এ সমষ্টি অপসারণ পরীক্ষা করা হয়েছে, পদ্ধতি অপসারণ 12.2-তেও পরীক্ষা করা হয়েছে। বাগফিক্স এবং আরও উন্নতি স্বাগত!jessie-backports

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