MySQL duomenų perkėlimas ar kažkas panašaus su Ubuntu/Debian ypatumais =]

Na turėjau tokį įvykį, nulėkė universitete man duoto serverio sisteminė particija  beiškelinėjam duomenis 😉 Iš ext3 patapo ext2, fsck sukrovė beveik visą particijos turinį į “lost+found” katalogą. Nelabai malonu  🙂 Atsibodo laikyti ‘Y’ klavišą nuspaudus, tad ant jo padėjau atsuktuvą, kad pirštas nepavargtų.  Kodėl nutiko taip neaišku, su HDD lyg viskas tvarkoje. Na aišku, kai sisteminiai failai nusėdo į “lost+found ir būnant pasijungus per terminalą, nelabai ką su sistema nuveiksi 🙂 Atsisakė vykdyti beveik visas komandas, nerasdavo, tai vienos, tai kitos bibliotekos =]

Žodžiu atstatyti sistemos neturint su tokiais įvykiais didelių darbo ypatumų man nepavyko, tai pamaniau puiki proga Ubuntu Server 7.04 pakeisti į 8.04 ypač, kai šios versijos palaikymo laikotarpis daug ilgesnis.

Visą root particijos turinį išsisaugojau ir mano serveris jau sukasi ant 8.04 😉

Liko duomenų atstatymas. Vienas iš jų MySQL. Man pasisekė radau DB failus tarp “lost+found”, labai pasitarnavo komanda # locate.

Nusprendžiau DB duomenis laikyti ne root’e, o atskiroje particijoje, kad dėl visa ko išvengti didesnių nuostolių jei pasikartotų analogiškas atvejus. Geriausia pagalba nuolat backup daryti.
MySQL DB failų perkėlimas į kitą vietą neatrodo nieko sudėtingo. Perkeliam duomenis kur norim pvz: /home/var/mysql. patikrinam ar teisės tinkamos.
Pakoreguojam konfigūracijos failą /etc/mysql/my.cnf, jame surandam:
datadir = /var/lib/mysql
ir pakeičiam į vietą, kur, perkėlėm DB failus pvz:
datadir = /home/var/mysql
išsaugome pakeitimus ir perkraunam mysql:
sudo /etc/init.d/mysql restart
Normaliu atveju turėtų viskas suveikti, bet man ne, tepasakė [fail] :/
Pasižiūrim /var/log/syslog Ubuntu/Debian atveju, čia loginami mysql klaidų pranešimai:
mysqld[20582]: 080921 16:33:33 [Warning] Can't create test file /home/var/mysql/xxxxxxxx.lower-test
Sep 21 16:33:33 xxxxxxxx mysqld[20582]: 080921 16:33:33 [Warning] Can't create test file /home/var/mysql/xxxxxxxx.lower-test
Sep 21 16:33:33 xxxxxxxx kernel: [15081.149478] audit(1222029213.892:2): type=1503 operation="inode_create" requested_mask="w::" denied_mask="w::" name="/home/var/mysql/xxxxxxxx.lower-test" pid=20580 profile="/usr/sbin/mysqld" namespace="default"
Sep 21 16:33:33 xxxxxxxx kernel: [15081.149572] audit(1222029213.892:3): type=1503 operation="inode_create" requested_mask="w::" denied_mask="w::" name="/home/var/mysql/xxxxxxxx.lower-test" pid=20580 profile="/usr/sbin/mysqld" namespace="default"
.............................................
Sep 21 16:33:33 xxxxxxxx mysqld[20582]: InnoDB: The error means mysqld does not have the access rights to
Sep 21 16:33:33 xxxxxxxx mysqld[20582]: InnoDB: the directory.
Sep 21 16:33:33 xxxxxxxx mysqld[20582]: InnoDB: File name ./ibdata1
Sep 21 16:33:33 xxxxxxxx mysqld[20582]: InnoDB: File operation call: 'open'.
Sep 21 16:33:33 xxxxxxxx mysqld[20582]: InnoDB: Cannot continue operation.
Sep 21 16:33:33 xxxxxxxx mysqld_safe[20588]: ended

Pasirodo visą reikalą gadino AppArmor, reikia pakoreguoti – /etc/apparmor.d/usr.sbin.mysqld:
/var/lib/mysql
keičiam į vietą, kur perkėlėme DB failus pvz:
/home/var/mysql

Išsaugom, perkraunam apparmor:
# sudo /etc/init.d/apparmor restart

Bandom vėl paleisti mysql:
# sudo /etc/init.d/mysql start

Pasileido pagaliau ir mano DB pasiekiamos 🙂 Tik išmetė mažą klaidą mysql krovimosi metu:
/usr/bin/mysqladmin: connect to server at ‘localhost’ failed
error: ‘Access denied for user ‘debian-sys-maint’@’localhost’ (using password: YES)’
user@xxxxx:/home/var$ ERROR 1045 (28000): Access denied for user ‘debian-sys-maint’@’localhost’ (using password: YES)

Pasirodo debian-sys-maint vartotojas naudojamas sistemos, kažkokiems atnaujinimams, o kadandi mano DB failai iš senos sistemos, tai esanti DB ir sistemoje nurodytas šio vartotojo slaptažodis nesutampa. Tai gi surandam failą – /etc/mysql/debian.cnf jo turinys atrodo maždaug taip:
[client]
host = localhost
user = debian-sys-maint
password = abcdgx
socket = /var/run/mysqld/mysqld.sock
[mysql_upgrade]
user = debian-sys-maint
password = abcdgx
socket = /var/run/mysqld/mysqld.sock
basedir = /usr

tik realus slaptažodis daug ilgesnis 😉

Nusikopijuojam slaptažodį ir pasijungiam į mysql:
# mysql -u root -p mysql
Pakeičiam debian-sys-maint slaptažodį:
mysql> SET PASSWORD FOR 'debian-sys-maint'@'localhost' = PASSWORD('abcdgxh');
Liepiam pasirefrešinti:
mysql> flush privileges;
Perkraunam mysql:
# sudo /etc/init.d/mysql start

Dabar viskas švariai įvyko 🙂

[GLL]Zapatdlo Written by:

3 Comments

  1. Jaris
    January 13, 2009

    Dėkoju apie patarimą dėl AppArmor. Padėjo 😉

  2. noname
    April 21, 2009

    Ačiū. Ačiū. Ačiū.
    visai ne ten bėdos ieškojau
    …. apparmor …..
    Ačiū. Ačiū. Ačiū.

Leave a Reply

Your email address will not be published. Required fields are marked *