Google

Kategorie

Reprezentacja Wiedzy

Kalendarz

February 2012
M T W T F S S
« Jan    
 12345
6789101112
13141516171819
20212223242526
272829  

Najbliższe urodziny osoby

January 21st, 2009 by prond

Jak pobrać daty najbliższych urodziń na podstawie dat urodzenia ?
Może tak : ?

SELECT
	CASE
		WHEN STR_TO_DATE(CONCAT(YEAR(NOW()),'-',MONTH(birth_date),'-',DAY(birth_date)),'%Y-%m-%d') < NOW()
			THEN STR_TO_DATE(CONCAT(YEAR(NOW()),'-',MONTH(birth_date),'-',DAY(birth_date)),'%Y-%m-%d') + INTERVAL 1 YEAR
		ELSE STR_TO_DATE(CONCAT(YEAR(NOW()),'-',MONTH(birth_date),'-',DAY(birth_date)),'%Y-%m-%d')
	END AS birthday
FROM
	users
ORDER BY
	birthday;

Posted in MySQL | No Comments »

MySQL stawianie repliki

December 31st, 2007 by prond

1) Sprawdzenie statusu serwera MASTER

Łączymy się z serwerem MASTER i wpisujemy polecenie show master status;.
Powinniśmy otrzymać mniej więcej taki rezultat jak poniżej. Jeżeli tak to można od razu przejść do punktu #3.

mysql> show master status;
+------------------+----------+-----------------------------+------------------+
| File             | Position | Binlog_Do_DB                | Binlog_Ignore_DB |
+------------------+----------+-----------------------------+------------------+
| mysql-bin.000069 |       98 | cms_company_1,cms_company_2 |                  |
+------------------+----------+-----------------------------+------------------+
1 row in set (0.00 sec)

Jeżeli otrzymamy pusty wynik należy skonfigurować bin loga (punkt #2)

mysql> show master status;
Empty set (0.00 sec)

2) Konfiguracja serwera MASTER

W pliku konfiguracyjnym MySQL (na Debianie /etc/mysql/my.ini) należy zdefiniować ścieżkę bin loga:

log_bin = /var/log/mysql/mysql-bin.log

W tym samym pliku należy ustawić server-id. Uwaga : replikacja nie działa jeżeli serwer MASTER i SLAVE mają takie same server-id

server-id = 360

Mamy jeszcze dodatkowo takie parametry jak, ktorych nazwy sa chyba na tyle intuicyjne, że nie potrzeba tłumaczyć ich znaczenia.

expire_logs_days	= 10
max_binlog_size         = 100M
binlog_do_db		= cms_company_1
binlog_do_db		= cms_company_2
#binlog_ignore_db	= test

3) Backup replikowanych baz danych z serwera MASTER

Wygodnie jest zrobić backup replikowanych baz danych razem z informacją o punkcie startu replikacji (opcja master-data)

mysqldump -h{nazwa_hosta} -P{port} -u{nazwa_uzytkownika} -p{haslo} --master-data=2 {nazwa_bazy_danych} > {nazwa_pliku_sql}

Ja ustawiam zwykle opcję master-data=2, tak aby polecenie definujące punkt startu replikacji było wykomentowane:


– Position to start replication or point-in-time recovery from

– CHANGE MASTER TO MASTER_LOG_FILE=’mysql-bin.000068′, MASTER_LOG_POS=240;

4) Sprawdzenie statusu serwera SLAVE

Łączymy się z serwerem MASTER i wpisujemy polecenie show slave status;.
W przypadku, gdy nie mamy postawionej repliki wynik powinien być pusty:

mysql> show slave status;
Empty set (0.00 sec)

Dla serwera z działającą repliką dostaniemy rezultat jak poniżej. Powinniśmy wtedy zatrzymać replikę przy pomocy poleceń slave stop; reset slave;

mysql> show slave status;
+----------------------------------+-------------+-------------+-------------+---------------+------------------+---------------------+----------------------------+---------------+-----------------------+------------------+-------------------+------------------------------+---------------------+--------------------+------------------------+-------------------------+-----------------------------+------------+------------+--------------+---------------------+-----------------+-----------------+----------------+---------------+--------------------+--------------------+--------------------+-----------------+-------------------+----------------+-----------------------+
| Slave_IO_State                   | Master_Host | Master_User | Master_Port | Connect_Retry | Master_Log_File  | Read_Master_Log_Pos | Relay_Log_File             | Relay_Log_Pos | Relay_Master_Log_File | Slave_IO_Running | Slave_SQL_Running | Replicate_Do_DB              | Replicate_Ignore_DB | Replicate_Do_Table | Replicate_Ignore_Table | Replicate_Wild_Do_Table | Replicate_Wild_Ignore_Table | Last_Errno | Last_Error | Skip_Counter | Exec_Master_Log_Pos | Relay_Log_Space | Until_Condition | Until_Log_File | Until_Log_Pos | Master_SSL_Allowed | Master_SSL_CA_File | Master_SSL_CA_Path | Master_SSL_Cert | Master_SSL_Cipher | Master_SSL_Key | Seconds_Behind_Master |
+----------------------------------+-------------+-------------+-------------+---------------+------------------+---------------------+----------------------------+---------------+-----------------------+------------------+-------------------+------------------------------+---------------------+--------------------+------------------------+-------------------------+-----------------------------+------------+------------+--------------+---------------------+-----------------+-----------------+----------------+---------------+--------------------+--------------------+--------------------+-----------------+-------------------+----------------+-----------------------+
| Waiting for master to send event | master360   | master_user |        3306 |            60 | mysql-bin.001007 |            37474461 | master360-relay-bin.001460 |      37472499 | mysql-bin.001007      | Yes              | Yes               | cms_company_1, cms_company_2 |                     |                    |                        |                         |                             |          0 |            |            0 |            37474461 |        37472499 | None            |                |             0 | No                 |                    |                    |                 |                   |                |                     0 |
+----------------------------------+-------------+-------------+-------------+---------------+------------------+---------------------+----------------------------+---------------+-----------------------+------------------+-------------------+------------------------------+---------------------+--------------------+------------------------+-------------------------+-----------------------------+------------+------------+--------------+---------------------+-----------------+-----------------+----------------+---------------+--------------------+--------------------+--------------------+-----------------+-------------------+----------------+-----------------------+
1 row in set (0.00 sec)

5) Konfiguracja i startowanie repliki

Przed włączeniem repliki należy się upewnić, że id serwera SLAVE jest różne od MASTER. W tym celu należy sprawdzić wartość zmiennej server_id.
Możną ją zmienić w pliku konfiguracyjnym (jak w punkcie #2) bądź poprzez polecenie set global server_id = {nowe_id};. Lepiej to jednak zrobić w pliku konfiguracyjnym, ponieważ przy restarcie serwera wartość zmienniej server_id jest brana właśnie stamtąd.

Teraz edytujemy (i odkomentowujemy) wygenerowane polecenie startu replikacji i dodajemy do niego dane niezbedne do polaczenia z serwerem MASTER.

CHANGE MASTER TO MASTER_HOST='{master_host}', MASTER_PORT={master_port}, MASTER_LOG_FILE='{master_log_file}',MASTER_LOG_POS={master_position}, MASTER_USER='{master_user}', MASTER_PASSWORD='{master_password}'

Robimy restore bazy z backupów.

mysql -h{nazwa_hosta} -P{port} -u{nazwa_uzytkownika} -p{haslo} {nazwa_bazy_danych} < {nazwa_pliku_sql}

Startujemy replikę.

mysql> slave start;

Sprawdzamy status repliki.

mysql> show slave status;

Posted in MySQL | No Comments »

GROUP_CONCAT w PostgreSQL

June 6th, 2007 by prond

Pisałem wcześniej o bardzo przyjemnym feature MySQL’a, jakim jest funkcja agregująca GROUP_CONCAT
Niestety brakuje tej funkcji w PostgreSQL, ale to nie stanowi większego problemu ponieważ w postgre’sie mamy na prawdę potężne możliwości w dodawaniu nowej funkcjonalności. W przypadku GROUP_CONCAT stworzyłem agregat:
Read the rest of this entry »

Posted in PostgreSQL | 1 Comment »

MySQL User Variables

May 22nd, 2007 by prond

Tych z was, których choć trochę zaciekawiły rozwiązania dotyczące implementacji rank() i rownum() i sekwencji w MySQL zachęcam do poczytania artykułów na tych stronach:

Posted in MySQL | No Comments »

rownum() w MySQL

May 22nd, 2007 by prond

Pewnie wielu użytkownikom MySQL’a brakuje rownum’a. Dobra wiadomość jest taka, że można w MySQL zbudować zapytanie realizujące (chyba) w pełni funkcjonalność rownum().
Read the rest of this entry »

Posted in MySQL | 1 Comment »

Sekwencje w MySQL

May 22nd, 2007 by prond

Kiedy zacząłem pracę z MySQL (wcześniej pracowałem na Oracle i PostgreSQL) strasznie brakowało mi sekwencji. Wrzucenie danych do typowej struktury MASTER - DETAIL wymagało obsługi sekwencji na poziomie aplikacji. Po paru próbach i dzięki pomocy kilku użytkowników forum.php.pl udało mi się stworzyć coś takiego:
Read the rest of this entry »

Posted in MySQL | No Comments »

MySQL GROUP_CONCAT

May 22nd, 2007 by prond

Ostatnimi czasy mam styczność wieloma projektami Web 2.0.

Typowym elementem w takich projektach są tagi. Nie tak dawno trafiłem na bardzo przyjemną funkcję MySQL’a, która pięknie pasuje do wyciągania z bazy tagów danego post’u w postaci stringa:
Read the rest of this entry »

Posted in MySQL | 1 Comment »

rank() w MySQL

May 22nd, 2007 by prond

MySQL nie posiada funkcji rankingujących znanych z Oracle. Przynajmniej tak jest jeszcze dzisiaj i pewnie długo jeszcze będzie trzeba na nie czekać.

Można jednak stworzyć zapytanie, które będzie realizowało funkcjonalność funkcji rank()
Read the rest of this entry »

Posted in MySQL | No Comments »