Oracle MySQL 5.7, MySQL'in tarihindeki en yüksek başarıma sahip en olgun sürüm olarak öne çıkıyor. Ayrıca Oracle'ın satın almasından sonraki üçüncü sürüm. Bu yazıda Oracle MySQL 5.7'nin Windows 10 ve Red Hat Enterprise Linux 7 kurulumunu ve yapılandırılmasını gerçekleştireceğiz.
1. Kurulum Dosyalarının İndirilmesi
Oracle MySQL Enterprise Edition 5.7 kurulum dosyalarını https://edelivery.oracle.com sitesinden indirebilirsiniz:
edelivery.oracle.com web adresinden Oracle ürünlerini indirebilmek için ücretsiz olarak yaratabileceğiniz bir Oracle hesabına ihtiyacınız bulunuyor. |
Oracle hesabınız ile giriş yapmalısınız. |
Arama için MySQL Enterprise yazmanız yeterli olacaktır. Ardından kurulum yapacağınız platformlarını seçmeniz gerekir. Bu noktada Linux x86-64 ya da Microsoft Windows x64 platformlarını seçiniz. |
İlerlemeden önce doğru ürünü ve platformu seçtiğinizden emin olun. |
Seçtiğiniz ürün ve platformların listesi
|
RHEL 7 için V79254-01.zip dosyasını indirmelisiniz. |
Windows x86 (64-bit) için V790271-01.zip dosyasını indirmelisiniz. |
2. RHEL 7'de Kurulum
Öncelikle başka bir sürümün kurulu olup olmadığını kontrol edelim:
[oracle@server1 ~]$ sudo rpm -qa | egrep -i "(Maria|MySQL|Percona)"
MariaDB-client-10.1.11-1.el7.centos.x86_64
MariaDB-common-10.1.11-1.el7.centos.x86_64
MariaDB-server-10.1.11-1.el7.centos.x86_64
Çalışma yaptığımız makinada MariaDB 10 kuruluymuş. Önce bu kurulumu servisten daha sonra kurulu yazılımlardan kaldıracağız:
[oracle@server1 ~]$ sudo systemctl status mysql
● mariadb.service - MariaDB database server
Loaded: loaded (/usr/lib/systemd/system/mariadb.service; enabled; vendor preset: disabled)
Drop-In: /etc/systemd/system/mariadb.service.d
└─migrated-from-my.cnf-settings.conf
Active: active (running) since Sat 2016-10-01 03:48:55 EEST; 1min 56s ago
Main PID: 1195 (mysqld)
Status: "Taking your SQL requests now..."
CGroup: /system.slice/mariadb.service
└─1195 /usr/sbin/mysqld
[oracle@server1 ~]$ sudo systemctl stop mysql
[oracle@server1 ~]$ sudo systemctl disable mysql
[oracle@server1 ~]$ sudo rpm -e MariaDB-server
[oracle@server1 ~]$ sudo rpm -e MariaDB-client
[oracle@server1 ~]$ sudo rpm -e MariaDB-common
[oracle@server1 ]$ sudo rpm -ivh mysql-commercial-libs-5.7.15-1.1.el7.x86_64.rpm mysql-commercial-common-5.7.15-1.1.el7.x86_64.rpm mysql-commercial-client-5.7.15-1.1.el7.x86_64.rpm mysql-commercial-server-5.7.15-1.1.el7.x86_64.rpm
warning: mysql-commercial-libs-5.7.15-1.1.el7.x86_64.rpm: Header V3 DSA/SHA1 Signature, key ID 5072e1f5: NOKEY
Preparing... ################################# [100%]
Updating / installing...
1:mysql-commercial-common-5.7.15-1.################################# [ 25%]
2:mysql-commercial-libs-5.7.15-1.1.################################# [ 50%]
3:mysql-commercial-client-5.7.15-1.################################# [ 75%]
4:mysql-commercial-server-5.7.15-1.################################# [100%]
[oracle@server1 Downloads]$ sudo systemctl status mysqld
● mysqld.service - MySQL Server
Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
Active: inactive (dead)
Oct 30 14:46:58 server1.example.com systemd[1]: Starting MySQL Server...
Oct 30 14:47:05 server1.example.com systemd[1]: Started MySQL Server.
Oct 30 14:49:31 server1.example.com systemd[1]: Stopping MySQL Server...
Oct 30 14:49:33 server1.example.com systemd[1]: Stopped MySQL Server.
Oct 30 14:51:08 server1.example.com systemd[1]: Stopped MySQL Server.
[oracle@server1 Downloads]$ sudo systemctl start mysqld
[oracle@server1 Downloads]$ sudo systemctl status mysqld
● mysqld.service - MySQL Server
Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
Active: active (running) since Sun 2016-10-30 14:59:18 EET; 5s ago
Process: 3646 ExecStart=/usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid $MYSQLD_OPTS (code=exited, status=0/SUCCESS)
Process: 3518 ExecStartPre=/usr/bin/mysqld_pre_systemd (code=exited, status=0/SUCCESS)
Main PID: 3648 (mysqld)
CGroup: /system.slice/mysqld.service
└─3648 /usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid
Oct 30 14:59:07 server1.example.com systemd[1]: Starting MySQL Server...
Oct 30 14:59:18 server1.example.com systemd[1]: Started MySQL Server.
Kurulum sırasında mysqld sunucusu bir kez başlatıldı. Bu sırada tüm veri dosyalarının saklandığı dizin /var/lib/mysql yaratıldı ve içeriği oluşturuldu:
[oracle@server1 ]$ sudo ls -l /var/lib/mysql
total 122952
-rw-r----- 1 mysql mysql 56 Oct 30 14:59 auto.cnf
-rw------- 1 mysql mysql 1680 Oct 30 14:59 ca-key.pem
-rw-r--r-- 1 mysql mysql 1075 Oct 30 14:59 ca.pem
-rw-r--r-- 1 mysql mysql 1079 Oct 30 14:59 client-cert.pem
-rw------- 1 mysql mysql 1676 Oct 30 14:59 client-key.pem
-rw-r----- 1 mysql mysql 413 Oct 30 14:59 ib_buffer_pool
-rw-r----- 1 mysql mysql 12582912 Oct 30 14:59 ibdata1
-rw-r----- 1 mysql mysql 50331648 Oct 30 14:59 ib_logfile0
-rw-r----- 1 mysql mysql 50331648 Oct 30 14:59 ib_logfile1
-rw-r----- 1 mysql mysql 12582912 Oct 30 14:59 ibtmp1
drwxr-x--- 2 mysql mysql 4096 Oct 30 14:59 mysql
srwxrwxrwx 1 mysql mysql 0 Oct 30 14:59 mysql.sock
-rw------- 1 mysql mysql 5 Oct 30 14:59 mysql.sock.lock
drwxr-x--- 2 mysql mysql 8192 Oct 30 14:59 performance_schema
-rw------- 1 mysql mysql 1680 Oct 30 14:59 private_key.pem
-rw-r--r-- 1 mysql mysql 452 Oct 30 14:59 public_key.pem
-rw-r--r-- 1 mysql mysql 1079 Oct 30 14:59 server-cert.pem
-rw------- 1 mysql mysql 1680 Oct 30 14:59 server-key.pem
drwxr-x--- 2 mysql mysql 8192 Oct 30 14:59 sys
Kurulum sırasında root kullanıcısı ve parolası yaratıldı. Parolayı log dosyasında öğrenebilirsiniz:
[oracle@server1 ]$ sudo cat /var/log/mysqld.log | grep -i generated
2016-10-30T12:59:12.542715Z 1 [Note] A temporary password is generated for root@localhost: w3>w1wPdp*te
İlk olarak bu parolayı değiştirmemiz gerekiyor:
[oracle@server1 ~]$ mysql -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.15-enterprise-commercial-advanced
Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> alter user 'root'@'localhost' identified by 'Secret_1234';
Query OK, 0 rows affected (0.00 sec)
mysql> exit
Bye
[oracle@server1 ~]$ mysql -uroot -pSecret_1234
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.7.15-enterprise-commercial-advanced MySQL Enterprise Server - Advanced Edition (Commercial)
Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
Böylelikle RHEL 7'deki kurulum adımlarını tamamlamış olduk. Şimdi Windows'daki kurulum adımlarına bakalım.
3. Windows İşletim Sisteminde Kurulum
Windows işletim sisteminde kurulumu zip dosyayı açarak ya da MSI (MicroSoft Installer) ile gerçekleştirmek mümkündür. Biz bu yazıda ilk yöntemi tercih edeceğiz ve zip dosyasını c:\opt64\mysql-advanced-5.7.15 dizinine açacağız. zip dosyanın içinde data dizini çıkmıyor. Bu nedenle ilk olarak bu dizinin yaratılması için mysqld komutunu --initialize seçeneği ile çalıştıracağız:
c:\opt64\mysql-advanced-5.7.16\bin> mysqld --console --initialize
2016-10-30T17:11:51.170916Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2016-10-30T17:11:51.170916Z 0 [Warning] 'NO_ZERO_DATE', 'NO_ZERO_IN_DATE' and 'ERROR_FOR_DIVISION_BY_ZERO' sql modes should be used with strict mode. They will be merged with strict mode in a future release.
2016-10-30T17:11:51.170916Z 0 [Warning] 'NO_AUTO_CREATE_USER' sql mode was not set.
2016-10-30T17:11:54.265404Z 0 [Warning] InnoDB: New log files created, LSN=45790
2016-10-30T17:11:54.648213Z 0 [Warning] InnoDB: Creating foreign key constraint system tables.
2016-10-30T17:11:54.749274Z 0 [Warning] No existing UUID has been found, so we assume that this is the first time that this server has been started. Generating a new UUID: f4fe3c16-9ec3-11e6-9fad-1867b0c3fd8e.
2016-10-30T17:11:54.778295Z 0 [Warning] Gtid table is not ready to be used. Table 'mysql.gtid_executed' cannot be opened.
2016-10-30T17:11:58.080426Z 0 [Warning] CA certificate ca.pem is self signed.
2016-10-30T17:11:58.670691Z 1 [Note] A temporary password is generated for root@localhost: n%t?ktkAk7vy
data dizini dışında, root kullanıcısı ve geçici parolası yaratıldı. Şimdi mysql sunucusunu başlatalım:
c:\opt64\mysql-advanced-5.7.15\bin>start mysqld --console
start komutu ile birlikte mysqld prosesi için yeni bir pencere açılacak ve bu pencerede log iletilerini konsoldan okuyabileceksiniz:
start mysqld --console |
Microsoft Windows [Version 10.0.10240]
(c) 2015 Microsoft Corporation. All rights reserved.
C:\WINDOWS\system32>cd c:\opt64\mysql-advanced-5.7.15\bin
c:\opt64\mysql-advanced-5.7.15\bin>mysqld --install mysql-server1
Service successfully installed.
c:\opt64\mysql-advanced-5.7.15\bin>net start mysql-server1
The mysql-server1 service is starting..
The mysql-server1 service was started successfully.
services.msc ekranında mysql-server1 isimli mysqld servisi |
Windows servisinden mysql-server1 isimli servisi kaldırmak hiç zor olmayacaktır:
c:\opt64\mysql-advanced-5.7.15\bin>net stop mysql-server1
The mysql-server1 service is stopping.
The mysql-server1 service was stopped successfully.
c:\opt64\mysql-advanced-5.7.15\bin>mysqld --remove mysql-server1
Service successfully removed.
Sunucuyu başlattıktan sonra ilk işlemimiz root kullanıcısının parolasını değiştirmek olacaktır:
c:\opt64\mysql-advanced-5.7.15\bin>mysql -uroot -p
Enter password: ************
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.15-enterprise-commercial-advanced
Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> alter user 'root'@'localhost' identified by 'Secret_1234';
Query OK, 0 rows affected (0.00 sec)
mysql> exit
Bye
c:\opt64\mysql-advanced-5.7.15\bin>mysql -uroot -pSecret_1234 -e "select 1+1"
mysql: [Warning] Using a password on the command line interface can be insecure.
+-----+
| 1+1 |
+-----+
| 2 |
+-----+
4. MySQL Sunucusunun (mysqld) Yapılandırılması
Kurulumları sorunsuz bir şekilde gerçekleştirdik. Şimdi sırada sunucunun yapılandırılması var. Bu noktada yapacaklarımız işletim sisteminden işletim sistemine pek değişmeyecek adımlardan oluşuyor. Yapılandırma dosyası (my.cnf) Linux sistemlerde genellikle /etc dizininde yer alıyor:
[oracle@server1 ~]$ cd /etc/
[oracle@server1 etc]$ ls my.cnf
my.cnf
Windows sistemlerde özel bir dizin bulunmuyor. Yapılandırma dosyasını (my.ini) genellikle kurulum dizinine yerleştiriyoruz.
Her iki durumda da yapılandırma dosyasının formatı ve içine yazılacaklar değişmeyecektir. Yapılandırma dosyasını hem mysqld hem de mysql ile birlikte gelen istemci yazılımları (mysql, mysqladmin, mysqldump gibi) kullanıyorlar. Her yazılımın yapılandırma dosyasındaki ayarları için bir bölme açıyoruz. mysqld için açtığımız bölme [mysqld] satırı ile başlar ve bir sonraki bölmeye kadar devam eder. Peki, mysqld bölmesine neler yazabiliyoruz? Tüm listeyi alabilmek için aşağıdaki komutu çalıştırmanız gerekir:
mysqladmin -uroot -pSecret_1234 variables
Evet, liste epey kalabalık. Neyse ki bu değişkenlerin hepsinin varsayılan bir değeri bulunuyor. Dolayısı ile mysqld herhangi bir yapılandırma dosyası yokken de çalışacaktır. Ancak bu değişkenlerin varsayılan değerleri genellikle üretim ortamında çalışmaya uygun değildir. Bu nedenle üretim ortamı için bir yapılandırma dosyası oluşturmak uygun olur. Tipik bir yapılandırma dosyasının içinde bulunmasında fayda bulunan ve başarımı önemli ölçüde belirleyen değişkenler aşağıda listelenmiştir:
[mysqld]
basedir = c:/opt64/mysql-advanced-5.7.15
datadir = c:/opt64/mysql-advanced-5.7.15/data
character-set-server = utf8
collation-server = utf8_unicode_ci
connect_timeout = 60000
default-storage-engine = innodb
innodb_buffer_pool_size = 2GB
innodb_file_per_table = 1
innodb_flush_log_at_trx_commit = 1
innodb_flush_method = O_DIRECT
innodb_lock_wait_timeout = 10
innodb_log_buffer_size = 8388608
innodb_log_file_size = 5242880
innodb_max_dirty_pages_pct = 90
innodb_thread_concurrency = 8
max_connect_errors = 20
max_connections = 5000
query_cache_size = 0
query_cache_type = OFF
query_cache_limit = 0
thread_cache_size = 8
transaction_isolation = READ-COMMITTED
innodb_buffer_pool_dump_at_shutdown = ON
innodb_buffer_pool_load_at_startup = ON
lower_case_table_names = 1
innodb_io_capacity = 750
innodb_io_capacity_max = 1000
Değişkenlerin bir kısmını komut satırından canlı olarak değiştirmek mümkündür:
mysql> show global variables like 'innodb_thread%';
+---------------------------+-------+
| Variable_name | Value |
+---------------------------+-------+
| innodb_thread_concurrency | 8 |
| innodb_thread_sleep_delay | 312 |
+---------------------------+-------+
2 rows in set (0.00 sec)
mysql> set global innodb_thread_concurrency=16;
Query OK, 0 rows affected (0.00 sec)
mysql> show global variables like 'innodb_thread%';
+---------------------------+-------+
| Variable_name | Value |
+---------------------------+-------+
| innodb_thread_concurrency | 16 |
| innodb_thread_sleep_delay | 312 |
+---------------------------+-------+
2 rows in set (0.00 sec)
Ancak bu değişikliğin kalıcı olabilmesi için mutlaka yapılandırma dosyasına yazılması gerekir. Bazı değişkenler ise canlı olarak değiştirilemez:
mysql> set innodb_sort_buffer_size= 32m;
ERROR 1238 (HY000): Variable 'innodb_sort_buffer_size' is a read only variable
Bazı değişkenler ise oturum bazlı olarak değiştirilebilir:
mysql> show global variables like 'character%';
+--------------------------+------------------------------------------------+
| Variable_name | Value |
+--------------------------+------------------------------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | c:\opt64\mysql-advanced-5.7.15\share\charsets\ |
+--------------------------+------------------------------------------------+
8 rows in set (0.00 sec)
mysql> show session variables like 'character%';
+--------------------------+------------------------------------------------+
| Variable_name | Value |
+--------------------------+------------------------------------------------+
| character_set_client | utf8 |
| character_set_connection | cp850 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | cp850 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | c:\opt64\mysql-advanced-5.7.15\share\charsets\ |
+--------------------------+------------------------------------------------+
8 rows in set (0.00 sec)
mysql> set session character_set_client='cp850';
Query OK, 0 rows affected (0.00 sec)
mysql> show session variables like 'character%';
+--------------------------+------------------------------------------------+
| Variable_name | Value |
+--------------------------+------------------------------------------------+
| character_set_client | cp850 |
| character_set_connection | cp850 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | cp850 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | c:\opt64\mysql-advanced-5.7.15\share\charsets\ |
+--------------------------+------------------------------------------------+
8 rows in set (0.00 sec)
mysql> show global variables like 'character%';
+--------------------------+------------------------------------------------+
| Variable_name | Value |
+--------------------------+------------------------------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | c:\opt64\mysql-advanced-5.7.15\share\charsets\ |
+--------------------------+------------------------------------------------+
8 rows in set (0.00 sec)
Yukarıdaki örnekte character_set_client değişkenin global değerini değiştirdiğimizde mevcut açık oturumların değerlerini etkilemez. Bundan sonra yeni açılacak oturumlar için karakter kodlamasını 'utf8' tanımlamış oluyoruz. Oturum açıldıktan sonra set session character_set_client = 'cp850' ataması ile oturum için değerini değiştirmek mümkündür. global değişkenleri ancak root ya da yetki verdiği kullanıcı değiştirebilir.
5. Yapılandırılma Dosyasındaki Değişkenlerin Açıklaması
Bu bölümde yapılandırma dosyasında geçen değişkenleri inceleyeceğiz. Bu değişkenlere değer verirken göz önünde bulundurulması gereken noktalara değineceğiz.
datadir
connect_timeout
innodb_thread_concurrency
MySQL sık tekrarlanan SELECT sorgularının başarımını arttırmak amacıyla bir cep bellek kullanır. Bu yapının yapılandırılması ile ilgili üç değişken bulunur:
query_cache_size
query_cache_type
query_cache_limit
Her ne kadar sık tekrarlanan SELECT sorgularının başarımı artsa da yazma başarımı düşecektir. Bu nedenle bu özelliği hemen hemen her zaman kapatırız:
query_cache_size = 0
query_cache_type = OFF
query_cache_limit = 0
innodb_buffer_pool_dump_at_shutdown
4 rows in set (0.00 sec)
performance_schema veritabanı aynı isimli yeni bir Depolama Motoru tarafından yönetiliyor:
[mysqld]
Bu bölümde yapılandırma dosyasında geçen değişkenleri inceleyeceğiz. Bu değişkenlere değer verirken göz önünde bulundurulması gereken noktalara değineceğiz.
datadir
- MySQL sunucus için data dizininin konumunu tanımlar.
- Linux sistemlerde varsayılan değeri /var/lib/mysql'dir.
- varchar, char tipindeki sütunlar için varsayılan karakter kodlamasını tanımlar
- Web programcılığında 'utf8' standart olsa da MySQL'in varsayılan kodlaması 'latin1''dir.
- varchar, char tipindeki alanların varsayılan karşılaştırma işlemini
- character-set-server değişkeninin değeri ile uyumlu olarak seçilmelidir
- 'utf8' için 'utf8_unicode_ci' karşılaştırması kullanılabilir.
- Karşılaştırma algoritmalarının tamamının listesini görmek için show collation komutunu kullanabilirsiniz:
mysql> show collation;
+--------------------------+----------+-----+---------+----------+---------+
| Collation | Charset | Id | Default | Compiled | Sortlen |
+--------------------------+----------+-----+---------+----------+---------+
| big5_chinese_ci | big5 | 1 | Yes | Yes | 1 |
| big5_bin | big5 | 84 | | Yes | 1 |
| dec8_swedish_ci | dec8 | 3 | Yes | Yes | 1 |
| dec8_bin | dec8 | 69 | | Yes | 1 |
| cp850_general_ci | cp850 | 4 | Yes | Yes | 1 |
| cp850_bin | cp850 | 80 | | Yes | 1 |
| hp8_english_ci | hp8 | 6 | Yes | Yes | 1 |
| hp8_bin | hp8 | 72 | | Yes | 1 |
| koi8r_general_ci | koi8r | 7 | Yes | Yes | 1 |
| koi8r_bin | koi8r | 74 | | Yes | 1 |
| latin1_german1_ci | latin1 | 5 | | Yes | 1 |
. . . . . . . . . . . . . . . . . . . . . . . . .
| gb18030_chinese_ci | gb18030 | 248 | Yes | Yes | 2 |
| gb18030_bin | gb18030 | 249 | | Yes | 1 |
| gb18030_unicode_520_ci | gb18030 | 250 | | Yes | 8 |
+--------------------------+----------+-----+---------+----------+---------+
222 rows in set (0.01 sec)
connect_timeout
- mysqld prosesinin bir bağlantı kurulurken el sıkışma protokolü için gönderilen paketi hatalı kabul etmesi için zaman aşımını tanımlar.
- Varsayılan değeri 10'dur.
- Yavaş istemciler ya da yüklü sunucular için zaman aşım değeri arttırılabilir.
- MySQL veritabanında verileri gerçekte saklayan ve SQL sorgularını çalıştıran bileşenler saklama motorlarıdır.
- MySQL 5.6 ile birlikte InnoDB saklama motoru varsayılan motordur.
- InnoDB saklama motoru veri ile indeksleri beraberce dosyada saklar.
- InnoDB varsayılan adı ibdata1.ibd olan global bir dosya bulundurur.
- Bu dosyada, tüm InnoDB saklama motoru tarafından yönetilen tablo bilgileri yer alır.
- Tabloların verileri bu global dosyada saklanabileceği gibi, her tablo için tablo adıyla aynı isimli ve ibd uzantılı bir dosyada da saklanabilir.
- innodb_file_per_table=0 ise tabloların verileri ortak global dosyada saklanır.
- innodb_file_per_table=1 ise tabloların verileri ayrı dosyalarda saklanır. Yönetimsel olarak innodb_file_per_table=1 seçiminin bazı kazanımları bulunduğu için sıklıkla bu değeri tercih ediyoruz.
- InnoDB verileri kalıcı olarak dosyalarda saklasa da erişim başarımı için bellekte organize eder. Bellekte ne kadar çok veri ve indeks yer alırsa başarım o kadar yüksek olur.
- InnoDB'nin bellek organizasyonu için ne kadar bellek alanı kullanacağını innodb_buffer_pool_size değişkeni ile kontrol ediyoruz.
- Fiziksel belleğin %80'nini InnoDB'ye ayırmak genel bir pratiktir. Buna göre 64GB fiziksel bellekli bir makinada innodb_buffer_pool_size=52g olarak ayarlanabilir.
- InnoDB saklama motoru gelen çok sayıda isteği karşılamak için iplik (=thread) kullanır. Bu iplikler çok çekirdekli bir sistemde gerçekten paralel olarak çalışabilirler. Ancak veriye erişirken tek bir bellek havuzunun (buffer pool) kullanımı, iplikler arasındaki eş zamanlı erişimden kaynaklanan bir dar boğaza neden olur. Bu dar boğazı azaltmanın yolu, birden fazla sayıda havuz kullanmaktır.
- Eğer innodb_buffer_pool_size değişkenin değeri 1G'dan büyükse çekirdek sayısı kadar ayrı havuz oluşturmanız uygun olur.
- innodb_flush_log_at_trx_commit=1
- Varsayılan değeri budur. ACID uyumluluğu için 1 seçilmelidir. Her hareket sonrasında innodb log buffer'daki INSERT/UPDATE/DELETE cümleleri innodb log dosyasına kaydedilir. Herhangi bir kesintide veri kaybı yaşanmaz. Buna karşılık yavaştır.
- innodb_flush_log_at_trx_commit=0
- Yaklaşık saniyede bir innodb log buffer'daki INSERT/UPDATE/DELETE cümleleri innodb log dosyasına kaydedilir. Herhangi bir kesintide son bir saniyeye kadar veri kaybı yaşanabilir. MySQL 5.6.6'dan itibaren bu süreyi innodb_flush_log_at_timeout değişkeni ile kontrol edebiliyoruz.
- innodb_flush_log_at_trx_commit=2
innodb_log_file_size
- Her hareket sonrasında innodb log buffer'daki INSERT/UPDATE/DELETE cümleleri işletim sisteminin IO buffer'ına kaydedilir. Sadece işletim sisteminin çökmesi nedeni ile veri kaybı yaşanır.
- InnoDB, her hareket sonrasında innodb log buffer'daki INSERT/UPDATE/DELETE cümleleri innodb log dosyasına kaydeder. InnoDB log dosyasında INSERT/UPDATE/DELETE cümleleri yer alır. Değişikliğe uğrayan kayıtlar ise bellekte yer almaya devam eder. innodb_log_file_size bu log dosyasının boyunu tanımlar. Log dosyası dolduğunda, bellekte değişikliğe uğrayan kayıtlar diske kaydedilir.
- innodb_log_file_size değeri küçük seçilirse kısa sürede dolacağı için değişen kayıtları sık diske yazmak gerekeceği için başarım düşer.
- innodb_log_file_size değeri büyük seçilirse herhangi bir kesinti durumunda, açılışta InnoDB'nin kendini onarma süresi uzayacaktır.
- tipik olarak bir saatlik değişikliği saklayabilecek kadar büyüklükte seçilmesi uygun olur.
- InnoDB bir hareket içindeki tüm değişikliklere neden olan INSERT/UPDATE/DELETE cümlelerini önce bellekte saklar. Bu alanın boyunu innodb_log_buffer_size değişkeni kontrol eder. Hareketi oluşturan cümleler kalabalık ise bu alanı doldurmamak ve diske gitme ihtiyacı duymamak için boyunu yeterince büyük vermek gerekir. InnoDB'nin log dosyasına yazmaları kuyruğa girmeye başlamışsa değerini arttırmak uygun olur.
- Kuyruğun boyunu aşağıdaki komutla öğrenebilirsiniz:
mysql> show global status like 'Innodb_log_wa%';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| Innodb_log_waits | 0 |
+------------------+-------+
1 row in set (0.07 sec)
innodb_thread_concurrency
- InnoDB'nin sorgu işlemleri için kullandığı iplik (=thread) sayısı için bir üst sınır tanımlar. Bu sınıra erişildiğinde istekler İlk Giren İlk Çıkar prensibine göre çalışan bir kuyrukta sıraya girerler.
- Çekirdek sayısının iki katı (sanal işlemci sayısı) verilebilir.
- MySQL her bağlantı için bir iplik yaratır. Bağlantı kapatıldığında iplik çöpe atılmaz ve iplik havuzunda saklanır. Havuzun kapasitesi thread_cache_size değişkeni ile kontrol edilebilir. Varsayılan değeri -1'dir ve dinamik olarak MySQL tarafından yönetilir: 8 + (max_connections/100)
innodb_read_io_threads
innodb_write_io_threads
Sorgu Cep Belleğiinnodb_write_io_threads
- InnoDB saklama motorunun, okuma ve yazma için paralelde kaç iplik kullanması Varsayılan değerleri 4'dür.
- Yazma yoğun bir sistemde innodb_write_io_threads sayısı arttırılabilir.
- Maksimum 64 verilebilir.
- RAID depolama kullanan sistemlerde değerini arttırmak uygun olur.
MySQL sık tekrarlanan SELECT sorgularının başarımını arttırmak amacıyla bir cep bellek kullanır. Bu yapının yapılandırılması ile ilgili üç değişken bulunur:
query_cache_size
query_cache_type
query_cache_limit
Her ne kadar sık tekrarlanan SELECT sorgularının başarımı artsa da yazma başarımı düşecektir. Bu nedenle bu özelliği hemen hemen her zaman kapatırız:
query_cache_size = 0
query_cache_type = OFF
query_cache_limit = 0
innodb_buffer_pool_dump_at_shutdown
- InnoDB yüksek başarım için sık erişilen veri ve indekslerini bellek havuzunda organize eder. Veri tabanı sunucusu açıldıktan bir süre sonra uygulamaların en çok eriştiği veriler havuzda yerini alır.
- innodb_buffer_pool_dump_at_shutdown değişkeni ON değerine çekildiğinde, sunucu kapatılırken havuzdaki verilerin indeksleri diske kaydeder. Veriler değil indeksleri kaydedildiği için bu işlem hızlıdır. Sunucunun kapanma süresine etkisi gözardı edilebilir.
- innodb_buffer_pool_dump_at_startup değişkeni ON değerine çekildiğinde, sunucu açılırken, sık başvurulan verileri diskten havuza getirir. Dolayısı ile uygulamalar daha veriyi istemeden, havuzda hazır bulur.
- Bu özellik uzun dönemde veri tabanının başarımına herhangi bir katkısı yoktur.
lower_case_table_names
- MySQL, her tablo için tablonun saklama motorundan bağımsız olarak, tablo bilgilerinin sakladığı frm uzantılı bir dosya oluşturur. Bunun dışında her tablo için ayrıca her saklama motorunun kendisinin yönettiği dosyalar bulunur. Örneğin MyISAM saklama motoru, veriler için myd uzantılı ve indeksleri için ise myi uzantılı dosyalar oluşturur. InnoDB ise global bir dosya uzayı oluşturur. InnoDB'nin yönetimindeki tabloların meta bilgileri bu global dosya uzayında saklanır. Ayrıca innodb_file_per_table = 1 seçili ise her tablo için ibd uzantılı bir dosya oluşturur. innodb_file_per_table = 0 seçili ise tüm tabloların verileri ortak tek bir dosya uzayında saklanır.
- SQL sorgusu yazılırken tablo isimlerinin küçük ya da büyük harf olmasının bir önemi bulunmaz. Ancak iş MySQL'in bu dosyalara erişimi söz konusu olduğunda ise alttaki dosya sisteminin küçük-büyük harf ayırımına duyarlı olup olmaması önem kazanır. Windows işletim sistemi, küçük-büyük harf ayırımına duyarlı değilken, Unix işletim sistemi ise duyarlıdır. Bu nedenle MySQL ile Unix işletim sisteminde çalışırken bu duruma dikkat etmek gerekir ve SQL cümleleri yazarken tablo adı dosya sistemindeki adını takip etmelidir.
- Yukarıdaki durum özellikle MySQL'in data dizini Windows işletim sisteminden Unix işletim sistemine taşınırken soruna neden olur.
- Bu sorunlardan lower_case_table_names değişkeninin değeri 1 seçilerek kurtulunabilir. Bu durumda tablolar dosya sisteminde her zaman küçük harf ile gösterilecektir ve SQL cümlelerinde tablo isimleri küçük harf olarak işleme sokulacaktır.
- InnoDB yüksek başarım için verileri bellekte organize ettiğini yukarıda konuşmuştuk. InnoDB kayıtlardaki değişiklikleri de yine yüksek başarım için doğrudan bellekte gerçekleştirir ve bu değişiklikler kalıcı hale geldiğinde ise hemen diske kaydetmez. Kalıcı değişiklikleri yine yukarıda konuştuğumuz gibi log dosyasına yazar. Log dosyası dolduğunda (boyutu innodb_log_file_size değişkeni ile kontrol edilir) ya da bellek havuzunda değişikliğe uğramış verilerin havuza kapasitesine oranı innodb_buffer_pool_dump_pct değişkeninin değerini aştığında, diske kaydeder. Diske kaydederken yoğun bir giriş çıkış işlemi gerçekleşir. Bu sırada MySQL sunucusunun başka işler için de giriş çıkış ihtiyacı bulunur. İşte, innodb_io_capacity değişkeni, InnoDB'nin bu sıkışıklıkta giriş çıkış kapasitesinin ne kadarını, bellekteki değişikliğe uğramış kayıtları diske kaydetmek için kullanacağını kontrol eder.
- Disk sisteminin saniyede başarabileceği en yüksek giriş çıkış değerini vermek uygun olur.
6. MySQL'in İzlenmesi
MySQL'in davranışını ve performansını izlemek için MySQL 5.5 ile gelen performance_schema veritabanını kullanabilirsiniz. show databases komutu çalıştırıldığında, performance_schema isimli veritabanını listede görebilirsiniz:
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| performance_schema |
MySQL'in davranışını ve performansını izlemek için MySQL 5.5 ile gelen performance_schema veritabanını kullanabilirsiniz. show databases komutu çalıştırıldığında, performance_schema isimli veritabanını listede görebilirsiniz:
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| performance_schema |
| sys |
+--------------------+4 rows in set (0.00 sec)
performance_schema veritabanı aynı isimli yeni bir Depolama Motoru tarafından yönetiliyor:
mysql> select engine,support,transactions,xa,savepoints
-> from information_schema.engines;
+--------------------+---------+--------------+------+------------+
| engine | support | transactions | xa | savepoints |
+--------------------+---------+--------------+------+------------+
| InnoDB | DEFAULT | YES | YES | YES |
| MRG_MYISAM | YES | NO | NO | NO |
| MEMORY | YES | NO | NO | NO |
| BLACKHOLE | YES | NO | NO | NO |
| MyISAM | YES | NO | NO | NO |
| CSV | YES | NO | NO | NO |
| ARCHIVE | YES | NO | NO | NO |
| PERFORMANCE_SCHEMA | YES | NO | NO | NO |
| FEDERATED | NO | NULL | NULL | NULL |
+--------------------+---------+--------------+------+------------+
9 rows in set (0.00 sec)
performance_schema içindeki tablolarda, veritabanında gerçekleşen olaylar ile ilgili bilgiler saklanıyor:
mysql> show tables from performance_schema;
+------------------------------------------------------+
| Tables_in_performance_schema |
+------------------------------------------------------+
| accounts |
| cond_instances |
| events_stages_current |
| events_stages_history |
| events_stages_history_long |
| events_stages_summary_by_account_by_event_name |
| events_stages_summary_by_host_by_event_name |
| events_stages_summary_by_thread_by_event_name |
| events_stages_summary_by_user_by_event_name |
| events_stages_summary_global_by_event_name |
| events_statements_current |
| events_statements_history |
| events_statements_history_long |
| events_statements_summary_by_account_by_event_name |
| events_statements_summary_by_digest |
| events_statements_summary_by_host_by_event_name |
| events_statements_summary_by_program |
| events_statements_summary_by_thread_by_event_name |
| events_statements_summary_by_user_by_event_name |
| events_statements_summary_global_by_event_name |
| events_transactions_current |
| events_transactions_history |
| events_transactions_history_long |
| events_transactions_summary_by_account_by_event_name |
| events_transactions_summary_by_host_by_event_name |
| events_transactions_summary_by_thread_by_event_name |
| events_transactions_summary_by_user_by_event_name |
| events_transactions_summary_global_by_event_name |
| events_waits_current |
| events_waits_history |
| events_waits_history_long |
| events_waits_summary_by_account_by_event_name |
| events_waits_summary_by_host_by_event_name |
| events_waits_summary_by_instance |
| events_waits_summary_by_thread_by_event_name |
| events_waits_summary_by_user_by_event_name |
| events_waits_summary_global_by_event_name |
| file_instances |
| file_summary_by_event_name |
| file_summary_by_instance |
| global_status |
| global_variables |
| host_cache |
| hosts |
| memory_summary_by_account_by_event_name |
| memory_summary_by_host_by_event_name |
| memory_summary_by_thread_by_event_name |
| memory_summary_by_user_by_event_name |
| memory_summary_global_by_event_name |
| metadata_locks |
| mutex_instances |
| objects_summary_global_by_type |
| performance_timers |
| prepared_statements_instances |
| replication_applier_configuration |
| replication_applier_status |
| replication_applier_status_by_coordinator |
| replication_applier_status_by_worker |
| replication_connection_configuration |
| replication_connection_status |
| replication_group_member_stats |
| replication_group_members |
| rwlock_instances |
| session_account_connect_attrs |
| session_connect_attrs |
| session_status |
| session_variables |
| setup_actors |
| setup_consumers |
| setup_instruments |
| setup_objects |
| setup_timers |
| socket_instances |
| socket_summary_by_event_name |
| socket_summary_by_instance |
| status_by_account |
| status_by_host |
| status_by_thread |
| status_by_user |
| table_handles |
| table_io_waits_summary_by_index_usage |
| table_io_waits_summary_by_table |
| table_lock_waits_summary_by_table |
| threads |
| user_variables_by_thread |
| users |
| variables_by_thread |
+------------------------------------------------------+
87 rows in set (0.01 sec)
MySQL'i ne kadar detaylı olarak izlemek istediğinizin seçimini performance_schema veritabanındaki setup_consumers tablosundan yapabilirsiniz:
mysql> select * from performance_schema.setup_consumers;
+----------------------------------+---------+
| NAME | ENABLED |
+----------------------------------+---------+
| events_stages_current | NO |
| events_stages_history | NO |
| events_stages_history_long | NO |
| events_statements_current | YES |
| events_statements_history | YES |
| events_statements_history_long | NO |
| events_transactions_current | NO |
| events_transactions_history | NO |
| events_transactions_history_long | NO |
| events_waits_current | NO |
| events_waits_history | NO |
| events_waits_history_long | NO |
| global_instrumentation | YES |
| thread_instrumentation | YES |
| statements_digest | YES |
+----------------------------------+---------+
15 rows in set (0.00 sec)
mysql> update performance_schema.setup_consumers set ENABLED=TRUE where name='events_stages_current';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> update performance_schema.setup_consumers set ENABLED=TRUE where name='events_waits_current';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> update performance_schema.setup_consumers set ENABLED=TRUE where name='events_stages_history';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> update performance_schema.setup_consumers set ENABLED=TRUE where name='events_waits_history';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> update performance_schema.setup_consumers set ENABLED=TRUE where name='events_transactions_current';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> update performance_schema.setup_consumers set ENABLED=TRUE where name='events_transactions_history';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from performance_schema.setup_consumers;
+----------------------------------+---------+
| NAME | ENABLED |
+----------------------------------+---------+
| events_stages_current | YES |
| events_stages_history | YES |
| events_stages_history_long | NO |
| events_statements_current | YES |
| events_statements_history | YES |
| events_statements_history_long | NO |
| events_transactions_current | YES |
| events_transactions_history | YES |
| events_transactions_history_long | NO |
| events_waits_current | YES |
| events_waits_history | YES |
| events_waits_history_long | NO |
| global_instrumentation | YES |
| thread_instrumentation | YES |
| statements_digest | YES |
+----------------------------------+---------+
15 rows in set (0.00 sec)
performance_schema'nın yapılandırılması ve tablolarından bilgi çıkarması biraz zordur. Yapılandırmak istediğinizde 40 kadar değişken karşımıza çıkıyor:
mysql> show global variables like '%performance%';
+----------------------------------------------------------+-------+
| Variable_name | Value |
+----------------------------------------------------------+-------+
| performance_schema | ON |
| performance_schema_accounts_size | -1 |
| performance_schema_digests_size | 10000 |
| performance_schema_events_stages_history_long_size | 10000 |
| performance_schema_events_stages_history_size | 10 |
| performance_schema_events_statements_history_long_size | 10000 |
| performance_schema_events_statements_history_size | 10 |
| performance_schema_events_transactions_history_long_size | 10000 |
| performance_schema_events_transactions_history_size | 10 |
| performance_schema_events_waits_history_long_size | 10000 |
| performance_schema_events_waits_history_size | 10 |
| performance_schema_hosts_size | -1 |
| performance_schema_max_cond_classes | 80 |
| performance_schema_max_cond_instances | -1 |
| performance_schema_max_digest_length | 1024 |
| performance_schema_max_file_classes | 80 |
| performance_schema_max_file_handles | 32768 |
| performance_schema_max_file_instances | -1 |
| performance_schema_max_index_stat | -1 |
| performance_schema_max_memory_classes | 320 |
| performance_schema_max_metadata_locks | -1 |
| performance_schema_max_mutex_classes | 200 |
| performance_schema_max_mutex_instances | -1 |
| performance_schema_max_prepared_statements_instances | -1 |
| performance_schema_max_program_instances | -1 |
| performance_schema_max_rwlock_classes | 40 |
| performance_schema_max_rwlock_instances | -1 |
| performance_schema_max_socket_classes | 10 |
| performance_schema_max_socket_instances | -1 |
| performance_schema_max_sql_text_length | 1024 |
| performance_schema_max_stage_classes | 150 |
| performance_schema_max_statement_classes | 193 |
| performance_schema_max_statement_stack | 10 |
| performance_schema_max_table_handles | -1 |
| performance_schema_max_table_instances | -1 |
| performance_schema_max_table_lock_stat | -1 |
| performance_schema_max_thread_classes | 50 |
| performance_schema_max_thread_instances | -1 |
| performance_schema_session_connect_attrs_size | 512 |
| performance_schema_setup_actors_size | -1 |
| performance_schema_setup_objects_size | -1 |
| performance_schema_users_size | -1 |
+----------------------------------------------------------+-------+
42 rows in set (0.01 sec)
Tablolardan bilgi çıkarmak istediğinizde ise karşınıza 87 tablo çıkıyor. Bu tablolardan bilgi çekmek için tabloların işlevlerine ve yapısına hakim olmanız gerekiyor. Neyse ki sys veritabanı bize sıklıkla ihtiyaç duyduğumuz bilgileri derleyip toparlayıp önümüze sunuyor:
mysql> show full tables from sys;
+-----------------------------------------------+------------+
| Tables_in_sys | Table_type |
+-----------------------------------------------+------------+
| host_summary | VIEW |
| host_summary_by_file_io | VIEW |
| host_summary_by_file_io_type | VIEW |
| host_summary_by_stages | VIEW |
| host_summary_by_statement_latency | VIEW |
| host_summary_by_statement_type | VIEW |
| innodb_buffer_stats_by_schema | VIEW |
| innodb_buffer_stats_by_table | VIEW |
| innodb_lock_waits | VIEW |
| io_by_thread_by_latency | VIEW |
| io_global_by_file_by_bytes | VIEW |
| io_global_by_file_by_latency | VIEW |
| io_global_by_wait_by_bytes | VIEW |
| io_global_by_wait_by_latency | VIEW |
| latest_file_io | VIEW |
| memory_by_host_by_current_bytes | VIEW |
| memory_by_thread_by_current_bytes | VIEW |
| memory_by_user_by_current_bytes | VIEW |
| memory_global_by_current_bytes | VIEW |
| memory_global_total | VIEW |
| metrics | VIEW |
| processlist | VIEW |
| ps_check_lost_instrumentation | VIEW |
| schema_auto_increment_columns | VIEW |
| schema_index_statistics | VIEW |
| schema_object_overview | VIEW |
| schema_redundant_indexes | VIEW |
| schema_table_lock_waits | VIEW |
| schema_table_statistics | VIEW |
| schema_table_statistics_with_buffer | VIEW |
| schema_tables_with_full_table_scans | VIEW |
| schema_unused_indexes | VIEW |
| session | VIEW |
| session_ssl_status | VIEW |
| statement_analysis | VIEW |
| statements_with_errors_or_warnings | VIEW |
| statements_with_full_table_scans | VIEW |
| statements_with_runtimes_in_95th_percentile | VIEW |
| statements_with_sorting | VIEW |
| statements_with_temp_tables | VIEW |
| sys_config | BASE TABLE |
| user_summary | VIEW |
| user_summary_by_file_io | VIEW |
| user_summary_by_file_io_type | VIEW |
| user_summary_by_stages | VIEW |
| user_summary_by_statement_latency | VIEW |
| user_summary_by_statement_type | VIEW |
| version | VIEW |
| wait_classes_global_by_avg_latency | VIEW |
| wait_classes_global_by_latency | VIEW |
| waits_by_host_by_latency | VIEW |
| waits_by_user_by_latency | VIEW |
| waits_global_by_latency | VIEW |
| x$host_summary | VIEW |
| x$host_summary_by_file_io | VIEW |
| x$host_summary_by_file_io_type | VIEW |
| x$host_summary_by_stages | VIEW |
| x$host_summary_by_statement_latency | VIEW |
| x$host_summary_by_statement_type | VIEW |
| x$innodb_buffer_stats_by_schema | VIEW |
| x$innodb_buffer_stats_by_table | VIEW |
| x$innodb_lock_waits | VIEW |
| x$io_by_thread_by_latency | VIEW |
| x$io_global_by_file_by_bytes | VIEW |
| x$io_global_by_file_by_latency | VIEW |
| x$io_global_by_wait_by_bytes | VIEW |
| x$io_global_by_wait_by_latency | VIEW |
| x$latest_file_io | VIEW |
| x$memory_by_host_by_current_bytes | VIEW |
| x$memory_by_thread_by_current_bytes | VIEW |
| x$memory_by_user_by_current_bytes | VIEW |
| x$memory_global_by_current_bytes | VIEW |
| x$memory_global_total | VIEW |
| x$processlist | VIEW |
| x$ps_digest_95th_percentile_by_avg_us | VIEW |
| x$ps_digest_avg_latency_distribution | VIEW |
| x$ps_schema_table_statistics_io | VIEW |
| x$schema_flattened_keys | VIEW |
| x$schema_index_statistics | VIEW |
| x$schema_table_lock_waits | VIEW |
| x$schema_table_statistics | VIEW |
| x$schema_table_statistics_with_buffer | VIEW |
| x$schema_tables_with_full_table_scans | VIEW |
| x$session | VIEW |
| x$statement_analysis | VIEW |
| x$statements_with_errors_or_warnings | VIEW |
| x$statements_with_full_table_scans | VIEW |
| x$statements_with_runtimes_in_95th_percentile | VIEW |
| x$statements_with_sorting | VIEW |
| x$statements_with_temp_tables | VIEW |
| x$user_summary | VIEW |
| x$user_summary_by_file_io | VIEW |
| x$user_summary_by_file_io_type | VIEW |
| x$user_summary_by_stages | VIEW |
| x$user_summary_by_statement_latency | VIEW |
| x$user_summary_by_statement_type | VIEW |
| x$wait_classes_global_by_avg_latency | VIEW |
| x$wait_classes_global_by_latency | VIEW |
| x$waits_by_host_by_latency | VIEW |
| x$waits_by_user_by_latency | VIEW |
| x$waits_global_by_latency | VIEW |
+-----------------------------------------------+------------+
101 rows in set (0.02 sec)
Yukarıda gördüğünüz tablolar hepsi birer görüntü olarak tanımlanmış tablolar ve bize epey zengin bir bilgi sunabiliyorlar:
mysql> select * from sys.user_summary_by_file_io;
+------------+-------+------------+
| user | ios | io_latency |
+------------+-------+------------+
| root | 33616 | 2.17 s |
| background | 1459 | 30.36 ms |
+------------+-------+------------+
2 rows in set (0.00 sec)
mysql> select * from sys.host_summary\G
*************************** 1. row ***************************
host: localhost
statements: 15944
statement_latency: 22.89 s
statement_avg_latency: 1.44 ms
table_scans: 13556
file_ios: 33618
file_io_latency: 2.17 s
current_connections: 1
total_connections: 192
unique_users: 1
current_memory: 0 bytes
total_memory_allocated: 0 bytes
1 row in set (0.01 sec)
mysql> select * from sys.x$statement_analysis limit 1\G
*************************** 1. row ***************************
query: SELECT `samples0_` . `test_result_id` AS `test_res1_8_0_` , `
samples0_` . `samples_id` AS `samples_2_8_0_` , `testsample1_` . `id` AS `id1_10
_1_` , `testsample1_` . `all_threads` AS `all_thre2_10_1_` , `testsample1_` . `b
ytes` AS `bytes3_10_1_` , `testsample1_` . `data_type` AS `data_typ4_10_1_` , `t
estsample1_` . `elapsed` AS `elapsed5_10_1_` , `testsample1_` . `failure_message
` AS `failure_6_10_1_` , `testsample1_` . `grp_threads` AS `grp_thre7_10_1_` , `
testsample1_` . `idle_time` AS `idle_tim8_10_1_` , `testsample1_` . `label` AS `
label9_10_1_` , `testsample1_` . `labeled_request` AS `labeled10_10_1_` , `tests
ample1_` . `latency` AS `latency11_10_1_` , `testsample1_` . `line` AS `line12_1
0_1_` , `testsample1_` . `response_code` AS `respons13_10_1_` , `testsample1_` .
`response_message` AS `respons14_10_1_` , `testsample1_` . `start_time` AS `sta
rt_t15_10_1_` , `testsample1_` . `success` AS `success16_10_1_` , `testsample1_`
. `thread_name` AS `thread_17_10_1_` ,
db: ptaas
full_scan:
exec_count: 164
err_count: 0
warn_count: 0
total_latency: 7332579783560
max_latency: 1923749737950
avg_latency: 44710822300
lock_latency: 39028000000
rows_sent: 383468
rows_sent_avg: 2338
rows_examined: 766936
rows_examined_avg: 4676
rows_affected: 0
rows_affected_avg: 0
tmp_tables: 0
tmp_disk_tables: 0
rows_sorted: 0
sort_merge_passes: 0
digest: 919a8ed50fac9fc42b79d9614a1eef85
first_seen: 2016-11-02 13:52:28
last_seen: 2016-11-02 13:52:57
1 row in set (0.00 sec)
Bunun dışında başarım olarak sorunlu SQL cümlelerini, hatalı tablo tasarımlarını ve indeks problemlerini izlemek için geleneksel olarak kullandığımız MySQL'in log mekanizmaları bulunuyor:
mysql> show global variables like '%performance%';
+----------------------------------------------------------+-------+
| Variable_name | Value |
+----------------------------------------------------------+-------+
| performance_schema | ON |
| performance_schema_accounts_size | -1 |
| performance_schema_digests_size | 10000 |
| performance_schema_events_stages_history_long_size | 10000 |
| performance_schema_events_stages_history_size | 10 |
| performance_schema_events_statements_history_long_size | 10000 |
| performance_schema_events_statements_history_size | 10 |
| performance_schema_events_transactions_history_long_size | 10000 |
| performance_schema_events_transactions_history_size | 10 |
| performance_schema_events_waits_history_long_size | 10000 |
| performance_schema_events_waits_history_size | 10 |
| performance_schema_hosts_size | -1 |
| performance_schema_max_cond_classes | 80 |
| performance_schema_max_cond_instances | -1 |
| performance_schema_max_digest_length | 1024 |
| performance_schema_max_file_classes | 80 |
| performance_schema_max_file_handles | 32768 |
| performance_schema_max_file_instances | -1 |
| performance_schema_max_index_stat | -1 |
| performance_schema_max_memory_classes | 320 |
| performance_schema_max_metadata_locks | -1 |
| performance_schema_max_mutex_classes | 200 |
| performance_schema_max_mutex_instances | -1 |
| performance_schema_max_prepared_statements_instances | -1 |
| performance_schema_max_program_instances | -1 |
| performance_schema_max_rwlock_classes | 40 |
| performance_schema_max_rwlock_instances | -1 |
| performance_schema_max_socket_classes | 10 |
| performance_schema_max_socket_instances | -1 |
| performance_schema_max_sql_text_length | 1024 |
| performance_schema_max_stage_classes | 150 |
| performance_schema_max_statement_classes | 193 |
| performance_schema_max_statement_stack | 10 |
| performance_schema_max_table_handles | -1 |
| performance_schema_max_table_instances | -1 |
| performance_schema_max_table_lock_stat | -1 |
| performance_schema_max_thread_classes | 50 |
| performance_schema_max_thread_instances | -1 |
| performance_schema_session_connect_attrs_size | 512 |
| performance_schema_setup_actors_size | -1 |
| performance_schema_setup_objects_size | -1 |
| performance_schema_users_size | -1 |
+----------------------------------------------------------+-------+
42 rows in set (0.01 sec)
Tablolardan bilgi çıkarmak istediğinizde ise karşınıza 87 tablo çıkıyor. Bu tablolardan bilgi çekmek için tabloların işlevlerine ve yapısına hakim olmanız gerekiyor. Neyse ki sys veritabanı bize sıklıkla ihtiyaç duyduğumuz bilgileri derleyip toparlayıp önümüze sunuyor:
mysql> show full tables from sys;
+-----------------------------------------------+------------+
| Tables_in_sys | Table_type |
+-----------------------------------------------+------------+
| host_summary | VIEW |
| host_summary_by_file_io | VIEW |
| host_summary_by_file_io_type | VIEW |
| host_summary_by_stages | VIEW |
| host_summary_by_statement_latency | VIEW |
| host_summary_by_statement_type | VIEW |
| innodb_buffer_stats_by_schema | VIEW |
| innodb_buffer_stats_by_table | VIEW |
| innodb_lock_waits | VIEW |
| io_by_thread_by_latency | VIEW |
| io_global_by_file_by_bytes | VIEW |
| io_global_by_file_by_latency | VIEW |
| io_global_by_wait_by_bytes | VIEW |
| io_global_by_wait_by_latency | VIEW |
| latest_file_io | VIEW |
| memory_by_host_by_current_bytes | VIEW |
| memory_by_thread_by_current_bytes | VIEW |
| memory_by_user_by_current_bytes | VIEW |
| memory_global_by_current_bytes | VIEW |
| memory_global_total | VIEW |
| metrics | VIEW |
| processlist | VIEW |
| ps_check_lost_instrumentation | VIEW |
| schema_auto_increment_columns | VIEW |
| schema_index_statistics | VIEW |
| schema_object_overview | VIEW |
| schema_redundant_indexes | VIEW |
| schema_table_lock_waits | VIEW |
| schema_table_statistics | VIEW |
| schema_table_statistics_with_buffer | VIEW |
| schema_tables_with_full_table_scans | VIEW |
| schema_unused_indexes | VIEW |
| session | VIEW |
| session_ssl_status | VIEW |
| statement_analysis | VIEW |
| statements_with_errors_or_warnings | VIEW |
| statements_with_full_table_scans | VIEW |
| statements_with_runtimes_in_95th_percentile | VIEW |
| statements_with_sorting | VIEW |
| statements_with_temp_tables | VIEW |
| sys_config | BASE TABLE |
| user_summary | VIEW |
| user_summary_by_file_io | VIEW |
| user_summary_by_file_io_type | VIEW |
| user_summary_by_stages | VIEW |
| user_summary_by_statement_latency | VIEW |
| user_summary_by_statement_type | VIEW |
| version | VIEW |
| wait_classes_global_by_avg_latency | VIEW |
| wait_classes_global_by_latency | VIEW |
| waits_by_host_by_latency | VIEW |
| waits_by_user_by_latency | VIEW |
| waits_global_by_latency | VIEW |
| x$host_summary | VIEW |
| x$host_summary_by_file_io | VIEW |
| x$host_summary_by_file_io_type | VIEW |
| x$host_summary_by_stages | VIEW |
| x$host_summary_by_statement_latency | VIEW |
| x$host_summary_by_statement_type | VIEW |
| x$innodb_buffer_stats_by_schema | VIEW |
| x$innodb_buffer_stats_by_table | VIEW |
| x$innodb_lock_waits | VIEW |
| x$io_by_thread_by_latency | VIEW |
| x$io_global_by_file_by_bytes | VIEW |
| x$io_global_by_file_by_latency | VIEW |
| x$io_global_by_wait_by_bytes | VIEW |
| x$io_global_by_wait_by_latency | VIEW |
| x$latest_file_io | VIEW |
| x$memory_by_host_by_current_bytes | VIEW |
| x$memory_by_thread_by_current_bytes | VIEW |
| x$memory_by_user_by_current_bytes | VIEW |
| x$memory_global_by_current_bytes | VIEW |
| x$memory_global_total | VIEW |
| x$processlist | VIEW |
| x$ps_digest_95th_percentile_by_avg_us | VIEW |
| x$ps_digest_avg_latency_distribution | VIEW |
| x$ps_schema_table_statistics_io | VIEW |
| x$schema_flattened_keys | VIEW |
| x$schema_index_statistics | VIEW |
| x$schema_table_lock_waits | VIEW |
| x$schema_table_statistics | VIEW |
| x$schema_table_statistics_with_buffer | VIEW |
| x$schema_tables_with_full_table_scans | VIEW |
| x$session | VIEW |
| x$statement_analysis | VIEW |
| x$statements_with_errors_or_warnings | VIEW |
| x$statements_with_full_table_scans | VIEW |
| x$statements_with_runtimes_in_95th_percentile | VIEW |
| x$statements_with_sorting | VIEW |
| x$statements_with_temp_tables | VIEW |
| x$user_summary | VIEW |
| x$user_summary_by_file_io | VIEW |
| x$user_summary_by_file_io_type | VIEW |
| x$user_summary_by_stages | VIEW |
| x$user_summary_by_statement_latency | VIEW |
| x$user_summary_by_statement_type | VIEW |
| x$wait_classes_global_by_avg_latency | VIEW |
| x$wait_classes_global_by_latency | VIEW |
| x$waits_by_host_by_latency | VIEW |
| x$waits_by_user_by_latency | VIEW |
| x$waits_global_by_latency | VIEW |
+-----------------------------------------------+------------+
101 rows in set (0.02 sec)
Yukarıda gördüğünüz tablolar hepsi birer görüntü olarak tanımlanmış tablolar ve bize epey zengin bir bilgi sunabiliyorlar:
mysql> select * from sys.user_summary_by_file_io;
+------------+-------+------------+
| user | ios | io_latency |
+------------+-------+------------+
| root | 33616 | 2.17 s |
| background | 1459 | 30.36 ms |
+------------+-------+------------+
2 rows in set (0.00 sec)
mysql> select * from sys.host_summary\G
*************************** 1. row ***************************
host: localhost
statements: 15944
statement_latency: 22.89 s
statement_avg_latency: 1.44 ms
table_scans: 13556
file_ios: 33618
file_io_latency: 2.17 s
current_connections: 1
total_connections: 192
unique_users: 1
current_memory: 0 bytes
total_memory_allocated: 0 bytes
1 row in set (0.01 sec)
mysql> select * from sys.x$statement_analysis limit 1\G
*************************** 1. row ***************************
query: SELECT `samples0_` . `test_result_id` AS `test_res1_8_0_` , `
samples0_` . `samples_id` AS `samples_2_8_0_` , `testsample1_` . `id` AS `id1_10
_1_` , `testsample1_` . `all_threads` AS `all_thre2_10_1_` , `testsample1_` . `b
ytes` AS `bytes3_10_1_` , `testsample1_` . `data_type` AS `data_typ4_10_1_` , `t
estsample1_` . `elapsed` AS `elapsed5_10_1_` , `testsample1_` . `failure_message
` AS `failure_6_10_1_` , `testsample1_` . `grp_threads` AS `grp_thre7_10_1_` , `
testsample1_` . `idle_time` AS `idle_tim8_10_1_` , `testsample1_` . `label` AS `
label9_10_1_` , `testsample1_` . `labeled_request` AS `labeled10_10_1_` , `tests
ample1_` . `latency` AS `latency11_10_1_` , `testsample1_` . `line` AS `line12_1
0_1_` , `testsample1_` . `response_code` AS `respons13_10_1_` , `testsample1_` .
`response_message` AS `respons14_10_1_` , `testsample1_` . `start_time` AS `sta
rt_t15_10_1_` , `testsample1_` . `success` AS `success16_10_1_` , `testsample1_`
. `thread_name` AS `thread_17_10_1_` ,
db: ptaas
full_scan:
exec_count: 164
err_count: 0
warn_count: 0
total_latency: 7332579783560
max_latency: 1923749737950
avg_latency: 44710822300
lock_latency: 39028000000
rows_sent: 383468
rows_sent_avg: 2338
rows_examined: 766936
rows_examined_avg: 4676
rows_affected: 0
rows_affected_avg: 0
tmp_tables: 0
tmp_disk_tables: 0
rows_sorted: 0
sort_merge_passes: 0
digest: 919a8ed50fac9fc42b79d9614a1eef85
first_seen: 2016-11-02 13:52:28
last_seen: 2016-11-02 13:52:57
1 row in set (0.00 sec)
Bunun dışında başarım olarak sorunlu SQL cümlelerini, hatalı tablo tasarımlarını ve indeks problemlerini izlemek için geleneksel olarak kullandığımız MySQL'in log mekanizmaları bulunuyor:
- General log: Her türlü çalıştırılan SQL cümleleri general log dosyasına atılır.
- Slow query log: Yavaş çalıştırılan SQL cümleleri, çalıştırma sırasında zamanını nerede geçirdiğini ve sorgu maliyetini bir slow query log dosyasına yazılır. Yavaşlığın süresini long-query-time değişkeni ile tanımlıyoruz: Varsayılan değeri 10 saniyedir.
Bu loglamaları açmak için yapılandırma dosyasına aşağıdaki tanımlamaları yapmak gerekir:
# monitoring options
slow-query-log
log_queries_not_using_indexes
long-query-time = 1
general-log
slow-query-log
log_queries_not_using_indexes
long-query-time = 1
general-log
Bu loglamaları açmanın üretim ortamındaki bir sunucu için önemli bir yük getireceğini ve başarımı etkileyeceğini unutmayın ve dikkatli kullanın.