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”

C# Oracle Veritabanı Bağlantı Hatası ( TNS:listener was not given the SERVICE_NAME in CONNECT_DATA )

Bir entegrasyon projemizde gittik Oracle’a denk geldik. Onda da hata ile karşılaştık. Yanlış anlaşılmasın denk geldik işte 🙂 Oracle tarafı ile pek bir tecrübem olduğu söylenemez. Fakat Google gibi bir kaynak elimizin altındayken çözümü bulmamak ayıp olurdu.

Alınan hata aşağıdaki gibi bir hatadır.

System.Data.OracleClient.OracleException (0x80131938): ORA-12504: TNS:listener was not given the SERVICE_NAME in CONNECT_DATA

konum: System.Data.OracleClient.OracleException.Check(OciErrorHandle errorHandle, Int32 rc)
konum: System.Data.OracleClient.OracleInternalConnection.OpenOnLocalTransaction(String userName, String password, String serverName, Boolean integratedSecurity, Boolean unicode, Boolean omitOracleConnectionName)
konum: System.Data.OracleClient.OracleInternalConnection..ctor(OracleConnectionString connectionOptions)
konum: System.Data.OracleClient.OracleConnectionFactory.CreateConnection(DbConnectionOptions options, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningObject)
konum: System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnection owningConnection, DbConnectionPool pool, DbConnectionOptions options)
konum: System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject)
konum: System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject)
konum: System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject)
konum: System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)
konum: System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
konum: System.Data.OracleClient.OracleConnection.Open()

Yukarıdaki gibi bir hata alıyorduk. Hatanın ana teması ise “TNS:listener was not given the SERVICE_NAME in CONNECT_DATA” artık bu ne demekse ( ORACLE ile uğraşanlar biliyorlardır diye tahmin ediyorum 🙂 )

Çözümümüz ise Program tarafında SQL Connection için yazılan string içerisine HOST kısmında aşağıdaki cümleciği yazmak oldu.

(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=BAGLANTI_YAPILACAK_SERVER)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=opera)))

BAGLANTI_YAPILACAK_SERVER bilgisi bağlanacak olduğunuz server bilgisidir. localhost, Server’ın kendi hostname’i, IP Adresi gibi bilgiler olmaktadır.

 

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”

CodeIgniter WebServis Veritabanı Hatalarını Yakalamak

Codeigniter ile yürüttüğümüz birkaç web servisimiz mevcut. Bu servislerimiz arka planda olduğu için genellikle veritabanı sorguları ve çalışan sorgulardaki hataları yakalayamıyoruz. Bunun için system/database/DB_driver.php dosyasında birazcık oynayacağız.

display_error fonksiyonunda hataları gösteren yere farklı bir domain/sub domain altındaki servisimize gönderiyoruz. Bu servis üzerinde ise gelen bilgileri alıp Mail olarak yazılım ekibimize gönderiyoruz. Böylece bir hata olduğunda yakalama şansımız yüksek oluyor.

Mail göndermek yerine farklı senaryolarda yapılabilir. Örneğin telegramdan kendinize bildirim gönderebilirsiniz. Başka bir veritabanına hataları yazabilirsiniz. SMS hadi attırabilirsiniz. Monitoring yazılımınız ile entegre edebilirsiniz. Bildirim servisini aktif etmek tamamıyla sizin ihtiyaçlarınıza kalmış bir durum.

Okumaya devam et “CodeIgniter WebServis Veritabanı Hatalarını Yakalamak”

IndexedDb – Dixie.js Nedir – Ön Hazırlık – 1

Yazılım projelerinde veritabanları çok önemlidir. Bunun yanında getirdiği birkaç problem vardır. İlk olarak hız konusu gündemde kalır. Hız önemlidir. Hatta bazen önemini sözlerle bile anlatamayız. Biraz abartı olabilecek belki ama ölüm / kalım meselesi bile olabilir hız konusu.  Neyse..

Bir projemizde ekran üzerinde birçok işlem yapıldıktan sonra düzenleme işlemleri bitip “Kaydet” butonuna tıklanıldığında işlemlerin yapılması gerekiyor. Proje Web üzerinde yürüdüğü için bize gerekenler şunlar;

  • Tarayıcı üzerinde bilgi saklanmalı
  • Javascript olarak üzerinde ekleme, silme, arama işlemleri ( database işlemleri gibi )
  • Tarayıcı kapanırsa açıldığında tekrar kaldığı yerden bilgiler devam etmeli
  • Hızlı ve esnek olmalı
  • Ek olarak bizi yormayacak şekilde olması lazım tabiki 🙂

Araştırmalarım sonucu olarak IndexedDb ile tanışmış olup kullanmaya çalıştım. IndexedDb tarafında sıfırdan kütüphane yazmak yerine de var olan kütüphanelerden Dixie.JS hoşuma gitti ve kullanmaya başladım. Okumaya devam et “IndexedDb – Dixie.js Nedir – Ön Hazırlık – 1”

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());
					}
				}
			}
		}
	}
}

 

 

 

PostgreSQL İle Türkçe Karakter Destekli Veri Tabanı Oluşturma

Son zamanlarda POSTGRESQL ile uğraşmaktayım/ız. Kendi testlerimize göre MySQL’e göre daha hızlı kalan POSTGRESQL bizi cezbetti diyebilirim.

Notlarımın ararsında kalan bir komutu sizinle paylaşmak isterim. Çünkü yaşadığım bir problem. Veritabanı oluştururken Türkçe Karakter destekli olarak oluşturmazsak, SQL sorgularımızda istenmeyen sonuçlar doğurabiliyor. Mesela where, like gibi komutlarda Türkçe karakterleriniz varsa verilerinizde eşleşmiyor olabiliyor. Ek olarak büyük küçük harf durumlarında bayağı problem yaşanıyor.

Aşağıdaki komutla veri tabanı oluştururken Türkçe Karakter destekli olarak çalışabilirsiniz.

CREATE DATABASE TABLO_ADI
WITH 
OWNER = KULLANICI
TEMPLATE = template0
ENCODING = 'UTF8'
LC_COLLATE = 'tr_TR.UTF-8'
LC_CTYPE = 'tr_TR.UTF-8'
TABLESPACE = pg_default
CONNECTION LIMIT = -1;

Centos 7 PHP 7.2 ile MSSQL Server Bağlantısı

Projelerimizde genellikle PHP alt yapısı kullanmaktayız. Projenin bir bölümü MSSQL server ile bağlantılı çalıştığı için Linux web server’lar ile bağlantı yapamıyorduk. Bunun için Windows bir sunucu üzerinden IIS üzerine apache kurulumunu gerçekleştirip, MSSQL server’a bağlantı için PHP ye ait bir  “.dll ” kullanıp bağlantı sağlıyorduk. MSSQL tarafındaki işlemler için Windows sunucuyu web servis olarak kullanıyorduk.

Ne mi oluyordu ? Güzel oluyordu. Çalışıyor muydu ? Evet, çalışıyordu. İstediğimiz performans varmıydı ? Hayır, yoktu. Rahat mıydı ? Bize göre değildi.

4-5 sene içerisinde birkez defa PHP ile MSSQL’e bağlantılar denemiştik. Fakat çoğu kütüphane de BUG‘lar mevcuttu. Bu BUG‘lardan en sevdiğim ise Linux üzerinden MSSQL’e bağlandığınızda Sunucuda ne kadar RAM varsa hepsini kimseyi düşünmeden kendininmiş gibi kullanması. 🙂

Bizde zaman kaybetmemek adına Windows üzerinden web servis yazmaya başlayıp projelerimizi geliştirdik. Hemen hemen her yazılımcının, sistemcinin bir gece ansızın aklına düşen fikirleri, düşünceleri vardır. Benimkisi ise PHP ile MSSQL’e bağlanabilmek. Üstüne çok fazla düşmemiştim açıkcası.

Aradan günler geçti ve PHP’nin 7 sürümünde bazı güncellemeler olduğunu araştırırken bir abimiz PHP 7 ile MSSQL’e bağlandığını yazmış. Döküman ? Malesef. Sadece yazmış. 🙂

Şimdi geçelim Linux Centos 7 üzerinde PHP 7 ile MSSQL’e nasıl bağlantı kuracağımıza. ( Vesta Control Panel üzerinde de gayet güzel çalışmaktadır )

İşlemlerimizi PECL ile yapıyoruz. Komutlar;
# curl https://packages.microsoft.com/config/rhel/7/prod.repo > /etc/yum.repos.d/mssql-release.repo
# yum update
# ACCEPT_EULA=Y yum install -y msodbcsql mssql-tools unixODBC-devel
# pecl install sqlsrv
# pecl install pdo_sqlsrv

PHP.INI dosyamıza aşağıdaki satırları ekleyip güncelliyoruz;
extension=sqlsrv
extension=pdo_sqlsrv

Web engine olarak ne kullanıyorsanız ( Nginx, Apache, PHP-FPM ) restart ediniz.

Bu kadar. Sonrasında ise kullanmış olduğunuz herhangi bir framework varsa direkt olarak database_driver değiştirirerek kullanabilirsiniz. Yok ise şuaradaki doküman işinize yarayabilir..

Karşılaşabileceğiniz hatalar;
# ACCEPT_EULA=Y yum install -y msodbcsql mssql-tools unixODBC-devel
bu satırda hata alırsanız Şuradaki doküman‘a göre Centos üzerinde aşağıdaki işlemleri sırasıyla gerçekleştiriyoruz ( Centos 7 – Redhat ).

sudo su
curl https://packages.microsoft.com/config/rhel/7/prod.repo &amp;amp;amp;amp;amp;amp;amp;gt; /etc/yum.repos.d/mssql-release.repo
exit
sudo yum remove unixODBC-utf16 unixODBC-utf16-devel
sudo ACCEPT_EULA=Y yum install msodbcsql17
sudo ACCEPT_EULA=Y yum install mssql-tools
echo 'export PATH="$PATH:/opt/mssql-tools/bin"' &amp;amp;amp;amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;amp;amp;gt; ~/.bash_profile
echo 'export PATH="$PATH:/opt/mssql-tools/bin"' &amp;amp;amp;amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;amp;amp;gt; ~/.bashrc
source ~/.bashrc
sudo yum install unixODBC-devel

PECL ile ilgili bir hata alırsanız ;
Şuradaki doküman’a göre aşağıdaki işlemleri yapınız.

yum install php-devel
yum provides pecl
yum install php70w-pear
pecl install stats

Kendi tecrübeme göre PHP’nin 7.2 versiyonu daha stabil ve hızlı çalışmakta. 7.2 versiyonu ile birlikte MSSQL’e bağlantılarımız gerçekleşiyor. Hatta Codeigniter framework’ü kullandığımız için Windows üzerindeki projeyi olduğu gibi Linux Centos üzerine aktardığımızda herhangi bir hata vs. almadan ( PHP tarafından ) kullanmaya devam ettik. Fakat sizin projelerinizde farklı veya özel kütüphaneler mevcut ise bunun garantisini veremem. Lütfen aktarım yapmadan önce TEST ortamında kontrol ediniz.

Ufak bir bilgilendirme;
Centos 7 versiyonundan farklı bir versiyonda denemedim. Farklı bir dağıtımda denemedim. Farklı kaynaklar ve kurulum dökümanları mevcut. Aynı zamanda kurulum sırasında UPDATE işlemi mevcut. Linux ( diğerlerinde de mevcut fakat bilen bilir 🙂 ) üzerinde her zaman yapmanız gereken birşey vardır; “Enter’a basmadan önce bir daha düşün” ilkesidir ve herşeyden önce mutalaka YEDEK alınız.

Kaynaklar;

  • https://github.com/Microsoft/msphpsql/issues/726
  • http://fafairuzcode.blogspot.com/2016/08/installing-pecl-on-centos-7.html
  • https://docs.microsoft.com/en-us/sql/connect/odbc/linux-mac/installing-the-microsoft-odbc-driver-for-sql-server?view=sql-server-ver15
  • http://www.shukko.com/x3/2018/12/12/php-ile-mssql-sunucuya-baglanalim/

MYSQL Ufak İpuçları – vol.4

Dördüncü seri olarak birkaç ip ucu ile devam edelim.
Birinci seri için BURADAN ulaşabilirsiniz.
İkinci seri içi BURADAN ulaşabilirsiniz.
Üçüncü seri için BURADAN ulaşabilirsiniz.

Değişik MYSQL ip uçları ve sorguları yazmak hoşunuza gidiyor ise seriyi takip etmenizi öneririm. Çok fazla değişik sayılmazlar, Google’da arama yaparsanız mutlaka karşınıza çıkacaktır.

MYSQL Veritabanımızda hangi tabloda kaç sütun / kolon olduğunu merak ediyorsak ( bunu niye merak ettiysek 😀 ) aşağıdaki komut işimizi görecektir.

SELECT TABLE_NAME TABLO_ADI, Count(*) SUTUN_SAYISI
FROM information_schema.`COLUMNS`
WHERE table_schema = 'VERI_TABANI_ADI'
GROUP BY TABLE_NAME
ORDER BY SUTUN_SAYISI DESC

Bu sorgunun nerede işe yaracağını düşünüyorsanız geliştirmekte olduğunuz sistemde normalizasyon yapmak istediğinize birkaç analiz yapmanız gerekebilir. Bu sorgu onlardan biri.

MYSQL serisi diyip durduk araya biraz MSSQL de serpiştirelim;

MSSQL de Veritabanımızda kaç adet satır var ? :

SELECT sc.name +'.'+ ta.name TABLO_ADI, SUM(pa.rows) SATIR_SAYISI
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
ORDER BY SUM(pa.rows) DESC

 

MSSQL de veritabanımızda toplam kaç adet satır var dersek de tabi ki yukarıdaki sorguyu biraz değiştirip tekrar sorgulatıyoruz 🙂

SELECT SUM(pa.rows) TOPLAM_SATIR
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)
ORDER BY SUM(pa.rows) DESC

 

Bu seriyi daha fazla uzatmadan 2 buçuk örnekle bırakıyorum 🙂

MYSQL Ufak İpuçları – vol.3

Üçüncü seri olarak birkaç ip ucu ile devam edelim.
Birinci seri için BURADAN ulaşabilirsiniz.
İkinci seri içi BURADAN ulaşabilirsiniz.

Nasipse 4. seriyi de yayınlarım yakın bir zamanda 🙂

İlk olarak şöyle bir yapalım. Bir tablomuz var ve diğer bir tabloya aktaracağız. Arayüz kullanırken bu işlemler bir kaç tık yaparak sonuca hızlıca ulaşabiliriz fakat ya arayüzümüz yoksa. ! Çözüm tabi ki var. Komut satırından devam. Arayüz ne yapıyor sanıyorsunuz 🙂

Örnek olarak eski kullanıcı tablosundaki belirli bir sorgunun cevabını yeni bir tabloya aktarmamız gerekiyor;
# INSERT INTO YENI_KULLANICI_TABLOSU ( ADI,SOYADI,MESLEK, ESKI_ID,EMAIL, ADRES ) SELECT ADI,SOYADI,MESLEK, ESKI_ID,EMAIL, ADRES FROM ESKI_KULLANICI_TABLOSU WHERE YAS > 23 AND KAYIT_TARIHI > ‘2018-01-01’  ORDER BY ID DESC LIMIT 1000

Where şartımıza göre yukarıdaki sorgumuz ESKI_KULLANICI_TABLOSU‘dan  YENI_KULLANICI_TABLOSU‘na aktarım yapacaktır. Bu işlemi bir yazılım dili ile de yapabiliriz. Fakat şöyle düşünün; Önce yazılımın çalışacağı PLATFORM’a tüm bilgiyi çekeceğiz ve sonra tekrar geriye INSERT edeceğiz. Bu şekilde daha hızlı olmasını sağlayabilirsiniz. Tabi ki bir veritabanından farklı bir veritabanına aktarım yapmak isterseniz bu sorgu biraz yetersiz gelebilir. 🙂 O zaman kolları sıvayıp bir aktarım / transfer mekanizması yazmanız gerekebilir.

Veritabanınızdaki toplam satır sayısını merak ediyorsanız aşağıdaki sorguyu kullanabilirsiniz.
# SELECT SUM( TABLE_ROWS )
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = ‘VERI_TABANI_ADI‘;

Yine bir merak sorusu ile devam edelim. Merak ettiğimiz ise veritabanımızdaki tabloların MB ( megabayt ) cinsinden boyutlarını sorgulayalım.
# SELECT
table_schema as `Database`,
table_name AS `Table`,
round(((data_length + index_length) / 1024 / 1024), 2) `Size in MB`
FROM information_schema.TABLES
ORDER BY (data_length + index_length) DESC;

Bu sorgular sürekli kullanılan sorgular değildir. Genellikle kriz anlarında yani veritabanı çökmeye yakın anlarında hangi tablo çatlamış, hangi tablo diskte fazla yer kaplıyor, hangi tablo neden bu kadar şişmiş durumlarını kontrol edebilmek içindir. Sorguları genişletip daha farklı sonuçlar alabilirsiniz ve geleceğinizi yakından görüp kriz anlarını öncesinde çözebilirsiniz.

Bir sonraki seride görüşmek üzere. 🙂