Jak zmienić hasło root w MySQL w systemie Linux?

Ten artykuł dotyczy zmiany hasła dla użytkownika root oraz innych użytkowników w bazie MySQL.
Artykuł jest uniwersalny i dotyczy większości systemów operacyjnych (Windows: Windows XP, Windows 7, Windows 98, …; Linux: Debian, Ubuntu, Mandriva, Knoppix, PLD, …).

MySQL to najpopularniejsza baza danych w ostatnich czasach. Dlatego niezmiernie ważną rzeczą jest ustawienie hasła dla użytkowników systemowych tej bazy danych. Najważniejszym użytkownikiem jest oczywiście root – to konto głównego administratora bazy.
Bezpośrednio po instalacji serwera MySQL, hasło użytkownika root jest puste.
Oznacza to, że dosłownie każdy kto ma ochotę, może zalogować się na to konto. A jakie mogą być tego konsekwencje, każdy może sobie wyobrazić.

Dlatego hasło dla root’a powinno zostać ustanowione od razu po instalacji serwera MySQL.

Jak ustanowić hasło dla root’a i innych użytkowników bazy MySQL

Aby ustawić hasło root’a, po uruchomieniu serwera MySQL, powinniśmy wpisać w konsoli następujące polecenie:
$ mysqladmin -u root password HASLO_DO_MYSQL_DLA_ROOT

Ustanownienie hasła dla każdego innego użytkownika odbywa się w taki sam sposób czyli:
$ mysqladmin -u USER_NAME password HASLO_DO_MYSQL_DLA_USER_NAME

Pamiętajmy aby przeładować uprawnienia:
$ mysqladmin -u root -p flush-privileges

Należy pamiętać, iż powyższą konstrukację (mysqladmin -u USER password PASSWORD) używamy tylko i wyłącznie aby ustanowić hasło! Czyli tylko wtedy gdy użytkownik posiada hasło puste.
Przy próbie “zmiany” hasła dostaniemy komunikat:

mysqladmin : connect to server at 'localhost' failed
error: 'Access denied for user 'root'@'localhost' (using password: NO)'

Jak zmienić hasło dla root i innych użytkowników bazy MySQL

Aby zmienić hasło dla naszego super użytkownika (root) w bazie MySQL wydajemy polecenie w konsoli
$ mysqladmin -u root -p password NOWE_HASLO_DO_MYSQL
Enter password: (system prosi nas o potwierdzenie) – potwierdzamy wpisując stare hasło dla użytkownika

Dla normalnego użytkownika użytkownika polecenie wygląda tak samo (zastępujemy root na nazwę użytkownika).
$ mysqladmin -u user -p password NOWE_HASLO_DO_MYSQL

Przeładowujemy uprawnienia:
$ mysqladmin -u root -p flush-privileges

Zmiana hasła dla root bezpośrednio w bazie.
Poniżej przedstawię inny przykład zmiany hasła dla root oraz innych użytkowników bazy MySQL.
Poniższe czynności możemy wykonać na kilka sposobów:
- logując się z konsoli do bazy MySQL
- logując się do bazy za pośrednictwem phpMyAdmina
- generując odpowiedni kod php i wykonując odpowiednie zapytania SQL do bazy

1. Za pomocą konsoli logujemy się do serwera MySQL
$ mysql -u root -p

2. Przełączamy się na bazę danych MySQL
mysql> use mysql;

3. Wykonujemy update (zmieniamy hasło dla użytkownika root)
mysql> UPDATE User SET password=PASSWORD(‘nowe_haslo_dla_root’) WHERE User=’root’;
Query OK, 4 rows affected (0.00 sec)
Rows matched: 4 Changed: 4 Warnings: 0
Jak widać hasło zostało zmienione w 4 rekordach (liczba rekordów u Ciebie może być inna)

4. Aktualizujemy informacje o uprawnieniach (przeładowujemy uprawnienia do bazy)
mysql> flush privileges;

5. Opuszczamy bazę MySQL
mysql> quit;

I co?
Wystarczyła chwila i mamy porządnie zabezpieczoną bazę danych, a przynajmniej dostanie się do niej wymaga podania hasła.
Bo jak wiadomo jeżeli ktoś ma fizyczny dostęp do serwera MySQL to nawet hasło root’a nie uchroni naszych danych przed nieuprawnionym dostępem.
Ale o tym w innym artykule na temat bezpieczeństwa naszych danych w bazie MySQL.

Posted in Bezpieczeństwo, Linux, MySQL | Tagged , , , , , , , | Leave a comment

MySQL. PACK_KEYS

PACK_KEYS – to opcja tabeli, wykorzystywana w MySQL przy wykonywaniu instrukcji CREATE TABLE. Informuje MySQLa czy mają być pakowane klucze (indeksy).

MySQL aktualnie umożliwia ustawienie opcji PACK_KEYS w trzech wartościach:
DEFAULT – powoduje, że pakowane są tylko klucze dla długich kolumn typu CHAR, VARCHAR.
1 – Wartość 1 włącza pakowanie indeksów, przez co pliki indeksowe będą mniejsze. To na ogół zwalnia zapis do tabeli. Pakowane są zarówno indeksy numeryczne jak i znakowe.
0 – Wartość 0 wyłącza pakowanie wszystkich kluczy indeksowych.

Posted in MySQL | Tagged , , , | Leave a comment

MySQL. CREATE INDEX

Instrukcja: CREATE INDEX

Polecenie CREATE INDEX jest zamapowane jako polecenie ALTER TABLE tworzące indeks.

CREATE [UNIQUE | FULLTEXT] INDEX nazwa_indeksu
ON nazwa_tabeli
(nazwa_kolumny[(długość)],…)

Zazwyczaj, wszystkie indeksy dla danej tabeli tworzy się w czasie tworzenia samej tabeli poleceniem CREATE TABLE.
CREATE INDEX pozwala na dodawanie indeksów do już istniejących tabel.

CREATE INDEX nowy_index ON tabela (kolumna1) – Tworzy index jednokolumnowy, oparty o kolumnę o nazwie kolumna1.
CREATE INDEX nowy_index ON tabela (kolumna1,kolumna2,kolumna3,…) – Tworzy index wielokolumnowy, oparty o wszystkie kolumny wymienione w nawiasie. wartości indeksu tworzone są przez łączenie wartości podanych kolumn.

Dla kolumn typu tekstowego: CHAR i VARCHAR, indeksy mogą być tworzone tylko przez wykorzystanie do tego celu części kolumny, używając składni:
CREATE INDEX nazwa_indeksu (nazwa_kolumny[(długość)],…)
W przypadku kolumn typu BLOB i TEXT argument długość jest wymagany.

Przykład:
CREATE INDEX index_miasto ON tabela(miasto(7));
Ponieważ większość nazw miejscowości różni się na pierwszych 7 znakach, indeks taki nie powinien być dużo wolniejszy niż indeks utworzony z całej kolumny miasto. Niemniej jednak trzeba odpowiednio dobrać argument długość, gdyż często zaledwie jeden znak więcej, a może znacznie przyśpieszyć działanie bazy.
Z drugiej strony, stosowanie indeksów opartych na części kolumny powoduje tworzenie mniejszych plików indeksów. A mniejszy plik to mniejsza baza i więcej na dysku. Poza tym zapis mniejszego indeksu może znacząco przyspieszyć wykonywanie operacji INSERT.

Indeksy FULLTEXT mogą indeksować tylko kolumny typu VARCHAR lub TEXT i do tego tylko w tabelach typu MyISAM.

Posted in MySQL | Tagged , , , , | Leave a comment

MySQL. CREATE DATABASE

Instrukcja: CREATE DATABASE

CREATE DATABASE [IF NOT EXISTS] nazwa_bazy
- Instrukcja CREATE DATABASE zakłada bazę danych o podanej nazwie (nazwa_nowej_bazy).
- Aby założyć bazę musisz posiadać przywilej (prawo) CREATE.
- Jeżeli próbujesz stworzyć bazę o nazwie która już istnieje, to wystąpi błąd.
- Użycie klauzuli IF NOT EXISTS przed założeniem bazy upewni się czy baza o podanej nazwie nie istnieje.

Fizycznie baza danych MySQL jest zaimplementowana jako katalog dyskowy zawierający pliki odpowiadające tabelom bazy.
Po użyciu instrukcji CREATE DATABASE zostanie założony pusty katalog.
W związku z powyższym istnieje możliwość utworzenia bazy wykonując instrukcję systemową mkdir.

Posted in MySQL | Tagged , , , , | Leave a comment

MySQL. Niebezpieczeństwo użycia atrybutu INT UNSIGNED. Nieokreślone ujemne wartości liczbowe.

Dzisiaj artykuł o niebezpieczeństwie użycia atrybutu UNSIGNED przy wartościach liczbowych w bazie MySQL (i być może w innych bazach też).

PRZYPOMNIENIE: z lekcji o typach danych, rozmiarze i zakresie poszczególnych typów w bazie MySQL:
Wartości całkowite dodatnie:
TINYINT UNSIGNED: 1 byte, zakres: 0 .. 255
SMALLINT UNSIGNED: 2 byte, zakres: 0 .. 65535
MEDIUMINT UNSIGNED: 3 byte, zakres: 0 .. 16777215
INT UNSIGNED: 4 byte, zakres: 0 .. 4294967295
BIGINT UNSIGNED: 8 byte, zakres: 0 .. 18446744073709551615

Wartości całkowite ujemne i dodatnie:
TINYINT: 1 byte, zakres: -128 .. 127
SMALLINT: 2 byte, zakres: -32768 .. 32767
MEDIUMINT: 3 byte, zakres: -8388608 .. 8388607
INT: 4 byte, zakres: -2147483648 .. 2147483647
BIGINT: 8 byte, zakres: -9223372036854775808 .. 9223372036854775807

Atrybut UNSIGNED przy tworzeniu tabeli w bazie informuje bazę, iż będziemy przechowywać w niej tylko wartości dodatnie, czyli 0, 1, 2, 3, … itp.
Dlatego jakakolwiek próba odjęcia od siebie tych wartości, w przypadku gdy wynik ten będzie niższy od 0 otrzymamy wartość nieokreśloną.
Dlaczego? Na to pytanie niestety nie znam odpowiedzi! Jeżeli ktoś zna proszę o wyjaśnienie w komentarzu. Ja jedynie przestrzegam przed niebezpieczeństwem użycia tego atrybutu.

Przykład. 1.
Stworzymy przykładową tabelę bez użycia atrybutu UNSIGNED, aby pokazać jak zachowuje się baza danych przy wartościach ujemnych.

CREATE TABLE tabela (
id_tabela INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
col1 INT NOT NULL DEFAULT 0,
col2 INT NOT NULL DEFAULT 0
);
INSERT INTO tabela SET col1=10, col2=5;
INSERT INTO tabela SET col1=5, col2=10;
INSERT INTO tabela SET col1=7, col2=3;
INSERT INTO tabela SET col1=4, col2=8;
INSERT INTO tabela SET col1=5, col2=5;

mysql> SELECT col1, col2, col1-col2 FROM tabela;
+——+——+———–+
| col1 | col2 | col1-col2 |
+——+——+———–+
|   10 |    5 |         5 |
|    5 |   10 |        -5 |
|    7 |    3 |         4 |
|    4 |    8 |        -4 |
|    5 |    5 |         0 |
+——+——+———–+
5 rows in set (0.00 sec)

Przykład 2.
Stworzymy przykładową tabelę z użyciem atrybutu UNSIGNED.
Pokażemy w ten sposób niebezpieczeństwo użycia tego atrybutu w przypadku próby odjęcia od siebie wartości.

CREATE TABLE tabela (
id_tabela INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
col1 INT UNSIGNED NOT NULL DEFAULT 0,
col2 INT UNSIGNED NOT NULL DEFAULT 0
);
INSERT INTO tabela SET col1=10, col2=5;
INSERT INTO tabela SET col1=5, col2=10;
INSERT INTO tabela SET col1=7, col2=3;
INSERT INTO tabela SET col1=4, col2=8;
INSERT INTO tabela SET col1=5, col2=5;

mysql> select col1, col2, col1-col2 from tabela;
+——+——+———————-+
| col1 | col2 | col1-col2            |
+——+——+———————-+
|   10 |    5 |                    5 |
|    5 |   10 | 18446744073709551611 |
|    7 |    3 |                    4 |
|    4 |    8 | 18446744073709551612 |
|    5 |    5 |                    0 |
+——+——+———————-+
5 rows in set (0.00 sec)

WNIOSEK: Dziwne prawda?
No może i dla prawdziwych wyjadaczy chleba (MySQL’a), jak to się mówi – nie zdziwi powyższy fakt.
Niemniej jednak należy uważać przy używaniu różnych atrybutów – bo zachowywać się mogą inaczej niż nasza logika podpowiada.
Zapewne istnieją różne funkcje konwertujące wartość w locie przy odejmowaniu.
Ale celem tego postu jest ukazanie niebezpieczeństwa nieświadomego użycia atrybutu UNSIGNED przy projektowaniu bazy danych.
Oczywiście powyższy przykład dotyczy wszystkich wartości numerycznych dostępnych w bazie MySQL: TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT, FLOAT, DOUBLE, …

Posted in MySQL | Tagged , , , , , | Leave a comment