Database page corruption

Issue

Database page corruption on disk or a failed file read of page [page id: space=0, page number=290]. You may have to recover from a backup.

Fix

  1. Stop the affected MySQL service:
1
service mysql stop

Back up all the MySQL data storage files. By default, they are located in /var/lib/mysql/

For example:

1
2
mkdir /root/mysql_backup
cp -a /var/lib/mysql/* /root/mysql_backup/

Set the innodb_force_recovery value under the [mysqld] section in the MySQL configuration file. This option will allow you to start MySQL service and create all databases dump.

For example:

1
2
vi /etc/my.cnf 
[mysqld] innodb_force_recovery = 2

Start the MySQL service.

If the service fails to start, set the parameter innodb_force_recovery to greater value and try starting MySQL again.
Value of the parameter innodb_force_recovery can be from 1 to 6.
Warning: Only set innodb_force_recovery to a value greater than 0 in an emergency situation, so that you can start InnoDB and dump your tables. Values of 4 or greater can permanently corrupt data files. Therefore, increase this value incrementally, as necessary. Please see more details in the official MySQL Documentation.
If the service fails to start with an error like:
InnoDB: Waiting for the background threads to start
Add directive innodb_purge_threads according to the following article: Unable to start MySQL service: InnoDB: Waiting for the background threads to start

Try to dump all databases:

1
2
3
4
5
mysql -Ns -u***  -Ne"show databases"|grep -v information_schema | grep -v performance_schema > /root/db_list.txt

mkdir /root/db_backup/

cat /root/db_list.txt | while read i; do mysqldump -u*** "$i" --routines --databases > /root/db_backup/"$i".sql; echo $i; sleep 5; done

If the dump fails with an error like:

1
Incorrect information in file: './psa/APSApplicationItems.frm' when using LOCK TABLES

then increase innodb_force_recovery value, restart MySQL service, and try to dump the databases again. It is better to dump databases one by one, separately. In that case, there is no need to go through restore of all databases once again if restore failed for some reason. If unable to dump the databases, then try using method II (Copy table content) or III (Restore from the backup) which are described below.

Remove all the MySQL data storage files except the mysql folder. For example:

rm -rf ls -d /var/lib/mysql/* | grep -v "/var/lib/mysql/mysql"

Remove the innodb_force_recovery option from the MySQL configuration file.

Restart the MySQL service:

1
service mysqld restart

Check the MySQL log file for any errors.

Restore databases from the dumps. For example:

1
for db in `cat /root/db_list.txt`; do echo -e "Importing $db..."; mysql -u*** < /root/db_backup/$db.sql; done

Dovecot not work with samsung app

Issue

Samsung App Email App - Cannot set up Plesk mail IMAP account in Outlook: SASL DIGEST-MD5 authentication failed: authentication failure

Fix

  1. Login to Plesk server over SSH

  2. Create a custom configuration file and place the auth_mechanisms parameter without digest-md5:

    # vi /etc/dovecot/conf.d/00-auth_mechs.conf

    auth_mechanisms = plain login cram-md5 apop

  3. Restart Dovecot to apply the configuration changes:

    # service dovecot restart

TX-35-DTH mit JeeLink und FHEM verbinden

Der JeeLink kann unter The JeeLabs Shop bestellt werden. Die Lieferung dauert ca. 1-2 Wochen. Das anlernen des JeeLink funktioniert unter Linux recht einfach, da die Treiber schon vorhanden sind. Einfach den JeeLink anschließen und mit dmesg | tail -50 schauen ob er angelernt wurde und auf welchem Port. Dann diesen Port

stty 57600 raw -echo </dev/ttyUSB0
cat </dev/ttyUSB0

verbinden und es sollte eine Ausgabe erscheinen. Sollte ein bash: /dev/ttyUSB0: Permission denied kommen, helfen die folgenden beiden Befehle:

sudo adduser yourusername dialout
sudo chmod a+rw /dev/ttyUSB0

Danach sollte die Fehlermeldung nicht mehr auftauchen. Damit man nun den JeeLink mit dem TX-35 verbinden kann, muss dieser geflashed werden - dazu gibt es zwei Möglichkeiten. Zum einen mit der Arduino IDE und den LaCrosse und JeeLink Sketches. Dieser Weg hat bei mir aber leider nicht funktioniert. Alternative kann man sich einfach FHEM installieren. Neben fhem sollte man noch das Package avrdude installieren um den JeeLink flashen zu können: sudo apt-get install avrdude fhem Nach der Installation ruft man http://fhem-host:8083/fhem (fhem durch den eigenen hostname ersetzten) auf. Dort gibt man dann folgendes in die Commando Zeile ein:

define jeeLink JeeLink /dev/ttyUSB1@57600

ttyUSB1 und 57600 gegebenenfalls anpassen - falls bei dmesg andere Werte ausgegeben wurden.

set jeeLink flash LaCrosse

Danach sollte der JeeLink in FHEM vorhanden sein. Mit attr jeeLink initCommands 30t 0a v wird der Toggle Modus aktiviert und die LED deaktiviert (0a v). Das Pairing kann nun mit einer Zeit von 60 Sekunden gestartet werden: set jeeLink LaCrossePairForSec 60 Nach dem herausnehmen und wiedereinlegen der Batterien sollte der TX-35-DTH erkannt werden. Die Werte werden in einer Log Datei unter /opt/fhem/log/NameDesGeraetes-2017.log gespeichert.

Raspberry Pi mit einer Wetterstation ws1080/wh1080 verbinden

Es gibt viele Blogs mit Anleitungen wie man eine Wetterstation vom Typ ws1080/wh1080/ws3000 etc. mit einem Raspberry pi verbindet. Ich habe meinen Anleitung nun als Ansible Playbook unter https://github.com/lightszentip/ansible-playbook-weather1080 veröffentlicht. Somit kann schnell und einfach zwischen dem Raspberry pi 2 und Raspberry pi 3 gewechselt werden und auch eine Neuinstallation ist nicht mehr Aufwendig. Der Vorteil von Ansible ist das man diese Anleitung schnell und einfach an die verschiedenen Wetterstationen anpassen kann. Zudem ist ein Script enthalten um die Daten von der WH1080/Ws1080 in eine mysql Datenbank zu speichern. Damit hat man die Daten in einem einfachen Format und kann diese an anderen Stellen leicht und einfach wieder verwenden. Es muss dafür nicht eine Software mit manueller Eingabe verwendet werden um die Daten aus der Wetterstation auszulesen.

Use password with ansible - security

Mit ansible-vault createsecrethostgroupOne kann man sein Passwort verschlüsseln: createsecrethostgroupOne = Name der Variable für das Passwort um es später im Script oder der config zu nutzen. Wenn man create secrethostgroupOne oder edit secrethostgroupOne aufruft muss man ein vault Passwort festlegen. Danach wird ein Editor geöffnet wo man folgendes eingibt:

ansible_sudo_pass: deinsudiopassword

Dann im Script:

vars_files:
-secrethostgroupOne

angeben. Damit beim ausführen des Playbooks auch das Passwort beachtet wird, muss man eine Datei vault.txt anlegen (gleiche Ebene wie das playbook) und dort das vault Passwort eintragen. Danach kann man dann mit dem Zusatz:

–vault-password-file=vault.txt

das eingeben des sudo Passwortes einfach überspringen .

SSH Key an alle hosts in ansible/hosts kopieren

Wenn man Ansible verwendet, benötigt man den lokalen ssh public key auf allen in der hosts Datei eingetragen Knoten - außer man verwendet das ansible_ssh_pass. Damit man aber nicht für jeden Knoten einzeln ssh-copy-id aufrufen muss, hilft das folgenden Pyhton Script: Die komplette Datei findet ihr unter https://gist.github.com/lightszentip/881593f03a7e3d1b107e3be889547941 Das Script baut auf der Datei von Jiri Tyr hostfile.py auf, welches eine hosts Datei parsed. Der Aufruf sieht wie folgt aus:

python hostfile.py –filename pathtofilehosts –keypath pathtoid_rsa.pub

Falls man es auf eine Gruppe einschränken möchte, kann man auch noch –group Groupname mitgeben (dieser ist aber optional). Als Beispiel:

python hostfile.py –filename /etc/ansible/hosts –keypath ~/.ssh/id_rsa.pub –group database

Wie ihr den ssh key generiert, seht ihr unter adding-your-ssh-key-to-the-ssh-agent und den public key vom private key gibt es mit

ssh-keygen -y -f ~/.ssh/id-database_rsa > ~/.ssh/id-database_rsa.pub

Das ganze könnt ihr dann mit

ansible all -m ping

testen.