Kategoria: (MySQL) Autor: Gabrym Data: 4 lut 2011

Projektując bazę danych zapewne zastanawiacie się czy to co tworzycie będzie wydajne lub które z rozwiązań zastosować do konkretnego projektu.
Najlepszym rozwiązaniem jest zasymulować obciążenie naszego projektu.
Jest dużo narzędzi którymi możemy przeprowadzić testy np.: sysbench, mysqlslap i wiele innych.
Zaprezentuję sposób użycia mysqlslap dostarczanego przez producent mysql.

poniżej przykład zastosowania:


mysqlslap  --concurrency=1,25,50,100 --iterations=10 --csv=/home/benchmark_result.csv \
--delimiter=';' --host=host --user=username --password=pass \
--query=/home/queries_benchmark.sql

–concurrency – ilość jednoczesnych zapytań,
–iterations – ilość iteracji,
–csv – wskazuje w jakim pliku zapisze wynik testu
–delimiter – jakim znakiem są rozdzielone zapytania
–query – plik z zapytaniami

Poniżej przykład pliku zapytań.
queries_benchmark.sql:


SELECT name, age FROM users where id=xx;
CALL udd_search(session_id,12323,'2011-01-01', '2011-02-04',all);
SELECT id FROM users WHERE name LIKE 'ab%';


Kategoria: (Linux) Autor: Gabrym Data: 15 paź 2010

Zdaża się że dostajecie pod opiekę serwis w którym podczas podnoszenia usług (np. Apache) przy ładowaniu ssl-a prosi o hasło.
Jest to o problematyczne gdy zaniknie zasilanie na serwerze usługa (w tym wypadku Apache) będzie czekał na wprowadzenie hasła.
Chyba nikogo nie ucieszy nocny sms zmuszający do wstania.
Do dzieła:


server:~# openssl rsa -in cert.key -out cert.key.new
server:~# mv cert.key cert.key.back
server:~# mv cert.key.new cert.key

Warto dla bezpieczeństwa zdjąc uprawnienia do czytania klucza np:


server:~# chown www-data:www-data cert.key
server:~# chmod 400 cert.key


Kategoria: (MySQL) Autor: Gabrym Data: 15 cze 2010

Administrując bazę MySQL przeważnie używam klienta mysql do logowania z poziomu systemu operacyjnego.
Co zrobić żeby szybko odczytać status tabeli (ilość rekordów, czas utworzenia i inne wartości).
Pomocne będzie polecenie:


show table status like 'nazwa_tabeli'\G

Wynik polecenia jest następujący:


show table status like 'nazwa_tabeli'\G
*************************** 1. row ***************************
           Name: nazwa_tabeli
         Engine: MyISAM
        Version: 10
     Row_format: Dynamic
           Rows: 183
 Avg_row_length: 24
    Data_length: 4556
Max_data_length: 281474976710655
   Index_length: 4096
      Data_free: 0
 Auto_increment: NULL
    Create_time: 2010-05-11 23:32:49
    Update_time: 2010-05-11 23:32:49
     Check_time: NULL
      Collation: utf8_general_ci
       Checksum: NULL
 Create_options: 
        Comment: komentarz do tabeli
1 row in set (0.00 sec)

Zastosowanie na końcu wywołania ‚\G’ zamiast średnika wyświetla wynik pionowo.

Na dev.mysql.com opis składni polecenia:


SHOW TABLE STATUS [{FROM | IN} db_name]
    [LIKE 'pattern' | WHERE expr]

http://dev.mysql.com/doc/refman/5.1/en/show-table-status.html



Po szybkiej aktualizacji systemu wraz z bazą do wersji MySQL 5.1.47
pojawił się problem z uruchomieniem demona MariaDB.

Błąd wygląda następująco:


xxxxxx 19:33:41 mysqld_safe Starting mysqld daemon with databases from /srv/base/sql
xxxxxx 19:33:42 [ERROR] Can't find messagefile '/share/mysql/english/errmsg.sys'
xxxxxx 19:33:42 [Note] PrimeBase XT (PBXT) Engine 1.0.09g RC loaded...
xxxxxx 19:33:42 [Note] Paul McCullagh, PrimeBase Technologies GmbH, http://www.primebase.org
InnoDB: The InnoDB memory heap is disabled
InnoDB: Mutexes and rw_locks use GCC atomic builtins
xxxxxx 19:33:42  InnoDB: highest supported file format is Barracuda.
xxxxxx 19:33:42 InnoDB Plugin 1.0.6-9 started; log sequence number 44244
xxxxxx 19:33:42 [ERROR] Aborting

xxxxxx 19:33:42  InnoDB: Starting shutdown...
xxxxxx 19:33:54  InnoDB: Shutdown completed; log sequence number 44268
xxxxxx 19:33:54 [Note] PrimeBase XT Engine shutdown...
xxxxxx 19:33:54 [Note] 
xxxxxx 19:33:54 mysqld_safe mysqld from pid file /srv/base/sql/mariadb.pid ended

Szybkie rozwiązanie problemu.
Edytujemy skrypt startowy mariadb lub mysqld (w arch linux jest w /etc/rc.d/mariadb lub /etc/rc.d/mysqld )


#!/bin/bash

MYSQLD_ROOT="/home/base/sql"
# source application-specific settings
[ -f /etc/conf.d/mysqld ] && . /etc/conf.d/mysqld

# general config
. /etc/rc.conf
. /etc/rc.d/functions

getPID() {
   echo $(pgrep -u mysql mysqld);
}

case "$1" in
  start)
    stat_busy "Starting MariaDB"
    if [ -z "$(getPID)" ]; then
       /opt/MariaDB/bin/mysqld_safe --datadir=$MYSQLD_ROOT --ledir=/opt/MariaDB/bin &>/dev/null &
      if [ $? -gt 0 ]; then
        stat_fail
        exit 1
      else
     ...

Czytaj dalej »



Kategoria: (Bez kategorii) Autor: admin Data: 13 kwi 2010

Od dzisiaj serwis zostaje przeniesiony na adres blog.gabrym.pl.

Mam nadzieję że ta zmiana zwiększy ilość wpisów…



Kategoria: (MySQL) Autor: Gabrym Data: 15 sty 2010

Oto kilka przykładów użycia crona w bazie MySQL.
Powiedzmy że mamy do przebudowania tabelę często używaną z dużą ilością rekordów.
Oczywiście najlepiej zrobić to w nocy kiedy ruch maleje a co za tym idzie serwer ma większy zapas mocy.

Możemy przeprowadzić to na kilka sposobów:
– ustawić budzik na właściwą godzinę, ;)
– za pomoca linuksowego cron-a,
– wbudowanego mechanizmu event scheduler.

Zobaczmy kilka przykładów z użyciem zaplanowanych zadań (opcja trzecia).

Jednorazowe zadania:


-- event zaplanowany na konkretną godzinę.
CREATE EVENT event_alter
 ON SCHEDULE AT TIMESTAMP '2010-01-16 04:00:01'
 DO alter table tab_name change `nazwa` `nazwa` varchar(100) NOT NULL;

-- event ma się wykonać za 7 godzin od czasu stworzenia go.
CREATE EVENT event_alter
 ON SCHEDULE AT TIMESTAMP (NOW() + INTERVAL 7 HOUR)
 DO alter table tab_name change `nazwa` `nazwa` varchar(100) NOT NULL;

Czytaj dalej »



Kategoria: (Linux) Autor: Gabrym Data: 14 sty 2010

Dzisiaj doszła mnie smutna wiadomość.
Jak pisze copyme na swoim blogu projekt KateOS linux został zawieszony .
To była naprawdę świetna robota. Trzeba mieć tylko nadzieję że ktoś reaktywuję Kaśkę.
To była świetna robota chłopaki.



Kategoria: (MySQL) Autor: Gabrym Data: 23 mar 2009

Czas rozwiazać kolejny problem.
Replikacja zostaje przerwana błędem 1535 przy zastosowania tabeli z polami FLOAT i GEOMETRY.

Przykład tabeli:


CREATE TABLE `lokalizacje` (
  `id` mediumint(10) unsigned,
  `pkt` geometry NOT NULL DEFAULT '',
  `x` FLOAT(20,17),
  `y` FLOAT(20,17),
  PRIMARY KEY (`id`),
  SPATIAL KEY `pkt` (`pkt`)
) ENGINE=MyISAM;

Po zainsertowaniu rekordów na serwerze master replikacja ulega przerwaniu.
Na maszynie slave widzimy:


mysql (database) > show slave status\G
************************ 1. row ************************
Slave_IO_State: Waiting for master to send event
Master_Host: x.x.x.x
Master_User: user
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000024
Read_Master_Log_Pos: 183819499
Relay_Log_File: relay-log.000033
Relay_Log_Pos: 1235861
Relay_Master_Log_File: mysql-bin.000024
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: 1535
Last_Error: Table definition on master and slave does not match:
 Column 5 size mismatch - master has size 247, database.lokalizacje on slave
 has size 1. Master's column size should be <= the slave's column size.
Skip_Counter: 0
Exec_Master_Log_Pos: 182967168
Relay_Log_Space: 2094792
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: 1535
Last_SQL_Error: Table definition on master and slave does not match:
 Column 5 size mismatch - master has size 247, database.lokalizacje on slave
 has size 1. Master's column size should be <= the slave's column size.
1 row in set (0.00 sec)

Zaistniały błąd pojawia się w momencie gdy tabela różni się kolumnami na serwerach master i slave. Czytaj dalej »



Pewnego dnia w pracy postanowiłem zaktualizować mysql do wersji 5.1.28-rc.

Po pierwszej zaktualizowanej maszynie widzę w logach ciekawy warning:


[Warning] Stored routine 'database'.'routine_name': invalid value in column mysql.proc.db_collation.
[Warning] Stored routine 'database'.'routine_name': invalid value in column mysql.proc.character_set_client.
[Warning] Stored routine 'database'.'routine_name': invalid value in column mysql.proc.collation_connection.

W wersji 5.1.28 i nowszych w momencie gdy procedury różnią się kodowaniem od tabel widzimy właśnie taki warning.

Rozwiązaniem jest zmiana kodowania procedur na używane w tabelach.

Przykład błędnego zaimportowania procedury:


mysql (database) > show variables like '%char%';
+--------------------------+----------------------------------+
| Variable_name            | Value                            |
+--------------------------+----------------------------------+
| character_set_client     | latin1                           |
| character_set_connection | latin1                           |
| character_set_database   | utf8                             |
| character_set_filesystem | binary                           |
| character_set_results    | latin1                           |
| character_set_server     | utf8                             |
| character_set_system     | utf8                             |
| character_sets_dir       | /opt/mysql/mysql/share/charsets/ |
+--------------------------+----------------------------------+
8 rows in set (0.01 sec)


mysql (database) > show create procedure example\G
*************************** 1. row ***************************
           Procedure: example
            sql_mode:
    Create Procedure: CREATE DEFINER=`root`@`localhost` PROCEDURE `example`()
begin select 1; end
character_set_client: latin1
collation_connection: latin1_swedish_ci
  Database Collation: utf8_general_ci
1 row in set (0.00 sec)

Baza i tabele są kodowane utf8 tymczasem nasz klient podłączył się z użyciem kodowania latin1.
Nasza procedura przyjęła kodowanie latin1.

Rozwiązanie:
Zmieniamy kodowanie.
Czytaj dalej »



Kategoria: (MySQL) Autor: Gabrym Data: 7 mar 2009

Witajcie po dłuższej przerwie. Zaprezentuję bardzo przydatną aplikację do dzielania ruchu dla baz mysql.
Podczas dużego obciążenie stosujemy replikację w celu jego rozłożenia na wiekszą ilość maszyn.
Co jednak zrobić żeby właściwie zarządzać ruchem.
Dla bazy mysql jest kilka rozwiązań którę to zapenią między innymi – mysql-proxy.
Mysql-proxy oferuje nam:
– monitorowanie ruchu
– analizowanie zapytań
– load balancer
– failover
– filtrowanie
– możliwość modyfikowania wchodzących/wychodzących zapytań
– obsługa socketów
– lua-script do definiowania działania

Przykład:

Jedna z najczęściej stosowana konfiguracji (małe serwisy internetowe). Czytaj dalej »