Archiwa kategorii: MySQL

MySQL

mysql

Uszkodzona baza danych, mysqld robi crash co minutę, safe go podnosi.

InnoDB: End of page dump
131225 6:55:43 InnoDB: Page checksum 3305108872, prior-to-4.0.14-form checksum 575979139
InnoDB: stored checksum 242663140, prior-to-4.0.14-form stored checksum 575979139
InnoDB: Page lsn 519 184741209, low 4 bytes of lsn at page end 184741209
InnoDB: Page number (if stored to page already) 1527359,
InnoDB: space id (if created with >= MySQL-4.1.1 and stored already) 0
InnoDB: Page may be an index page where index id is 2019052338 1668635222
InnoDB: Database page corruption on disk or a failed
InnoDB: file read of page 1527359.
InnoDB: You may have to recover from a backup.
InnoDB: It is also possible that your operating
InnoDB: system has corrupted its own file cache
InnoDB: and rebooting your computer removes the
InnoDB: error.
InnoDB: If the corrupt page is an index page
InnoDB: you can also try to fix the corruption
InnoDB: by dumping, dropping, and reimporting
InnoDB: the corrupt table. You can use CHECK
InnoDB: TABLE to scan your table for corruption.
InnoDB: See also InnoDB: http://dev.mysql.com/doc/refman/5.0/en/forcing-recovery.html
InnoDB: about forcing recovery.
InnoDB: Ending processing because of a corrupt database page.
InnoDB: Log scan progressed past the checkpoint lsn 525 3009343428
131225 6:55:43 InnoDB: Database was not shut down normally!
InnoDB: Starting crash recovery.
InnoDB: Reading tablespace information from the .ibd files…
InnoDB: Restoring possible half-written data pages from the doublewrite
InnoDB: buffer…
InnoDB: Doing recovery: scanned up to log sequence number 525 3009358835

Aby problem naprawić, trzeba skasować tabelę, która powoduje problem i odtworzyć ją na nowo.
Nie da się jednak zrobić dumpa tabeli, bo mysql umiera. Aby nie znikał mimo błędu trzeba dopisać innodb_force_recovery=1 w my.cfg na czas wykonania dumpa (w tym czasie nie da się modyfikować zawartości bazy, działa tylko select).

mysql brak polskich znaków po imporcie

Zdarza się, że po imporcie bazy do mysqla nie ma poprawnych znaków. Problem może występować nie tylko w samej bazie lub w pliku z importem, ale także na połączeniu klient/serwer.

Konwertujemy plik baza.sql z utf8 do iso8859-2
iconv -f utf8 -t iso8859-2 baza2.sql

do pliku baza2.sql na początku dopisujemy SET NAMES utf8;

wykonujemy import:
mysql -uuser -phaslo baza

Teraz sprawdzamy czy w bazie jest poprawnie?
# locale
LANG=pl_PL.UTF-8
LC_CTYPE="pl_PL.UTF-8"

W /etc/mysql/my.cnf w sekcji [mysql] ma być:
default-character-set=utf8
teraz z poziomu shella i polecenia mysql sprawdzamy SELECTem czy w jakiejś tabeli są prawidłowe polskie znaki. Jeśli tak, pozostaje sprawdzić czy przez php też są polskie litery. Jeśli nie ma to po mysql_connect a przed wydaniem komend na bazie dodajemy polecenie SET NAMES utf8; Czyli:
mysql_query("set names utf8" );

Instalacja sphinx

W Debianie nie ma pakietu mysql-dev, trzeba zainstalować:
apt-get install libmysqlclient15-dev
Rozpakowujemy źródło sphinxa:
tar xzf sphinx-2.0.x-release.tar.gz
cd sphinx-2.0.x-release
./configure
make
make install

Instaluje programy wykonywalne w /usr/local/bin: indexer i searchd

Teraz tworzymy użytkownika sphinx
useradd -m sphinx

Do crona dodajemy skrypt batchreindex.sh
#!/bin/bash
cd /srv/sphinx
/usr/local/bin/searchd --stop
sleep 2
/usr/local/bin/indexer --rotate --all
/usr/local/bin/searchd &

Mysql 5.5 instalacja ze źródeł

Nie ma dla Debiana gotowej paczki z mysql 5.5, dlatego trzeba sobie skompilować, jak dawniej. Pobieramy ze strony http://dev.mysql.com/downloads/mysql/ aktualne źródło (Select Platform -> Source code).
Do kompilacji będą potrzebne:
apt-get install make cmake bison g++
Rozpakowujemy źródła:
tar xzf mysql-5.5.16.tar.gz
cd mysql-5.5.16
cmake .
make
make install (zainstaluje do /usr/local/mysql)
lub make install DESTDIR=”/dowolny/katalog”
make install scripts
Dodajemy użytkownika i grupę:
groupadd mysql
useradd -r -g mysql mysql
Zmieniamy właściciela
chown -R mysql.mysql /usr/local/mysql
Tworzymy tabele z uprawnieniami skryptem:
scripts/mysql_install_db –user=mysql
Uruchamiamy bazę poprzez:
/usr/local/mysql/bin/mysqld_safe
Standardowo my.cnf będzie czytany z katalogu /etc/mysql/my.cnf
Jeśli chcemy aby był używany inny plik/katalog uruchamiamy mysqla tak:
/usr/local/mysql/bin/mysqld_safe –defaults-file=/etc/mysql/my_ok_22.cnf

Kilka instancji mysql na jednym serwerze

useradd mysql2
mkdir /var/run/mysqld2
chown mysql2.mysql2 /var/run/mysqld

do /etc/mysql/my.cnf należy dodać sekcję:
[mysqld_multi]
mysqld = /usr/bin/mysqld_safe
mysqladmin = /usr/bin/mysqladmin
user = root
password = haslo

oraz sekcję [mysql] zmienić na [mysql1] oraz dodać kolejną [mysql2], itd.

W każdej sekcji należy ustawić:
[mysql2]
user = mysql2
pid-file = /var/run/mysqld2/mysqld.pid
socket = /var/run/mysqld2/mysqld.sock
port = 3307
basedir = /usr
datadir = /srv/db/mysql2

startujemy wybrane mysql, np.
/etc/init.d/mysql start 2

Error 2020: Got packet bigger than ‚max_allowed_packet’ bytes when dumping table

Podczas zrzutu bazy pojawia się error:
mysqldump -u user -phaslo baza >plik
mysqldump: Error 2020: Got packet bigger than ‚max_allowed_packet’ bytes when dumping table `lex_tresci` at row: 38566

Należy ustawić max_allowed_packet na wyższą wartość. Nie pomaga ustawienie w my.cnf. Należy dodać do wywołania mysqldumpa:
mysqldump –max_allowed_packet=512M -u user -phaslo baza >plik

mysql – uprawnienia do bazy (grant)

Przyznanie uprawnień do bazy z poziomu administratora:
Z localhosta:
grant all privileges on nazwa_bazy.* to nazwa_usera@localhost identified by ‚haslo’;
Z konkretnego IP:
grant all privileges on nazwa_bazy.* to nazwa_usera@195.64.174.x identified by ‚haslo’;
Z dowolnego IP:
grant all privileges on nazwa_bazy.* to nazwa_usera@’%’ identified by ‚haslo’;

ERROR 1005 (HY000) at line 32: Can’t create table ‚./tabl/tabl_entry.frm’ (errno: 150)

Przy próbie odtworzenia bazy mysql z dumpa pojawia się taki błąd:
ERROR 1005 (HY000) at line 32: Can't create table './tabl/tabl_entry.frm' (errno: 150)
Tabela zawiera klucz do innej tabeli, która jeszcze nie istnieje:
CONSTRAINT `tabl_entry_FK_1` FOREIGN KEY (`author_id`) REFERENCES `tabl_user` (`id`),
Aby mysql nie sprawdzał tego należy na początku dumpa dodać:
SET FOREIGN_KEY_CHECKS = 0;