Pokazywanie postów oznaczonych etykietą mysqlbinlog. Pokaż wszystkie posty
Pokazywanie postów oznaczonych etykietą mysqlbinlog. Pokaż wszystkie posty

piątek, 23 maja 2014

Naprawianie replikacji master-master w MySQLu

Pamiętacie mój ostatni post na temat podpinania nowego noda do replikacji w MySQL-u? Możecie go przeczytać tutaj, jeśli jeszcze tego nie zrobiliście.

Chciała bym teraz troszkę zmienić scenariusz wydarzeń i zastanowić się co musimy zrobić aby naprawić replikację master-master w MySQLu. Załóżmy, że mamy dwa serwery, których zmiany powinny być wzajemnie replikowane. Niestety zauważyliśmy, że zmiany z II serwera już od jakiegoś czasu nie są zatwierdzane na slavie z powodu błędu. Dodatkowym problemem jest rosnąca liczba plików relay logów na serwerze. Slave nie może ich usunąć bo zmiany w nich nie zostały zatwierdzone ale są cały czas od mastera pobierane nowe zmiany. Musimy zacząć myśleć co z tym zrobić aby się nie okazało, że za jakiś czas zacznie brakować nam miejsca.

Oto przykładowy błąd w tym wypadku:

mysql> show slave status \G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 1.1.1.1
                  Master_User: replicate
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: host-mysql-01-bin.002539
          Read_Master_Log_Pos: 902412914
               Relay_Log_File: host-mysql-01-relay-bin.001829
                Relay_Log_Pos: 461330748
        Relay_Master_Log_File: host-mysql-01-bin.002399
             Slave_IO_Running: Yes
            Slave_SQL_Running: No
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 1452
                   Last_Error: Could not execute Write_rows event on table test.BATCH_STEP_EXECUTION; Cannot add or update a child row: a foreign key constraint fails (`test`.`BATCH_STEP_EXECUTION`, CONSTRAINT `JOB_EXEC_STEP_FK` FOREIGN KEY (`JOB_EXECUTION_ID`) REFERENCES `BATCH_JOB_EXECUTION` (`JOB_EXECUTION_ID`)), Error_code: 1452; handler error HA_ERR_NO_REFERENCED_ROW; the event's master log host-mysql-01-bin.002399, end_log_pos 508490809
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 508490445
              Relay_Log_Space: 145560879727
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: NULL
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 1452
               Last_SQL_Error: Could not execute Write_rows event on table test.BATCH_STEP_EXECUTION; Cannot add or update a child row: a foreign key constraint fails (`test`.`BATCH_STEP_EXECUTION`, CONSTRAINT `JOB_EXEC_STEP_FK` FOREIGN KEY (`JOB_EXECUTION_ID`) REFERENCES `BATCH_JOB_EXECUTION` (`JOB_EXECUTION_ID`)), Error_code: 1452; handler error HA_ERR_NO_REFERENCED_ROW; the event's master log host-mysql-01-bin.002399, end_log_pos 508490809
1 row in set (0.00 sec)

Napisze od razu, że zastosowanie SQL_SLAVE_SKIP_COUNTER=1 (a tu artykuł dlaczego jest to złe) w tym przypadku nie jest rozwiązaniem - według błędu ta zmiana próbuje się odwołać do elementu, który nie istnieje. Co jeśli takich zmian jest cała masa? Chcecie cały czas siedzieć przed komputerem i sprawdzać czy nie trzeba countera pominąć?! Najlepszym rozwiązaniem będzie odtworzenie całej replikacji. Aby to zrobić będziemy początkowo traktować 'zepsuty' slave jako nowy nod (http://db-diary.blogspot.com/2014/05/podpiecie-nowego-noda-do-replikacji-w.html).

No to co robimy:
  1. Przekierowywujemy cały ruch aplikacji na działającego noda - w naszym przypadku jest to II serwer.
  2. Generujemy dump z II serwera:

    mysqldump -uroot -proot --skip-lock-tables --single-transaction --flush-logs --hex-blob --master-data=2 -A > dump.sql


    UWAGA!
    Tutaj musicie założyć, że wszystkie bazy danych mają tabelkę transakcyjne - InnoDB. Jeśli używanie także MyISAM wymagane będzie zatrzymać aplikację, które powodują zamiany na działającym masterze (w naszym przypadku to oczywiście serwer II) lub wymusić lokowanie tabel w czasie robienia dumpa. Jeśli tego nie zrobicie w dumpie mogą pojawić się dane z 'późniejszych' insertów niż pozycja i plik binary logów na to wskazuje.
  3. Zczytujemy pozycję mastera z dumpa

    head dump.sql -n80 | grep "MASTER_LOG_POS"
  4. Kopiujemy dump na I serwer
  5. Stopujemy replikację na oby dwóch serwerach przy pomocy polecenia:

    STOP SLAVE;

    Ponieważ w dumpie mamy wszystkie polecenia do odtworzenia całego klastra, musimy się upewnić, że w czasie importowania jego, żadne zmiany nie przeniosą się na slava.
  6. Resetujemy slava na I serwerze

    RESET SLAVE;

    Przy pomocy tego polecenia wszystkie relay-logi zostaną usunięte i zostanie stworzony całkiem nowy. Informacje o replikacji także zostaną 'zapomniane' - pliki master.info i relay-log.info zostaną usunięte. Zawierają one informację o połączeniu i pozycjach w plikach. Warto je przekopiować na wypadek jak byśmy nie pamiętali nazwy użytkownika i jego hasła lub IP hosta potrzebnego do połączenia w replikacji.
  7. Zaimportować dump

    mysql -uroot -proot < dump.sql
  8. Zczytujemy nazwę binarylogu i pozycję na serwerze I

    SHOW MASTER STATUS;
  9. Ustawiamy slava dla serwerów

    CHANGE MASTER TO MASTER_HOST='HOST',MASTER_USER='replication',MASTER_PASSWORD='replication', MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=504122;

    Plik i pozycję dla serwera I zaczytaliśmy z dumpa (punkt 3), a dla serwera II z poprzedniego kroku (punkt 8).
  10. Uruchamiany replikację

    START SLAVE;
  11. Potwierdzamy działanie replikacji

    SHOW SLAVE STATUS \G

Może się zdarzyć, że mimo to replikacja i tak nie działa. Musicie się przyjrzeć dokładnie jakie zmiany mają być przenoszone - może to wynikać ze złego sposobu wykonania dumpa (popatrz na komentarz w punkcie 2). Załóżmy, że miało to miejsce i pojawił się następujący błąd:

mysql> show slave status \G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 1.1.1.1
                  Master_User: replicate
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: host-03-bin.002549
          Read_Master_Log_Pos: 130312481
               Relay_Log_File: host-03-relay-bin.000002
                Relay_Log_Pos: 33108
        Relay_Master_Log_File: host-03-bin.002549
             Slave_IO_Running: Yes
            Slave_SQL_Running: No
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 1032
                   Last_Error: Could not execute Update_rows event on table test.BATCH_JOB_SEQ; Can't find record in 'BATCH_JOB_SEQ', Error_code: 1032; handler error HA_ERR_END_OF_FILE; the event's master log host-03-bin.002549, end_log_pos 33132
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 32951
              Relay_Log_Space: 130313453
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: NULL
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 1032
               Last_SQL_Error: Could not execute Update_rows event on table test.BATCH_JOB_SEQ; Can't find record in 'BATCH_JOB_SEQ', Error_code: 1032; handler error HA_ERR_END_OF_FILE; the event's master log host-03-bin.002549, end_log_pos 33132
1 row in set (0.00 sec)

Istnieje prawdopodobieństwo, że tych złych danych jest tak mało, że możemy ręcznie wyrównać zmiany, aż slave przestanie sypać błędami (wykonanie dumpa trwało na tyle krótko, że tych 'nadmiernych' zmian było mało). Ale jak to zrobić? Posłużymy się narzędziem masterbinlog. Ja postanowiłam przejżeć wszystkie zmiany w relay logach:

mysqlbinlog --start-position=0 --verbose --base64-output=DECODE-ROWS host-03-relay-bin.000002 > /tmp/binary.logs

Przeglądałam plik i szukałam wystąpienia znaków 'end_log_pos 33132'. W ten sposób znalazłam:

#140522  1:12:00 server id 173  end_log_pos 33108     Table_map: `test`.`BATCH_JOB_SEQ` mapped to number 5085
#140522  1:12:00 server id 173  end_log_pos 33132     Update_rows: table id 5085 flags: STMT_END_F
### UPDATE test.BATCH_JOB_SEQ
### WHERE
###   @1=354422
### SET
###   @1=354423
# at 4309887

Sprawdziłam, że ten wiersz dla tego ID w tej tabeli nie istnieje, a właściwie istnieje ale ma inną wartość - dlatego slave nie jest w stanie zatwierdzić zmian. Co teraz zrobić?

  1. Zatrzymujemy slave

    STOP SLAVE;
  2. Wykonujemy taką zmiane na bazie danych aby dane do tego momentu były zgodne do zatwierdzenia przez slave:

    UPDATE test.BATCH_JOB_SEQ SET ID = 354422 WHERE ID = X;
  3. Wznawiamy slava

    START SLAVE;
Może się okazać, że tych zmian jest troszkę. Ale czasie warto przejść przez to kilka razy. Jeśli jednak zmian jest za dużo, warto się zastanowić nad wykonaniem dumpa ponownie z lokowaniem zapisy do tabel.

wtorek, 18 lutego 2014

Binarki MySQL-a

Po zainstalowaniu MySQL-a głównie korzystamy z 4 plików binarnych:
  • mysql - program klienta do nawiązywania połączenia z serwerem
  • mysqld/mysqld_safe - główny program do uruchomienia serwera
  • mysqldump - export danych z wybranej bazy danych/tabeli

Ale dostępne (w katalogu bin pod katalogiem głównym) są jeszcze inne programy dla celów administracyjnych i użytkowych.

Aby znaleźć katalog główny, zaloguj się na serwer i wyszukaj zmienną basedir:

mysql (root@127.0.0.1:(none))> show variables like 'basedir';
+---------------+---------------------+
| Variable_name | Value               |
+---------------+---------------------+
| basedir       | /usr/local/mysql5.5 |
+---------------+---------------------+
1 row in set (0.08 sec)

W katalogu głównym znajdziecie dodatkowe programy, które mogą się okazać przydatne i które teraz opiszę. Może się okazać, że pod ręką mamy pomocne narzędzia, o których nic nie wiemy:
  • innochecksum - wyświetla informację o checksumie do plików InnoDB. Program ten może być użyty do kontroli przenoszenia/kopiowania plików.
[05:16:46 root@- bin] sudo ./innochecksum -d /home/mysql/mysql5.5/myisam/ela_db/test.ibd
file /home/mysql/mysql5.5/myisam/ela_db/test.ibd = 98304 bytes (6 pages)...
checking pages in range 0 to 5
page 0: log sequence number: first = 2702026452; second = 2702026452
page 0: old style: calculated = 358136944; recorded = 358136944
page 0: new style: calculated = 610648785; recorded = 610648785
page 1: log sequence number: first = 2702022632; second = 2702022632
page 1: old style: calculated = 3782708855; recorded = 3782708855
page 1: new style: calculated = 472948545; recorded = 472948545
page 2: log sequence number: first = 2702026452; second = 2702026452
page 2: old style: calculated = 3864827530; recorded = 3864827530
page 2: new style: calculated = 1336201095; recorded = 1336201095
page 3: log sequence number: first = 2702026452; second = 2702026452
page 3: old style: calculated = 3221959309; recorded = 3221959309
page 3: new style: calculated = 666523661; recorded = 666523661
page 4: log sequence number: first = 0; second = 0
page 4: old style: calculated = 1371122432; recorded = 0
page 4: new style: calculated = 1575996416; recorded = 0
page 5: log sequence number: first = 0; second = 0
page 5: old style: calculated = 1371122432; recorded = 0
page 5: new style: calculated = 1575996416; recorded = 0

  • myisamchk - program obłóguje pliki tabel MyISAM. Może zwrócić informację o statystykach, sprawdzić czy nie ma błędów, naprawić lub zoptymalizować.
[06:11:36 root@nazgul bin] ./myisamchk --description /home/mysql/mysql5.5/myisam/ela_db/*.MYI

MyISAM file:         /home/mysql/mysql5.5/myisam/ela_db/test_myisam.MYI
Record format:       Packed
Character set:       utf8_general_ci (33)
Data records:                    7  Deleted blocks:                 0
Recordlength:                  788

table description:
Key Start Len Index   Type
[05:59:58 root@nazgul bin] ./myisamchk -i /home/mysql/mysql5.5/myisam/ela_db/*.MYI
Checking MyISAM file: /home/mysql/mysql5.5/myisam/ela_db/test_myisam.MYI
Data records:       7   Deleted blocks:       0
myisamchk: warning: 1 client is using or hasn't closed the table properly
- check file-size
- check record delete-chain
- check key delete-chain
- check index reference
- check record links
          
Records:                 7    M.recordlength:       46   Packed:             0%
Recordspace used:       97%   Empty space:           2%  Blocks/Record:   1.00
Record blocks:           7    Delete blocks:         0
Record data:           327    Deleted data:          0
Lost space:             10    Linkdata:             27
MyISAM-table '/home/mysql/mysql5.5/myisam/ela_db/test_myisam.MYI' is usable but should be fixed

User time 0.00, System time 0.00
Maximum resident set size 1320, Integral resident set size 0
Non-physical pagefaults 414, Physical pagefaults 0, Swaps 0
Blocks in 0 out 0, Messages in 0 out 0, Signals 0
Voluntary context switches 2, Involuntary context switches 2

Stworzyłam tabelę service_myisam z 6997 rekordami.
[06:21:08 root@nazgul bin] ./myisamchk -i /home/mysql/mysql5.5/myisam/ela_db/services_myisam.MYI
Checking MyISAM file: /home/mysql/mysql5.5/myisam/ela_db/services_myisam.MYI
Data records:    6997   Deleted blocks:       0
myisamchk: warning: 1 client is using or hasn't closed the table properly
- check file-size
- check record delete-chain
- check key delete-chain
- check index reference
- check record links
          
Records:              6997    M.recordlength:      101   Packed:             0%
Recordspace used:       99%   Empty space:           0%  Blocks/Record:   1.00
Record blocks:        6997    Delete blocks:         0
Record data:        707608    Deleted data:          0
Lost space:           5459    Linkdata:          26233
MyISAM-table '/home/mysql/mysql5.5/myisam/ela_db/services_myisam.MYI' is usable but should be fixed

User time 0.00, System time 0.00
Maximum resident set size 2036, Integral resident set size 0
Non-physical pagefaults 596, Physical pagefaults 0, Swaps 0
Blocks in 0 out 0, Messages in 0 out 0, Signals 0
Voluntary context switches 2, Involuntary context switches 6
Na wszystkich rekordach wykonałam update i usunełam część z wierszy: 2 razy po 1000 rekordów. Po wykonaniu tej operacji:
[06:37:11 root@nazgul bin] ./myisamchk -i /home/mysql/mysql5.5/myisam/ela_db/services_myisam.MYI
Checking MyISAM file: /home/mysql/mysql5.5/myisam/ela_db/services_myisam.MYI
Data records:    4997   Deleted blocks:    2000
- check file-size
- check record delete-chain
- check key delete-chain
- check index reference
- check record links
Records:              4997    M.recordlength:       98   Packed:             0%
Recordspace used:       99%   Empty space:          44%  Blocks/Record:   1.00
Record blocks:        4997    Delete blocks:      2000
Record data:        491470    Deleted data:     225228
Lost space:           3918    Linkdata:          18684

User time 0.00, System time 0.00
Maximum resident set size 2028, Integral resident set size 0
Non-physical pagefaults 594, Physical pagefaults 0, Swaps 0
Blocks in 0 out 0, Messages in 0 out 0, Signals 0
Voluntary context switches 2, Involuntary context switches 8
[06:39:38 root@nazgul bin] ll /home/mysql/mysql5.5/myisam/ela_db/services_myisam.MYI
-rw-rw---- 1 mysql mysql 1024 02-17 06:38 /home/mysql/mysql5.5/myisam/ela_db/services_myisam.MYI
Optymalizacja tabeli:
[06:44:23 root@nazgul bin] ./myisamchk --recover /home/mysql/mysql5.5/myisam/ela_db/services_myisam.MYI
- recovering (with keycache) MyISAM-table '/home/mysql/mysql5.5/myisam/ela_db/services_myisam.MYI'
Data records: 4997
Sprawdzenie:
[06:47:38 root@nazgul bin] ./myisamchk -i /home/mysql/mysql5.5/myisam/ela_db/services_myisam.MYI
Checking MyISAM file: /home/mysql/mysql5.5/myisam/ela_db/services_myisam.MYI
Data records:    4997   Deleted blocks:       0
- check file-size
- check record delete-chain
- check key delete-chain
- check index reference
- check record links
Records:              4997    M.recordlength:       98   Packed:             0%
Recordspace used:       99%   Empty space:           0%  Blocks/Record:   1.00
Record blocks:        4997    Delete blocks:         0
Record data:        491470    Deleted data:          0
Lost space:           3918    Linkdata:          18684

User time 0.00, System time 0.00
Maximum resident set size 1812, Integral resident set size 0
Non-physical pagefaults 540, Physical pagefaults 0, Swaps 0
Blocks in 0 out 0, Messages in 0 out 0, Signals 0
Voluntary context switches 2, Involuntary context switches 4
Zachęcam do zaznajomienia się ze wszystkimi opcjami. Pozwalaja one wymusić oprtowanie danych po podanym kluczu, sortowanie i analizę indexów.
Ważne abyśmy nasze operacje wykonywanie gdy inne programy nie mają dostepu do tabel, na których pracujemy (np. przy wyłączonym serwerze). Jeśli jednak jest to dla nas zbyt duzy problem, możemy się polegać na poleceniu CHECK TABLE (Odsyłam do dokumentacji tutaj).
  • myisam_ftdump - Wyświetla informację o index-e FULLTEXT w tabelach MyISAM. O to klika przykładów dla tabeli test_myisam:
CREATE TABLE `test_myisam` (
  `c1` int(11) NOT NULL DEFAULT '0',
  `c2` varchar(255) DEFAULT NULL,
  `c3` text,
  `c4` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`c1`),
  FULLTEXT KEY `idx_ft` (`c3`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
W której mamy klika wierszy:
mysql (root@127.0.0.1:ela_db)> select * from test_myisam order by c1 desc;
+------+--------------+-------------------------------+---------------------+
| c1   | c2           | c3                            | c4                  |
+------+--------------+-------------------------------+---------------------+
|    7 | easdfsdfssss | bxcbvx to jest cos innego     | 2014-02-17 06:03:22 |
|    6 | easdfsdfssss | bxcbvx to jest cos innego     | 2014-02-17 07:15:03 |
|    5 | easdfsdfssss | bxcbvx to jest cos innego     | 2014-02-17 07:14:49 |
|    4 | easdfsdfssss | bxcbvx to jest cos innego     | 2014-02-17 06:03:22 |
|    3 | essss        | 2014-02-17 06:00:46           | 2014-02-17 07:14:29 |
|    2 | easdfsdfssss | bxcbvx to jest cos innffffego | 2014-02-17 06:03:22 |
|    1 | essss        | to jest cos innego            | 2014-02-17 06:03:22 |
+------+--------------+-------------------------------+---------------------+
7 rows in set (0.00 sec)
Informacje o index-e (podaję, jako argument, ścieżkę do tabeli bo mam niestandardową ścieżkę do katalogu z danymi. Ostatni argument opowiada numerze index-u - licząc od 0):
[07:03:52 root@nazgul bin] ./myisam_ftdump /home/mysql/mysql5.5/myisam/ela_db/test_myisam 1
Total rows: 7
Total words: 18
Unique words: 5
Longest word: 10 chars (innffffego)
Median length: 6
Average global weight: -0.008164
Most common word: 6 times, weight: -1.791759 (jest)
[07:17:16 root@nazgul bin] ./myisam_ftdump -c /home/mysql/mysql5.5/myisam/ela_db/test_myisam 1
        1            1.7917595 2014
        5           -0.9162907 bxcbvx
        5           -0.9162907 innego
        1            1.7917595 innffffego
        6           -1.7917595 jest
[07:20:06 root@nazgul bin] ./myisam_ftdump -l /home/mysql/mysql5.5/myisam/ela_db/test_myisam 1
  4:          7 38.89%                    7 38.9%
  6:         10 55.56%                   17 94.4%
 10:          1  5.56%                   18 100.0%
[07:20:26 root@nazgul bin] ./myisam_ftdump /home/mysql/mysql5.5/myisam/ela_db/test_myisam 0
Key 0 in table /home/mysql/mysql5.5/myisam/ela_db/test_myisam is not a FULLTEXT key

  • myisamlog -Podgląd logów tabel MyISAM. Wymaga aby serwer działał w trybie debug i aby logi tabel MyISAM były włączone.
  • myisampack - narzędzie do kompresji tabel MyISAM. Kompresuje każdą kolumnę osobno. Jest to efektywne gdy przy selekcie wyciagamy pojedyncze kolumny. Aby zdekompresować tabelę, używamy programu myisamchk z opcją --unpack.
[07:34:01 root@nazgul bin] ./myisampack /home/mysql/mysql5.5/myisam/ela_db/services_myisam.MYI
Compressing /home/mysql/mysql5.5/myisam/ela_db/services_myisam.MYD: (4997 records)
- Calculating statistics
- Compressing file
53.19% 

  • my_print_defaults - wyświetla opcje, które są przypisane do grupy. Domyślnie opcje są czytane z następujących plików konfiguracyjnych w tej kolejności:  /etc/mysql/my.cnf, /etc/my.cnf, ~/.my.cnf. Ponieważ mój serwer działa na innych parametrach i czyta z innego pliku, muszę podać do niego ścieżkę:

[06:52:30 root@- bin] my_print_defaults --defaults-file=/etc/my5.5.cnf client
--port=3309
--socket=/tmp/mysql5.5.sock
--default-character-set=utf8
[06:52:59 root@- bin] my_print_defaults --defaults-file=/etc/my5.5.cnf mysqld
--user=mysql
--skip-name-resolve
--innodb_file_per_table
--skip-external-locking
--report-port=3309
--tmpdir=/home/mysql/mysql5.5/mysqltmp
--event_scheduler=0
--pid-file=/home/mysql/mysql5.5/mysql.pid
--socket=/tmp/mysql5.5.sock
--datadir=/home/mysql/mysql5.5/myisam
--port=3309
--server-id=1
--character-set-server=utf8
--back_log=24
--key_buffer=16M
--max_allowed_packet=16M
--table_cache=4096
--sort_buffer=512k
--read_rnd_buffer_size=512k
--read_buffer_size=512k
--thread_cache=256
--thread_concurrency=10
--myisam_sort_buffer_size=8M
--max_connections=50
--max_tmp_tables=4096
--wait_timeout=3600
--query_cache_type=1
--query_cache_size=512M
--auto_increment_offset=1
--auto_increment_increment=2
--log-output=file
--general_log=1
--general_log_file=/home/mysql/mysql5.5/log/mysql.log
--log_error=/home/mysql/mysql5.5/log/mysql.err
--log-warnings=1
--long_query_time=1
--slow_query_log=1
--slow_query_log_file=/home/mysql/mysql5.5/slow.log
--log_queries_not_using_indexes=1
--log-bin=/home/mysql/mysql5.5/replication/binlog
--binlog-format=ROW
--relay-log=/home/mysql/mysql5.5/replication/relay-bin
--innodb_data_home_dir=/home/mysql/mysql5.5/innodb/
--innodb_data_file_path=ibdata/ibdata1:50M:autoextend
--innodb_log_group_home_dir=/home/mysql/mysql5.5/innodb/iblogs
--innodb_flush_log_at_trx_commit=2
--innodb_fast_shutdown
--innodb_lock_wait_timeout=30
--innodb_log_files_in_group=3
--innodb_thread_concurrency=10
--innodb_max_dirty_pages_pct=30
--innodb_autoextend_increment=32


  • mysqlaccess - Sprawdza prawa dostępu dla kombinacji: host, nazwa użytkownika i nazwa bazy danych. Niestety program będzie działać tylko na standardowym porcie 3306.
[07:50:32 root@nazgul bin] ./mysqlaccess --user=root --password=root --host=127.0.0.1 --db=ela_db --brief
mysqlaccess Version 2.06, 20 Dec 2000
By RUG-AIV, by Yves Carlier (Yves.Carlier@rug.ac.be)
Changes by Steve Harvey (sgh@vex.net)
This software comes with ABSOLUTELY NO WARRANTY.
Password for MySQL superuser root: 

Sele Inse Upda Dele Crea Drop Relo Shut Proc File Gran Refe Inde Alte Show Supe Crea Lock Exec Repl Repl Crea Show Crea Alte Crea Even Trig Ssl_ Ssl_ X509 X509 Max_ Max_ Max_ Max_ | Host,User,DB        
---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- + --------------------
 Y    Y    Y    Y    Y    Y    Y    Y    Y    Y    Y    Y    Y    Y    Y    Y    Y    Y    Y    Y    Y    Y    Y    Y    Y    Y    Y    Y    ?    ?    ?    ?    0    0    0    0   | 127.0.0.1,root,ANY_NEW_DB

BUGs can be reported by email to bugs@mysql.com

  • mysqladmin - klient dla operacji administracyjnych. Przykładowe polecenia to: tworzenie (create) i usuwanie (drop) baz danych, zabijać działające wątki (kill), zmieniać hasła, sprawdzać status serwera lub czy w ogóle jest dostępny (ping) i inne.
[08:12:22 root@nazgul bin] ./mysqladmin --host=127.0.0.1 -P3309 -uroot -proot ping status processlist
mysqld is alive
Uptime: 3667  Threads: 3  Questions: 46  Slow queries: 12  Opens: 41  Flush tables: 2  Open tables: 2  Queries per second avg: 0.012
+----+-------------+-----------------------+--------+-------------+------+-----------------------------------------------------------------------------+------------------+
| Id | User        | Host                  | db     | Command     | Time | State                                                                       | Info             |
+----+-------------+-----------------------+--------+-------------+------+-----------------------------------------------------------------------------+------------------+
| 1  | system user |                       |        | Connect     | 3665 | Waiting for master to send event                                            |                  |
| 2  | system user |                       |        | Connect     | 3633 | Slave has read all relay log; waiting for the slave I/O thread to update it |                  |
| 3  | replication | 192.168.100.166:39523 |        | Binlog Dump | 3652 | Master has sent all binlog to slave; waiting for binlog to be updated       |                  |
| 8  | root        | 127.0.0.1:35420       | ela_db | Sleep       | 894  |                                                                             |                  |
| 12 | root        | 127.0.0.1:35424       |        | Query       | 0    |                                                                             | show processlist |
+----+-------------+-----------------------+--------+-------------+------+-----------------------------------------------------------------------------+------------------+

  • mysqlbinlog - Pokazuję zawartość binlog-ów. Dla przykładowego polecenia insert:
mysql (root@127.0.0.1:ela_db)> show master status;
+---------------+----------+--------------+------------------+
| File          | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+---------------+----------+--------------+------------------+
| binlog.000023 |     1336 |              |                  |
+---------------+----------+--------------+------------------+
1 row in set (0.00 sec)

mysql (root@127.0.0.1:ela_db)> insert into test_myisam (c1,c2,c3,c4) values (8,'easdfsdfssss', 'bxcbvx to jest cos innffffego',now());
Query OK, 1 row affected (0.00 sec)

mysql (root@127.0.0.1:ela_db)> show master status;
+---------------+----------+--------------+------------------+
| File          | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+---------------+----------+--------------+------------------+
| binlog.000023 |     1644 |              |                  |
+---------------+----------+--------------+------------------+
1 row in set (0.00 sec)
Podgląd w binlog-u:
[08:26:57 root@nazgul bin] ./mysqlbinlog --start-position=1336 --base64-output=DECODE-ROWS --verbose /home/mysql/mysql5.5/replication/binlog.000023
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 1336
#140217  8:20:08 server id 1  end_log_pos 1419  Query thread_id=8 exec_time=0 error_code=0
SET TIMESTAMP=1392646808/*!*/;
SET @@session.pseudo_thread_id=8/*!*/;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
SET @@session.sql_mode=0/*!*/;
SET @@session.auto_increment_increment=2, @@session.auto_increment_offset=1/*!*/;
/*!\C latin1 *//*!*/;
SET @@session.character_set_client=8,@@session.collation_connection=8,@@session.collation_server=33/*!*/;
SET @@session.time_zone='SYSTEM'/*!*/;
SET @@session.lc_time_names=0/*!*/;
SET @@session.collation_database=DEFAULT/*!*/;
BEGIN
/*!*/;
# at 1419
# at 1477
#140217  8:20:08 server id 1  end_log_pos 1477  Table_map: `ela_db`.`test_myisam` mapped to number 35
#140217  8:20:08 server id 1  end_log_pos 1560  Write_rows: table id 35 flags: STMT_END_F
### INSERT INTO ela_db.test_myisam
### SET
###   @1=8
###   @2='easdfsdfssss'
###   @3='bxcbvx to jest cos innffffego'
###   @4=1392646808
# at 1560
#140217  8:20:08 server id 1  end_log_pos 1644  Query thread_id=8 exec_time=0 error_code=0
SET TIMESTAMP=1392646808/*!*/;
COMMIT
/*!*/;
DELIMITER ;
# End of log file
ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
  • mysqlcheck - program do utrzymywania serwera MySQL. Sprawdzanie tabel, analiza kluczy, optymalizacja tabel i naprawianie tabel.
  • mysql_client_test - program do testowania API klienta MySQL-a gdzie testy są napisane w specjalnym języku (zobacz dokumentację tutaj).
  • mysql_client_test_embedded - jest tym samym co mysql_client_test ale używany jest do tego serwer osadzony.
  • mysql_config - wyświetla informację o kompilacji klienta i połączeniu jego do MySQL-a
  • mysql_convert_table_format - perl-owy skrypt do konwersji engin-u tabeli.
  • mysqld_multi - uruchomienie kilku serwerów pod różnymi portami i plikami socket. Aby zobaczyć przykładowy plik konfiguracyjny wykonaj polecenie: ./mysqld_multi --example
  • mysqldumpslow - Pasuje i podsumowywuje zapytania, które zostały zapisane w slow logach. Aby wykonać podsumowanie, program podmienia wszystkie liczby na N, a stringi na S. Udostępnia opcje sortowania po np. czasie trwania.
[10:12:32 root@nazgul bin] ./mysqldumpslow -s 'c' /home/mysql/mysql5.5/slow.log | head -n 6

Reading mysql slow query log from /home/mysql/mysql5.5/slow.log
Count: 4  Time=0.00s (0s)  Lock=0.00s (0s)  Rows=7.0 (28), root[root]@[127.0.0.1]
  select * from test_myisam

Count: 3  Time=0.00s (0s)  Lock=0.00s (0s)  Rows=0.0 (0), root[root]@[127.0.0.1]
  update test_myisam set c1 = N where c1 = N limit N

  • mysqlhotcopy - perl-owy skrypt do kopiowania tabeli/bazy danych MyISAM lub Archive. Program lokuje tabele a następnie kopiuje pliki tabel. Kopiowanie może odbywać się tylko w obrębie tej samej maszyny, na której działa główna baza.
  • mysqlimport - program do importu danych z pliku. W podanym przykładzie importuje dane z pliku CSV, gdzie każdy nowy rekord danych to jedna linia pliku. Dane dla kolumn (zdefiniowanych pod opcją --columns) są oddzielone przecinkiem. Zanim proces importu się zacznie, chce aby tabela była wyczyszczona (opcja --delete). Plik CSV znajduje się na maszynie, na której działa serwer MySQL, dlatego używam opcji --local. Chcę aby pierwsza linia była pominięta (bo jest to nagłówek), dlatego dodałam opcję --ignore-lines. Plik CSV, który importuje musi się nazywać (bez rozszerzenia) jak tabelka, do której chce zaimportować dane.
∴ mysqlimport --fields-optionally-enclosed-by='"' --fields-terminated-by=, --lines-terminated-by="\n" -uroot -proot --delete --local --columns=fake_id,comment,ean_code,price,items --ignore-lines=1 reclame_space restore_test.csv

reclame_space.restore_test: Records: 500000  Deleted: 0  Skipped: 0  Warnings: 499999

  • mysql_plugin - program do obsługi plugin-ów. Lista zainstalowanych plugin-ów jest dostępna przy poleceniu SHOW PLUGINS;
  • mysql_secure_installation - prosty skrypt do zmian bezpieczeństwa: zmiana hasła dla root-a, usunięcie anonimowego konta, wyłączenie możliwości zdalnego logowania się przez użytkownika root, usunięcie testowej bazy danych.
  • mysql_setpermission - perl-owy skrypt do wstawiania praw dostępu.
∴ mysql_setpermission --user=root --password=root --host=127.0.0.1 --port=3307
######################################################################
## Welcome to the permission setter 1.4 for MySQL.
## made by Luuk de Boer
######################################################################
What would you like to do:
  1. Set password for an existing user.
  2. Create a database + user privilege for that database
     and host combination (user can only do SELECT)
  3. Create/append user privilege for an existing database
     and host combination (user can only do SELECT)
  4. Create/append broader user privileges for an existing
     database and host combination
     (user can do SELECT,INSERT,UPDATE,DELETE)
  5. Create/append quite extended user privileges for an
     existing database and host combination (user can do
     SELECT,INSERT,UPDATE,DELETE,CREATE,DROP,INDEX,
     LOCK TABLES,CREATE TEMPORARY TABLES)
  6. Create/append full privileges for an existing database
     and host combination (user has FULL privilege)
  7. Remove all privileges for for an existing database and
     host combination.
     (user will have all permission fields set to N)
  0. exit this program

Make your choice [1,2,3,4,5,6,7,0]: 0
We hope we can help you next time 

  • mysqlshow - program zwraca dla:
    • bazy danych - listę tabel
    • tabeli - opis tabeli z opisami wszystkich kolumn
    • kolumny - jej opis
    • jeśli nie podamy żadnego z powyższych elementów, zwracana jest lista baz danych
[08:04:13 root@nazgul bin] ./mysqlshow --host=127.0.0.1 --port=3309 --user=root -proot ela_db test
Database: ela_db  Table: test
+-------+--------------+-----------------+------+-----+-------------------+-----------------------------+---------------------------------+---------+
| Field | Type         | Collation       | Null | Key | Default           | Extra                       | Privileges                      | Comment |
+-------+--------------+-----------------+------+-----+-------------------+-----------------------------+---------------------------------+---------+
| c1    | int(11)      |                 | YES  |     |                   |                             | select,insert,update,references |         |
| c2    | varchar(255) | utf8_general_ci | YES  |     |                   |                             | select,insert,update,references |         |
| c3    | text         | utf8_general_ci | YES  |     |                   |                             | select,insert,update,references |         |
| c4    | timestamp    |                 | NO   |     | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP | select,insert,update,references |         |
+-------+--------------+-----------------+------+-----+-------------------+-----------------------------+---------------------------------+---------+
  • mysqlslap - program do emulacji obciążenia. Np. chce sprawdzić jakie jest obciążenie przy 20 klientów wykonuje zapytanie (w tym przypadku INSERT) po 50 razy
[08:29:14 root@nazgul bin] ./mysqlslap --host=127.0.0.1 -uroot -proot -P3309 \
> --iterations=20 --query="insert into test (c1, c2,c3,c4) values (rand(), 'test ', 'my test', now());" \
> --concurrency=50 --no-drop
Benchmark
 Average number of seconds to run all queries: 0.435 seconds
 Minimum number of seconds to run all queries: 0.008 seconds
 Maximum number of seconds to run all queries: 1.402 seconds
 Number of clients running queries: 50
 Average number of queries per client: 1


  • mysqltest - Program wykołuje test case-y na serwerze MySQL-a. Zazwyczaj wywołuje się ten program przy pomocy perl-owego skryptu, który możecie znaleźć pod BASEDIR/mysql-test/mysql-test-run.pl
  • mysql_tzinfo_to_sql - ładuje tabele time zone. Pliki mogą się znajdować w katalogu: /usr/share/zoneinfo. Program czyta pliki systemowe o strefach czasowych i generuje zapytania SQL.
[10:51:25 ela@nazgul bin] ./mysql_tzinfo_to_sql
Usage:
 ./mysql_tzinfo_to_sql timezonedir
 ./mysql_tzinfo_to_sql timezonefile timezonename
 ./mysql_tzinfo_to_sql --leap timezonefile
[11:09:13 iloop@nazgul bin] ./mysql_tzinfo_to_sql /usr/share/zoneinfo/Poland CES
INSERT INTO time_zone (Use_leap_seconds) VALUES ('N');
SET @time_zone_id= LAST_INSERT_ID();
INSERT INTO time_zone_name (Name, Time_zone_id) VALUES ('CES', @time_zone_id);
INSERT INTO time_zone_transition (Time_zone_id, Transition_time, Transition_type_id) VALUES
 (@time_zone_id, -1717032240, 2)
,(@time_zone_id, -1693706400, 1)
,(@time_zone_id, -1680483600, 2)
...
,(@time_zone_id, 2140045200, 9)
;
INSERT INTO time_zone_transition_type (Time_zone_id, Transition_type_id, Offset, Is_DST, Abbreviation) VALUES
 (@time_zone_id, 0, 5040, 0, 'WMT')
,(@time_zone_id, 1, 7200, 1, 'CEST')
,(@time_zone_id, 2, 3600, 0, 'CET')
,(@time_zone_id, 3, 7200, 1, 'CEST')
,(@time_zone_id, 4, 3600, 0, 'CET')
,(@time_zone_id, 5, 10800, 1, 'EEST')
,(@time_zone_id, 6, 7200, 0, 'EET')
,(@time_zone_id, 7, 7200, 0, 'EET')
,(@time_zone_id, 8, 7200, 1, 'CEST')
,(@time_zone_id, 9, 3600, 0, 'CET')
;

  • mysql_upgrade - sprawdza wszystkie tabelę we wszystkich bazach danych czy są kompatybilne z obecną wersją serwera.
  • perror - wyświetla informację o błędzie, którego kod jest podawany jako argument
[07:03:00 root@nazgul bin] ./perror 13
OS error code  13:  Permission denied
[07:03:03 root@nazgul bin] ./perror 1046
MySQL error code 1046 (ER_NO_DB_ERROR): No database selected