PostgreSQL Saatlik Yedekleme Script’i

Projemizde birden fazla Postgresql veritabanı bulunmakta.  Hepsinde de anlık değişiklikler olabiliyor. Sistemsel olarak yedeklemeler mevcut fakat .SQL uzantılı yedeğimiz bulunmamakta. Çünkü bir tablo veya bir satır içerik / veri için tüm sistemi geri döndürmek oldukça mantıksız duruyor.

Daha öncesinde MYSQL için yapmış olduğum yedekleme BASH SCRIPT’ini POSTGRESQL için uyarladım ve çalışır hale getirdim. Database boyutu düşük olduğu için 24 saatlik yedekleme şuanda gayet uygun. Database boyutunu ve server disk kapasitesini düşünerekten geçmişe dönük yedekleri silmeyi unutmayın. Canınız yanar 🙂

Okumaya devam et “PostgreSQL Saatlik Yedekleme Script’i”

MySql Parçalı Dosyaları İçeri Aktarma

Yedekleme sistemleri her yazılım ve sistem için oldukça önemlidir. Farklı yedekleme senaryoları mevcuttur. Bundanlar en basit olanı veritabanını dump etmektir. Diğeri ise tüm veritabanını tek bir dosyada dump etmek yerine tabloları ayrı ayrı dump etmektir.

Tek bir dosya halindeki yedekleriniz veritabanınızdaki veri büyüklüğüne göre başarılı olabilir. Fakat büyük bir veritabanınız mevcut ise tek bir dosya halinde yedeklemenizi tavsiye etmem.

Elimizde MySql veritabanınızın dump edilmiş hali yani tüm veritabanının dosyaya çıktı alınmış halini aşağıdakine benzer bir komut ile Linux Terminal üzerinden içeriye tekrar alabilirsiniz.


mysql -u MYSQL_USER -pMYSQL_SIFRENIZ VERITABANI_ADI < $d

Okumaya devam et “MySql Parçalı Dosyaları İçeri Aktarma”

Veeam Backup & Replication Windows Server Hostname Değiştirme ( Değiştirmeme )

Ufak bir anı paylaşımı daha.
Sanallaştırma teknolojileriden VMware kullanmaktayız. Sanal sistemlerimizi yedeklemek amacıyla da Veeam Backup & Replication kullanıyoruz. Kurulu olan sanal Windows server üzerinde de HOSTNAME’i ( Sunucu / Bilgisayar adı ) ilk kurulum sırasında default olarak bırakmışız. Bu böyle kalmasın diyip değiştirdiğimizde ise Veeam Backup çalışmadı. Değişiklik yapmadan önce yedeklerınızı almanızı tavsiye ederim. Yedekleme tarafı önemli olduğu çözümü bulamadan eski hostname’i geri aldık. Farklı bir sistem üzerinde kurup çözümünü test edeceğim.  Başarılı olursa paylaşacağım. Muhakkak birileri yapmıştır diye düşünüyorum.
Şuna benzer bir hata alıyorsunuz;
“could not connect to server: Connection refused Is the server running on host ‘localhost’ “
Şimdilik demem şudur ki değiştirirseniz problemlerin ardı arkası kesilmiyor. Ya da sisteminiz zaten eski ise yenisini kurup eski konfigürasyonu yenisine taşıyın. 🙂 Ya da değiştirmeyin. 🙂
Sağlıcakla..

Windows Server Arayüz Giderse Geri Getirme

Windows bir sunucunuz var ve ayarları ile oynarken ( Genellikle server ayarları ile oynamanızı tavisye etmem. Fakat en iyi tecrübe şeklidir 🙂 ) yeniden başlatma isteği gelir ve ne olduğunu okumadan EVET’e basarsanız neler mi olabilir. Birçok şey olabilir. Gün içerisinde yaşadığım bir olayı sizlerle paylaşmak istiyorum.

Kenarda köşede kalmış sadece bazı işlemleri yapmak için kullandığım bir Windows sunucu vardı. RDP ( Remote Desktop Protocol | Uzak Masa Üstü Bağlantısı ) olarak kullanıyordum. Üzerinde test için IIS ( Internet Information Services ) kuruluydu. Windows özelliklerinden IIS’i kaldırırken çok fazla dikkat etmeden kaldır sihirbazını kullanarak kaldırığımda sistem benden yeniden başlatma istedi. Ne mi oldu ? Aşağıdaki gibi birşey oldu.

windows-server-cli

Okumaya devam et “Windows Server Arayüz Giderse Geri Getirme”

MSSQL CSV Formatında Saatlik Yedek Aldırma İşlemi

Bir projemizde kullanılan MSSQL Server Database sistemi için saatlik yedeklemelere ihtiyaç duyduk.

C#.Net ortamında çalışmaktadır. Otomatik olarak her saat yedek alabilmesi için ise outputtaki .exe dosyasını “Zamanlanmış Görevlere ( Task Scheduler )” zamanlanmış görev olarak çalıştırıyoruz. Veritabanındaki tabloları listeleyip tüm dataları dump ediyoruz. CSV formatında dosyaya yazıyoruz ve sıkıştırma işlemini gerçekleştiriyoruz. Böylece disk kaybı yaşamıyoruz.

Birden fazla Database mevcut ise önce onları çekip ayrı ayrı da çalıştırabilirsiniz. Geliştirilip farklı varsyonlarda eklenebilir. FTP olarak farklı bir alanada yükleme yapılabilir. Bu sistemde şuanda tüm dosyalar tutuluyor. Manuel olarak silmek yerine birkaç saat öncesine ait klasörleri silebilirsiniz. Diskten kazanmış olursunuz.

Program parçasını full olarak paylaşıyorum;

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using System.Data.SqlClient;
using System.IO;
using System.Data;
using System.Text;
using System.IO.Compression;

namespace WindowsFormsApp7
{
static class Program
{
/// 
<summary>
/// The main entry point for the application.
/// </summary>

/// 
private static string directoryPath = @"c:\temp";
[STAThread]

static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);

SqlConnection sqlCon = new SqlConnection("Data Source=IP;Initial Catalog=DATABASE;User ID=USERNAME;Password=PASSWORD;MultipleActiveResultSets=True;");
sqlCon.Open();
string sql = "SELECT sc.name + '.' + ta.name TableName ,SUM(pa.rows) RowCnt FROM sys.tables ta INNER JOIN sys.partitions pa ON pa.OBJECT_ID = ta.OBJECT_ID INNER JOIN sys.schemas sc ON ta.schema_id = sc.schema_id WHERE ta.is_ms_shipped = 0 AND pa.index_id IN(1,0) GROUP BY sc.name,ta.name having SUM(pa.rows) > 0 and sc.name +'.'+ ta.name IN ( 'dbo.EFAT_ZARF' ) ORDER BY SUM(pa.rows) DESC";
SqlCommand com = new SqlCommand(sql, sqlCon);
SqlDataReader read = com.ExecuteReader();

//string dirname = "DOSYAYOLU" + (DateTime.Now).ToString("yyyy-MM-dd");
string dirname = "C:/SQL_BACKUP/" + (DateTime.Now).ToString("yyyy-MM-dd");
CreateIfMissing(dirname);

dirname += "/" + (DateTime.Now).ToString("HH");

CreateIfMissing(dirname);
string rar_dir = @"" + dirname;
string rar_path = @"" + dirname + ".zip";
List<string> filess = new List<string>();
while (read.Read())
{
string fileName = dirname + "/" + read.GetValue(0) + ".csv";
filess.Add(fileName);
SqlCommand sqlCmd = new SqlCommand();
sqlCmd.CommandText = "SELECT * FROM " + read.GetValue(0) + " with (NOLOCK)";
sqlCmd.Connection = sqlCon;

sqlCmd.Dispose();
using (var CommandText = new SqlCommand("SELECT * FROM " + read.GetValue(0) + " with (NOLOCK)"))
using (var reader = sqlCmd.ExecuteReader())
//using (var outFile = File.CreateText(fileName))
using (StreamWriter outFile = new StreamWriter(File.Open(fileName, FileMode.Create), Encoding.UTF8))
{
string[] columnNames = GetColumnNames(reader).ToArray();
int numFields = columnNames.Length;
outFile.WriteLine(string.Join(",", columnNames));
if (reader.HasRows)
{
while (reader.Read())
{
string[] columnValues =
Enumerable.Range(0, numFields)
.Select(i => get_string( reader.GetValue(i) ))
.Select(field => string.Concat("\"", field.Replace("\"", "\"\""), "\""))
.ToArray();
outFile.WriteLine(string.Join(",", columnValues));
}
}
}

}
sqlCon.Close();
directoryPath = rar_dir;
DirectoryInfo directorySelected = new DirectoryInfo(directoryPath);
Compress(directorySelected);
foreach (var item in filess)
{
if (File.Exists(item))
File.Delete(item);
}

}

public static string get_string( object ss )
{
if (!(ss.ToString().Length > 2))
return ss.ToString();
if (ss.ToString().Substring(0, 2) == "0x")
return System.Text.Encoding.UTF8.GetString((Byte[])ss);
return ss.ToString();
}

public static string Base64Encode(string plainText)
{
var plainTextBytes = System.Text.Encoding.UTF8.GetBytes(plainText);
return System.Convert.ToBase64String(plainTextBytes);
}

static void CreateIfMissing(string path)
{
bool folderExists = Directory.Exists(path);
if (!folderExists)
Directory.CreateDirectory(path);
}

static IEnumerable<string> GetColumnNames(IDataReader reader)
{
foreach (DataRow row in reader.GetSchemaTable().Rows)
{
yield return (string)row["ColumnName"];
}
}

public static void Compress(DirectoryInfo directorySelected)
{
foreach (FileInfo fileToCompress in directorySelected.GetFiles())
{
using (FileStream originalFileStream = fileToCompress.OpenRead())
{
if ((File.GetAttributes(fileToCompress.FullName) & FileAttributes.Hidden) != FileAttributes.Hidden & fileToCompress.Extension != ".gz")
{
using (FileStream compressedFileStream = File.Create(fileToCompress.FullName + ".gz"))
{
using (GZipStream compressionStream = new GZipStream(compressedFileStream,CompressionMode.Compress))
{
originalFileStream.CopyTo(compressionStream);
}
}
//FileInfo info = new FileInfo(directoryPath + "\\" + fileToCompress.Name + ".gz");
//Console.WriteLine("Compressed {0} from {1} to {2} bytes.",fileToCompress.Name, fileToCompress.Length.ToString(), info.Length.ToString());
}
}
}
}
}
}

 

 

 

Linux WGET ile Dosya Çekme

Sistem yedeklemelerinde olduğum NAS ( Network Area Stroage ) mevcuttur. Sistem tarafında, hosting, sunucu gibi yazılım işleri ile koşturan hemen hemen herkes NAS kullanmaktadır. Farklı yedekleme sistemleri de mevcuttur fakat NAS güzeldir. 🙂

NAS üzerinde dosyaları çekmek istediğimize problemler yaşıyorduk. Çünkü bazı klasörlerin içerisinde dosya sayıları fazla olduğu için açılmıyor veya kullanmış olduğumuz FTP programları hataya düşüyordu.

Yapılması gereken ise dosyaları belirli aralıklarla çekip local tarafa aktarmaktı. İnternet üzerinde araştırmalar yaparken stackoverflow’da bulduğum yöntem bizi kurtardı. Biz dosya halinde değil KLASÖR halinde çekmek istediğimizden yöntem hızı gibi yetişti.

Detaya girmeden komutu paylaşacağım. Komut;

wget -r -nH --cut-dirs=5 -nc ftp://user:pass@server//absolute/path/to/directory

Linux üzerinde hangi dizindeyseniz wget komutu oraya çeker.  Kullanım yukarıdaki gibidir.

–cut-dirs=5 –> bu her seferinde 5 işlem yap diyebilmek için. Böylece listeleme ile uğraşmadığından FTP programları gibi patlamıyoruz.

Kaynak yazıya buradan ulaşabilirsiniz..

Ara ara dediğim gibi başka canlar yanmasın.. 🙂

Centos 7 Güncelleme Sırasında İstenmeyen Güncellemeler

Konu başlığı biraz yanlış olmuş olabilir. Şöyle anlatayım; Sanallaştırma ile Linux dağıtımlarından Centos 7 kullanıyoruz. Sunucuya güncelleme geldiği için güncelleyelim dedik fakat öncesinde vmware üzerinden snapshot aldığımız iyi olmuş. Çünkü centos üzerinde freeradius 3.0.4 kullanıyorduk. Repo olarak yüklenmışti. Güncelleme sonrası tabi freeradius da güncellendi. Ne mi oldu ? Neler olmadı ki.. Özelleştirilmiş freeradiusumuz patladı. Patladığı gibi adamlar o kadar güzel değişiklikler yapmışlar ki anlatamam. Sizinde anlayacağınız gibi dağıldık. Neyse ki yedeğimize yani snapshot yedeğimize güvenip hemen geri döndük. Okumaya devam et “Centos 7 Güncelleme Sırasında İstenmeyen Güncellemeler”

Windows ile Web Yedeklemesi Yapmak ve FTP

Bir önceki yazımda Centos Linux MYSQL ve Web Dosyaları Yedekleme işlemlerinden örnek vermiştim. Bu yazımda ise Windows bir sunucu üzerinde web dosyalarımızı nasıl yedekleriz ve FTP olarak farklı bir yedekleme alanına taşımayı örnekleyeceğim. Bu sefer MYSQL yok fakat siz yaparsınız bence 🙂

Yedekleme için önce Windows daki Winrar uygulamasını kullanıp dosyalarımızı sıkıştırıyoruz. Sonrasında ise NCFTP eklentisiyle beraber dosyalarımızı FTP alanımıza taşıyoruz. Windows daki FTP de problem yaşadığım için NCFTP kullanıyorum. Siz farklı FTP çözümleri de kullanabilirsiniz.

@echo off
set path="C:\Program Files\WinRAR\";%path%

# rar.exe yi çalıştırıp yedekleme yapacağımız dosyalarımızı sıkıştırıyoruz.
rar.exe a -r C:\BACKUP\YEDEK-%DATE%.rar C:\wwwroot

# İsterseniz sıkıştırma sırasında istenmeyen dosya uzantılarını belirtebilirsiniz.
# rar.exe a -r -x*.jpg -x*.jpeg -x*.pdf -x*.png -x*.log -x*.rar -x*.ttf -x*.otf -x*.dat C:\BACKUP\YEDEK-%DATE%.rar C:\wwwroot

# NcFTP programı ile birlikte dosyalarımızı FTP yedekleme alanımıza yüklüyoruz..
ncftpput -C -u FTP_KULLANICI_ADI -p FTP_KULLANICI_SIFRESI FTP_ADRESI C:\BACKUP\YEDEK-%DATE%.rar /FTP_DOSYA_YOLU/YEDEK-%DATE%.rar

# Yedek dosyasını siliyoruz.. Bu isteğe bağlıdır. İsterseniz silmeyebilirsiniz.
DEL /F /S /Q /AA C:\BACKUP\YEDEK-%DATE%.rar

Yukarıdaki kod parçasını Windows üzerinde .bat olarak kaydetmeniz gerekir. İsterseniz daha farklı yöntemler kullanıp yedekleme yaptırabilirsiniz. Örnek olarak C#.NET biliyorsanız küçük bir .exe ile de bu işi çözümleyebilirsiniz. Tabi bir de bu küçük kod parçalarını sürekli olarak çalıştırmanız gerekli. Bazı geliştiriciler gördüm her gün kendileri çift tık yapıp yedek almasını bekleyenler var. Fakat önerim Windows Zamanlanmış Görevleri ( Task Scheduler ) kullanmanız daha sağlıklı olacaktır.

Sıkıştırma yaparken neden istenmeyen dosyaları alalım gibi bir düşünce oluşuyorsa kafanız da şöyle bir örnek verebilirim.

Bir projemizde canlı sistem üzerinde geliştirme yaparken yazılım tarafının yedeklerini manuel olarak almak yerine şöyle bir yol izledik. Her gün .jpg, .jpeg, .pdf, .png, .log vs. dosyalarını yedeklemek yerine ( yedekleme diskininin kapasitesini çok fazla kullanıyordu ) bu dosyalar haricindeki dosyaları yedekledik. Bunu isterseniz günlükten saatliğe çekebilirsiniz.

Sonrasında her hafta sonu da haftalık tam yedek yani bütün dosyaları sıkıştırıp yedekleme işlemi yaptık.  Böylece günlük yedeklerin boyutları ile haftalık yedeklerin boyutları birbirinden farklı oldu. Yedekleme diskimiz ne çok fazla tuttu nede zaman kaybı yaşadık.

 

Centos Linux MYSQL ve Web Dosyaları Yedekleme

VPS ( Virtual Private Server | Özel Sanal Sunucu ) kullanıyorsanız üzerinde de Cpanel, WHM, Vesta, Plesk vb. bir yönetim paneli bulunmuyor ise yedekleme işlemleri biraz zor olabilir. Yedekleme yapabilmek için genellikle manuel işlemler mevcut. MYSQL kullandığımızı düşünürsek PHPMyAdmin üzerinden tüm veritabanını indirmek, PHP kullandığımızı da düşünürsek FTP vb. bir bağlantı ile bağlanıp dosyaları maneul olarak yedeklemek uzun bir senaryo.

Peki biz her gece uyurken yedekler otomatik olarak alınsa ? Daha rahat ve güzel olmaz mı ? 🙂 Okumaya devam et “Centos Linux MYSQL ve Web Dosyaları Yedekleme”