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
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.