Posts Tagged mysql
mysqldump: Couldn’t execute ‘SELECT /*!40001 SQL_NO_CACHE */ * FROM `EVENTS`’: Cannot proceed because system tables used by Event Scheduler were found damaged at server start (1577)
Dopo aver effettuato un disaster recovery, aver riacciuffato un DB per i capelli ed averlo sbattuto su di un altro server (versioni di MySQL differenti), se effettuo un mysqldump ricevo il seguente messaggio:
mysqldump: Couldn't execute 'SELECT /*!40001 SQL_NO_CACHE */ * FROM `EVENTS`': Cannot proceed because system tables used by Event Scheduler were found damaged at server start (1577)
Fixiamo il problema nel seguente modo:
# mysql_upgrade -f -p
# /etc/init.d/mysql restart
Mysqldump: You can’t use locks with log tables. when doing LOCK TABLES
Se il vostro utente fra i privilegi ha LOCK TABLES e avete dei database con motore InnoDB sicuramente avrete l’errore di cui sopra, per evitarlo basta aggiungere al comando mysqldump l’opzione --skip-lock-tables .
claim token PCM3TNXD3NGK
Munin-node e i grafici di MySQL vuoti
Questo problema non dovrebbe verificarsi (in Ubuntu/Debian, se usate altre distro, peggio per voi) installando munin-node da repository. In ogi modo, se avete il grafico blank con tutta probabilità avete ‘sputtanato’ la password di debian-sys-maint perche’ avete spostato i database da un altro server ‘alla grezza’ copiando brutalmente la /var/lib/mysql/ (usare mysqldump no?) quindi prima cosa da fare è reimpostare la pass appunto di debian-sys-maint recuperandola da qui:
# cat /etc/mysql/debian.cnf
dopo di che la settiamo in mysql cosi’
SET PASSWORD FOR 'debian-sys-maint'@'localhost' = PASSWORD( 'vostra_password' );
Flush privileges;
se la cosa non bastasse allora dobbiamo editare anche /etc/munin/plugin-conf.d/munin-node , inserendo al suo interno quanto segue:
[mysql*]
user root
group root
env.mysqladmin /usr/bin/mysqladmin
env.mysqlopts -uMySQL_usr -pMySQL_usrpassword
createvi un utente apposito se non volete usare root.
MySQL: controllare, ottimizzare, riparare
MySQL e’ un fantastico prodotto ormai giunto ad uno stato di maturità rasserenante. Puo’ capitare pero’ che in situazioni di altissimo traffico e in presenza di query `pesanti`una qualche tabella possa andare a $donnedifacilicostumi, in questi casi mysqlchek ci viene in contro! mi appunto qui di seguito qualche esempio di uso:
Controlla, ottimizza e ripara tutti i databases:
mysqlcheck -p -Aao --auto-repair
Controlla, ottimizza e ripara una precisa tabella
mysqlcheck -p -ao --auto-repair dbname table
Controlla ottimizza e ripara un preciso database:
mysqlcheck -p -ao --database dbname
Proftpd e utenti virtuali
Con questo post voglio inaugurare la serie “basta con l’utilizzo di utenti di sistema” ed iniziare ad appuntarmi un po’ di configurazioni per i demoni piu’ utilizzati relativamente all’utilizzo di utenti virtuali storati in un db MySQL . Cominciamo con qualcosa di semplice: configuriamo il nostro servizio FTP.
Per prima cosa procuriamoci tutto il necessario:
# apt-get install proftpd proftpd-mysql mysql-server
Settiamo una password (su Debian di default è blank)
# mysqladmin -u root password 'QuiLaMiaPassword'
Adesso prepariamo gruppi e utenti:
# groupadd -G 3001 ftpgroup
# useradd -s /bin/false -d /bin/null -c "proftpd user" --uid 3001 -g ftpgroup ftpuser
Adesso cominciamo a preparare Il nostro DB:
# mysql -u root -p
mysql> CREATE DATABASE proftpddb;
Query OK, 1 row affected (0.00 sec)
mysql> GRANT USAGE ON *.* TO proftpduser@localhost IDENTIFIED BY 'proftpdpassword';
Query OK, 0 rows affected (0.00 sec)
mysql> GRANT SELECT, INSERT, UPDATE, DELETE ON proftpddb.* TO 'proftpduser'@'localhost';
Query OK, 0 rows affected (0.00 sec)
mysql> quit
Adesso è il momento di inserire le tabelle necessarie all’interno del nostro DB, per far questo prepariamo un file di testo che chiameremo ‘proftp-mysql.sql’ e lo editiamo inserendo quanto segue:
CREATE TABLE ftpgroup (
groupname varchar(16) NOT NULL default '',
gid smallint(6) NOT NULL default '3000',
members varchar(16) NOT NULL default '',
KEY groupname (groupname)
) TYPE=MyISAM COMMENT='ProFTPd group table';
CREATE TABLE ftpuser (
id int(10) unsigned NOT NULL auto_increment,
userid varchar(32) NOT NULL default '',
passwd varchar(80) NOT NULL default '',
uid smallint(6) NOT NULL default '3000',
gid smallint(6) NOT NULL default '3000',
homedir varchar(255) NOT NULL default '',
shell varchar(16) NOT NULL default '/sbin/nologin',
count int(11) NOT NULL default '0',
accessed datetime NOT NULL default '0000-00-00 00:00:00',
modified datetime NOT NULL default '0000-00-00 00:00:00',
PRIMARY KEY (id),
UNIQUE KEY userid (userid)
) TYPE=MyISAM COMMENT='ProFTPd user table';
e adesso diamo un bel:
# mysql -u root -p proftpddb < proftpd-mysql.sql
Poi:
# mysql -u proftpduser -p proftpddb
mysql> INSERT INTO `ftpgroup` (`groupname`, `gid`, `members`) VALUES ('ftpgroup', 3001, 'ftpuser');
mysql> INSERT INTO `ftpuser` (`id`, `userid`, `passwd`, `uid`, `gid`, `homedir`, `shell`, `count`, `accessed`, `modified`) VALUES (1, 'firstuser', PASSWORD('userpassword'), 3001, 3001, '/var/proftp/firstuser', '/sbin/nologin', 0, '', '');
Adesso settiamo la $HOME del nostro utente e gli diamo i permessi corretti:
# mkdir /var/proftp
# chown ftpuser:ftpgroup /var/proftp
# chmod 775 /var/proftp
Procediamo Adesso con il setup del nostro demone FTP. Per prima cosa ci spostiamo in /etc/proftpd ed editiamo modules.conf scommentando il modulo relativo a Mysql, dopodiche’ creiamo un nuovo file mysql.conf e lo editiamo inserendo al suo interno:
#Force the use of mysql backend
SQLBackend mysql
# The passwords in MySQL are using its own PASSWORD function
SQLAuthTypes Backend
SQLAuthenticate users* groups*
# details to connect to mysql db
# dbname@host dbuser dbpass
SQLConnectInfo proftpddb@localhost proftpduser proftpdpassword
# Let proFTPd know the name of the columns in the user table
# Mind that this need to match the name in you table
SQLUserInfo ftpuser userid passwd uid gid homedir shell
# Let proFTPd know the name of the columns in the group table
# we want it to interact with. Again the names match with those in the db
SQLGroupInfo ftpgroup groupname gid members
# proftpd will dynamicaly create if the homedir does not yet exist
SQLHomedirOnDemand on
# update counter when a user logs in
SQLLog PASS updatecount
SQLNamedQuery updatecount UPDATE "count=count+1, accessed=now() WHERE userid='%u'" ftpuser
# change modified time anytime a user delete a file or upload one
SQLLog STOR,DELE modified
SQLNamedQuery modified UPDATE "modified=now() WHERE userid='%u'" ftpuser
Salviamo ed editiamo proftpd.conf inserendo subito dopo Include /etc/proftpd/modules.conf:
Include /etc/proftpd/mysql.conf
RootLogin off
RequireValidShell off
Adesso restartiamo il servizio e siamo pronti ad effettuare il primo test
Mysql & log delle transazioni
I file in questione sono log binari delle transazioni che hanno modificato lo stato dei database presenti sul vostro DBM(cfr http://dev.mysql.com/doc/refman/5.0/en/binary-log.html ). Questi files sono utilizzati come backup del DBM e per la sincronizzazione tra master e slave servers. Di norma questi file non vengono creati, a meno che non vi sia una opzione specifica nel my.cnf:
log-bin=mysql-bin
il valore ‘mysql-bin’ rappresenta il nome del file, a cui mysql assegnera’ una estensione numerica progressiva.
Commentando questa opzione i file non saranno piu’ prodotti. Per cancellarli si puo’ usare lo stesso mysql:
- Loggarsi sul server come root
-
PURGE MASTER LOGS TO 'mysql-bin.000010';
Con la variabile di ambiente expire_logs_days nel file my.cnf e’ possibile controllare per quanti giorni i log potranno strare sulla nostra macchina
Ecco come ho impostato la variabile in uno dei miei my.cnf:
# Giorni per la conservazione dei log binari
expire_logs_days 3
Un bel restart di mysql e il gioco e’ fatto.
Resettare la password di MySQL
Gi? in un paio di occasioni mi ? capitato di dover resettare la password di root di MySQL di un cliente in quanto se l’era come dire … ehm … si, dimenticata … mi appunto qui di seguito la procedura per una macchina Debian, ma non cambia molto per altre distribuzioni:
come prima cosa stoppiamo il DB:
#/etc/init.d/mysql stop
dopodich? lo riavviamo nel seguente modo:
#mysqld_safe –skip-grant-tables –skip-networking &
e ci colleghiamo con:
#mysql -u root
e per cambiare la password di root:
mysql> update mysql.user set password=password(“lanuovapassword”) where user=”root”;
mysql> FLUSH PRIVILEGES;
e adesso riavviamo il DB nel modo corretto:
#killall mysqld
#/etc/init.d/mysql stop
#/etc/init.d/mysql start
see you!