MySQL

Giriş

MySQL, yaygın olarak popüler LAMP (Linux, Apache, MySQL, PHP/Python/Perl) yığınının bir parçası olarak kurulan açık kaynaklı bir veritabanı yönetim sistemidir. İlişkisel modeli uygular ve verilerini yönetmek için Structured Query Language (SQL olarak daha iyi bilinir) kullanır.

Bu blog yazımız, Ubuntu 20.04 sunucusuna MySQL sürüm 8.0’ın nasıl yükleneceğini ele alacaktır. Bunu tamamlayarak, bir sonraki web sitenizi veya uygulamanızı oluşturmak için kullanabileceğiniz çalışan bir ilişkisel veritabanına sahip olacaksınız.

Ön Gereksinimler

Bu yazıyı takip etmek için aşağıdakilere ihtiyacınız olacak:

1. Adım – MySQL Kurulumu

Ubuntu 20.04’te MySQL’i APT paket deposunu kullanarak kurabilirsiniz. Bu yazının yazıldığı sırada, varsayılan Ubuntu deposunda bulunan MySQL sürümü 8.0.28 sürümüdür.

Yüklemek için, yakın zamanda yapmadıysanız sunucunuzdaki paket dizinini güncelleyin:

sudo apt update

Daha sonra mysql-server paketini kurun:

sudo apt install mysql-server

MySQL’i kuracak, ancak sizden bir parola belirlemenizi veya başka herhangi bir yapılandırma değişikliği yapmanızı istemeyecektir. Bu, MySQL kurulumunuzu güvensiz bıraktığından, bundan sonra buna değineceğiz.

2. Adım – MySQL Konfigürasyonu

MySQL’in yeni kurulumları için DBMS’nin içerdiği güvenlik komut dosyasını çalıştırmak isteyeceksiniz. Bu komut dosyası, uzak root oturum açmaları ve örnek kullanıcılar gibi şeyler için daha az güvenli varsayılan seçeneklerden bazılarını değiştirir.

Güvenli kurulum scriptini sudo ile çalıştırın:

sudo mysql_secure_installation

Bu sizi MySQL kurulumunuzun güvenlik seçeneklerinde bazı değişiklikler yapabileceğiniz bir dizi istemden geçirecektir. İlk istem, yeni MySQL kullanıcılarının geçerli sayılmadan önce parola gücünü test etmek için kullanılabilecek Parola Doğrulama Eklentisini kurmak isteyip istemediğinizi soracaktır.

Parola Doğrulama Eklentisini kurmayı seçerseniz, oluşturduğunuz ve parolayla kimlik doğrulaması yapan herhangi bir MySQL kullanıcısının, seçtiğiniz politikayı karşılayan bir parolaya sahip olması gerekir. 2  girerek seçebileceğiniz en güçlü politika düzeyi, şifrelerin en az sekiz karakter uzunluğunda olmasını ve büyük harf, küçük harf, sayısal ve özel karakterlerin bir karışımını içermesini gerektirir:

OutputSecuring the MySQL server deployment.

Connecting to MySQL using a blank password.

VALIDATE PASSWORD COMPONENT can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD component?

Press y|Y for Yes, any other key for No: Y

There are three levels of password validation policy:

LOW    Length >= 8
MEDIUM Length >= 8, numeric, mixed case, and special characters
STRONG Length >= 8, numeric, mixed case, special characters and dictionary                  file

Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG:
 2

Validate Password Plugin’i kurmayı seçip seçmediğinize bakılmaksızın, sonraki istem MySQL root kullanıcısı için bir şifre belirlemek olacaktır. Seçtiğiniz güvenli bir şifreyi girin ve ardından onaylayın:

OutputPlease set the password for root here.

New password: 

Re-enter new password: 

root MySQL kullanıcısı için bir şifre ayarlamış olsanız bile, bu kullanıcının şu anda MySQL kabuğuna bağlanırken bir şifre ile kimlik doğrulaması yapacak şekilde yapılandırılmadığını unutmayın.

Parola Doğrulama Eklentisini kullandıysanız, yeni parolanızın gücü hakkında geri bildirim alırsınız. Ardından komut dosyası, yeni girdiğiniz şifre ile devam etmek isteyip istemediğinizi veya yeni bir şifre girmek isteyip istemediğinizi soracaktır. Az önce girdiğiniz şifrenin gücünden memnun olduğunuzu varsayarak komut dosyasına devam etmek için Y yazın:

OutputEstimated strength of the password: 100 
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : Y

Buradan, sonraki tüm sorular için varsayılanları kabul etmek için Y’ye ve ardından ENTER’a basabilirsiniz. Bu, bazı anonim kullanıcıları ve test veritabanını kaldıracak, uzak root oturum açmalarını devre dışı bırakacak ve MySQL’in yaptığınız değişikliklere hemen uyması için bu yeni kuralları yükleyecektir.

Komut dosyası tamamlandığında, MySQL kurulumunuz güvence altına alınacaktır. Artık MySQL istemcisi ile özel bir veritabanı kullanıcısı oluşturmaya geçebilirsiniz.

3. Adım – Bağımsız MySQL kullanıcısı oluşturma ve yetkiler verme

Yüklemenin ardından MySQL, veritabanınızı yönetmek için kullanabileceğiniz bir root kullanıcı hesabı oluşturur. Bu kullanıcının MySQL sunucusu üzerinde tam ayrıcalıkları vardır, yani her veritabanı, tablo, kullanıcı vb. üzerinde tam kontrole sahiptir. Bu nedenle, bu hesabı idari işlevlerin dışında kullanmaktan kaçınmak en iyisidir. Bu adım, yeni bir kullanıcı hesabı oluşturmak ve ona ayrıcalıklar vermek için root MySQL kullanıcısının nasıl kullanılacağını açıklar.

MySQL 5.7 (ve sonraki sürümleri) çalıştıran Ubuntu sistemlerinde, root MySQL kullanıcısı, bir şifre yerine varsayılan olarak auth_socket eklentisini kullanarak kimlik doğrulaması yapacak şekilde ayarlanmıştır. Bu eklenti, MySQL istemcisini çağıran işletim sistemi kullanıcısının adının, komutta belirtilen MySQL kullanıcısının adıyla eşleşmesini gerektirir; bu nedenle, root MySQL kullanıcısına erişmek için sudo ayrıcalıklarıyla mysql’yi çağırmanız gerekir:

sudo mysql

Not: MySQL’i başka bir eğiticiyle yüklediyseniz ve root için şifre kimlik doğrulamasını etkinleştirdiyseniz MySQL kabuğuna erişmek için farklı bir komut kullanmanız gerekir. Aşağıdakiler MySQL istemcinizi normal kullanıcı ayrıcalıklarıyla çalıştıracak ve yalnızca kimlik doğrulaması yaparak veritabanı içinde yönetici ayrıcalıkları kazanacaksınız:

mysql -u root -p

MySQL istemine erişiminiz olduğunda, CREATE USER ifadesiyle yeni bir kullanıcı oluşturabilirsiniz. Bunlar şu genel sözdizimini takip eder:

CREATE USER 'username'@'host' IDENTIFIED WITH authentication_plugin BY 'password';

CREATE USER‘dan sonra bir kullanıcı adı belirlersiniz. Bunu hemen bir @ işareti ve ardından bu kullanıcının bağlanacağı ana bilgisayar adı izler. Bu kullanıcıya yalnızca yerel olarak Ubuntu sunucunuzdan erişmeyi planlıyorsanız, localhost‘u belirtebilirsiniz. Hem kullanıcı adını hem de ana bilgisayarı tek tırnak içine almak her zaman gerekli değildir, ancak bunu yapmak hataları önlemeye yardımcı olabilir.

Kullanıcınızın kimlik doğrulama eklentisini seçme konusunda birkaç seçeneğiniz vardır. Daha önce bahsedilen auth_socket eklentisi, geçerli kullanıcıların veritabanına erişmek için bir şifre girmesini gerektirmeden güçlü bir güvenlik sağladığı için kullanışlı olabilir. Ancak, harici programların MySQL ile etkileşime girmesi gerektiğinde işleri karmaşıklaştırabilecek uzak bağlantıları da önler.

Alternatif olarak, kullanıcının MySQL’in varsayılan eklentisi caching_sha2_password ile kimlik doğrulaması yapması için sözdiziminin WITH kimlik doğrulama eklentisi bölümünü tamamen dışarıda bırakabilirsiniz. Güçlü güvenlik özellikleri nedeniyle şifre ile giriş yapmak isteyen kullanıcılar için MySQL dökümantasyonu bu plugini öneriyor.

caching_sha2_password ile kimlik doğrulaması yapan bir kullanıcı oluşturmak için aşağıdaki komutu çalıştırın. Sammy’yi tercih ettiğiniz kullanıcı adı ve şifreyi ise seçtiğiniz güçlü bir şifreyle değiştirdiğinizden emin olun:

CREATE USER 'narweb'@'localhost' IDENTIFIED BY 'password';

Not: PHP’nin bazı sürümlerinde caching_sha2_password ile ilgili sorunlara neden olan bilinen bir sorun vardır. Bu veritabanını bir PHP uygulamasıyla (örneğin, phpMyAdmin) kullanmayı planlıyorsanız, bunun yerine daha eski, ancak yine de güvenli olan mysql_native_password eklentisiyle kimlik doğrulaması yapacak bir kullanıcı oluşturmak isteyebilirsiniz:

CREATE USER 'narweb'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';

Emin değilseniz, her zaman caching_sha2_plugin ile kimliği doğrulayan bir kullanıcı oluşturabilir ve daha sonra bu komutla ALTER kullanabilirsiniz:

ALTER USER 'narweb'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';

Yeni kullanıcınızı oluşturduktan sonra onlara uygun ayrıcalıkları verebilirsiniz. Kullanıcı ayrıcalıkları vermek için genel sözdizimi aşağıdaki gibidir:

GRANT PRIVILEGE ON database.table TO 'username'@'host';

Bu örnek sözdizimindeki PRIVILEGE değeri, kullanıcının belirtilen veritabanı ve tabloda hangi eylemleri gerçekleştirmesine izin verildiğini tanımlar. Her birini virgülle ayırarak aynı kullanıcıya tek komutta birden çok ayrıcalık verebilirsiniz. Ayrıca veritabanı ve tablo adları yerine yıldız (*) girerek bir kullanıcıya global olarak ayrıcalıklar verebilirsiniz. SQL’de yıldız işaretleri, “tüm” veritabanlarını veya tabloları temsil etmek için kullanılan özel karakterlerdir.

Örnek olarak, aşağıdaki komut bir kullanıcıya CREATE, ALTER ve DROP veritabanları, tablolar ve kullanıcılar için genel ayrıcalıkların yanı sıra sunucudaki herhangi bir tablodan EKLEME, GÜNCELLEME ve SİLME yetkisi verir. Ayrıca, kullanıcıya SELECT ile verileri sorgulama, REFERENCES anahtar kelimesiyle yabancı anahtarlar oluşturma ve RELOAD ayrıcalığıyla FLUSH işlemleri gerçekleştirme olanağı verir. Ancak, kullanıcılara yalnızca ihtiyaç duydukları izinleri vermelisiniz, bu nedenle kendi kullanıcı ayrıcalıklarınızı gerektiği gibi ayarlamaktan çekinmeyin.

Mevcut ayrıcalıkların tam listesini şurada bulabilirsiniz: resmi MySQL belgeleri.

kullanıcınıza şu ayrıcalıkları vermek için narweb kullanıcı adını kendi MySQL kullanıcı adınızla değiştirerek bu GRANT ifadesini çalıştırın:

GRANT CREATE, ALTER, DROP, INSERT, UPDATE, DELETE, SELECT, REFERENCES, RELOAD on *.* TO 'narweb'@'localhost' WITH GRANT OPTION;

Bu beyanın ayrıca  GRANT SEÇENEĞİYLE içerdiğini unutmayın. Bu, MySQL kullanıcınızın sahip olduğu her şeyi sistemdeki diğer kullanıcılara vermesini sağlar.

Uyarı: Bazı kullanıcılar MySQL kullanıcılarına, root kullanıcının ayrıcalıklarına benzer geniş süper kullanıcı ayrıcalıkları sağlayacak ALL PRIVIEGES ayrıcalığını vermek isteyebilir, örneğin:

GRANT ALL PRIVILEGES ON *.* TO 'narweb'@'localhost' WITH GRANT OPTION;

Bu MySQL kullanıcısına erişimi olan herkes sunucudaki her veritabanı üzerinde tam kontrole sahip olacağından, bu tür geniş ayrıcalıklar kolayca verilmemelidir.

Bunu takiben, FLUSH PRIVILEGES komutunu çalıştırmak iyi bir uygulamadır. Bu, önceki CREATE USER ve GRANT ifadelerinin bir sonucu olarak sunucunun önbelleğe aldığı tüm belleği boşaltacaktır:

FLUSH PRIVILEGES;

Ardından MySQL istemcisinden çıkabilirsiniz:

exit

Gelecekte, yeni MySQL kullanıcınız olarak oturum açmak için aşağıdaki gibi bir komut kullanacaksınız:

mysql -u sammy -p

-p bayrağı, MySQL istemcisinin kimlik doğrulaması için sizden MySQL kullanıcınızın şifresini istemesine neden olur.

Son olarak MySQL kurulumunu test edelim.

4. Adım – MySQL kurulumunu test etmek

Nasıl yüklediğinize bakılmaksızın, MySQL otomatik olarak çalışmaya başlamış olmalıdır. Bunu test etmek için durumunu kontrol edin.

systemctl status mysql.service

Aşağıdakine benzer bir çıktı göreceksiniz:

Output● mysql.service - MySQL Community Server
     Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled)
     Active: active (running) since Tue 2020-04-21 12:56:48 UTC; 6min ago
   Main PID: 10382 (mysqld)
     Status: "Server is operational"
      Tasks: 39 (limit: 1137)
     Memory: 370.0M
     CGroup: /system.slice/mysql.service
             └─10382 /usr/sbin/mysqld

MySQL çalışmıyorsa, sudo systemctl start mysql ile başlatabilirsiniz.

Ek bir kontrol için, yönetici komutlarını çalıştırmanıza izin veren bir istemci olan mysqladmin aracını kullanarak veritabanına bağlanmayı deneyebilirsiniz. Örneğin, bu komut, narweb (-u narweb) adlı bir MySQL kullanıcısı olarak bağlan, bir şifre sor (-p) ve sürümü döndür diyor. Narweb’e özel MySQL kullanıcınızın adıyla değiştirdiğinizden emin olun ve istendiğinde o kullanıcının şifresini girin:

sudo mysqladmin -p -u narweb version

Şuna benzer bir çıktı görmelisiniz:

Outputmysqladmin  Ver 8.0.19-0ubuntu5 for Linux on x86_64 ((Ubuntu))
Copyright (c) 2000, 2020, 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.

Server version      8.0.19-0ubuntu5
Protocol version    10
Connection      Localhost via UNIX socket
UNIX socket     /var/run/mysqld/mysqld.sock
Uptime:         10 min 44 sec

Threads: 2  Questions: 25  Slow queries: 0  Opens: 149  Flush tables: 3  Open tables: 69  Queries per second avg: 0.038

Bu, MySQL’in çalışır durumda olduğu anlamına gelir.

Bitirirken

Artık sunucunuzda kurulu temel bir MySQL kurulumuna sahipsiniz. İlginizi çekebilecek diğer yazılarımız: