Delete INSERT INTO from Sql file | Sed, vim ve iyi olan hersey

Merhaba, geçenlerde bir db dump içindeki bazı tabloları exclude edecek şekilde iletilmesi istendi. Bununla ilgili çalışırken bazı notlar tuttum, aşağıda iletiyorum. Başlık resmi için Furkan Dindar’a teşekkürler 🙂

Öncelikle elimde bazı tablo isimleri var. Bu tablolar alınmış dumpın içinde var fakat özel bilgiler içermemesi gibi isteklerden kırpmamız gerek. Örnek;

salesrule_coupon
salesrule_coupon_aggregated
salesrule_coupon_aggregated_updated
salesrule_coupon_usage
salesrule_customer
salesrule_customer_group
salesrule_label
salesrule_product_attribute
salesrule_website
salesrule

Sed komutunu MacOS’ta Linux’ta çalıştığı gibi çalışmıyor. Hatta gsed kullanılması gerekiyor, dolayısı ile bu makalede yazdığım kodların tümü linux üzerinde çalışyor.

SED

Amacım aşağıdaki gibi bir pattern yaratmak.

sed '/INSERT INTO `TABLE_TO_SKIP`/d' DBdump.sql > reduced.sql

https://stackoverflow.com/a/26379517

Bunu çoklamak istediğimizde de başarı ile çalıştırabildiğim aşağıdaki gibi bir çıktı örneği oluyor;

sed -e '/INSERT INTO `sales_order_aggregated_updated`/d' -e '/INSERT INTO `sales_bestsellers_aggregated_daily`/d' .........(ne kadar tablo var ise)...... -e '/INSERT INTO `salesrule_customer_group`/d' mysqlfile.sql -i

Bunu tek tek elle yazmamak için sed ve vim’den yararlanacağız. Öncelikle tablo isimlerinde farklı sütunlar olabileceği bir senaryoda aşağıdaki gibi bir komut kullanmak yararlı olacaktır ( $1 = sütun sayısı)

cat table_name.txt | awk '{print $1}'

Çıktı:

Şimdi yazdırmak istediğimiz pattern için ilk adımı gerçekleştiriyoruz.

cat table_name.txt | awk '{print $1}'|sed "s,^,-e \'/INSERT INTO \`,g"

Çıktı:

Gözlemlendiği gibi her satırda -e ‘/INSERT INTO `tablename çıktısını yazdırabiliyoruz. Şimdi satırın sonunu tamamlayalım.

cat table_name.txt | awk '{print $1}'|sed "s,^,-e \'/INSERT INTO \`,g"|sed "s,$,\`/d\',g"

Çıktı:

Bu noktada bu her satırı yan yana yazdırmam gerek. Normal şartlarda xargs ile bu yapılabilir. Fakat her satırda ( ` ‘ “) çok ça özel karakter kullanıyorum ve açıkcası xargs ile beceremedim. Bunun için vim’in güzel özelliklerini kullanacağız.

VIM

Son çalıştırdığımız komutu bir dosyaya yazdırıyorum.

cat table_name.txt | awk '{print $1}'|sed "s,^,-e \'/INSERT INTO \`,g"|sed "s,$,\`/d\',g" > tabletest.txt

Dosyaya vim ile girdikten sonra 2 komut ile bu işlem yapılabiliyor.

Birinci yol;
:%join

İkinci yol;
%s/\n/ /

Çıktı:

Bu işlemi kaydedip çıkıyoruz.

Ek bilgi: Vim’de her satırın sonundaki karakteri silebilmek için

:g/-/norm nD
:g         : Start a Global Command (:h :g for extra help on global commands)
/-         : Search for -
/norm nD   : Execute nD in Normal Mode where 
               n - jumps to the match
               D - delete to the end of the line

https://stackoverflow.com/a/37294209

INSERT INTO delete in sql file.

Son işleme geçiyoruz. Şu ana kadar yaptıklarımızın tümünü birleştirelim;

Not: Değişiklik yaptığınız dosyanın üzerinde işlem yapıldığından, sql file’ın yedeğini alıp alınan yedekte çalışmanızı öneririm.

sed -e '/INSERT INTO `newsletter_subscriber`/d' -e '/INSERT INTO `sales_invoice`/d' -e '/INSERT INTO `sales_invoice_item`/d' -e '/INSERT INTO `sales_order_tax_item`/d' -e '/INSERT INTO `quote`/d' -e '/INSERT INTO `queue_message`/d' -e '/INSERT INTO `yotpo_order_status_history`/d' -e '/INSERT INTO `magento_logging_event_changes`/d' -e '/INSERT INTO `sales_order_status_history`/d' -e '/INSERT INTO `sales_order_aggregated_created`/d' -e '/INSERT INTO `sales_order_aggregated_updated`/d' -e '/INSERT INTO `sales_bestsellers_aggregated_daily`/d' -e '/INSERT INTO `customer_group`/d' yedek.sql -i

İşlemi başlattığımda ismi rastgele bir dosya olusuyor. “seduH6TdV” İşlem tamamlandığında dump paylaşılabilir.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Bu site, istenmeyenleri azaltmak için Akismet kullanıyor. Yorum verilerinizin nasıl işlendiği hakkında daha fazla bilgi edinin.