MySQL replicatie resetten

Als de replicatie, om wat voor reden dan ook, niet meer werkt, dan kan deze op onderstaande wijze hersteld worden.

Op de master

sudo mysql -u root -p
mysql> RESET MASTER;
mysql> FLUSH TABLES WITH READ LOCK;
mysql> SHOW MASTER STATUS;

Belangrijk is nu om de File en Position te onthouden, te zien in het overzicht.

Open nu een nieuw terminalvenster, om zeker te weten dat de inhoud van de database ondertussen niet kan wijzigen en maak een dump van alle databases:

mysqldump -u root -p --all databases > /pad/mysqldump.sql

Nu kun je de lock vrijgeven:

mysql> UNLOCK TABLES;

Op de slave

sudo mysql -u root -p
mysql> STOP SLAVE;
mysql> EXIT

Nu kun je op de slave de dump importeren:

sudo mysql -u root -p < /pad/mysqldump.sql

Nu kunnen we de slave opnieuw starten:

sudo mysql -u root -p
mysql> RESET SLAVE;
mysql> CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=2404;

Let op dat je op de oranje plaatsen de eerder verkregen waarden van File en Position vanaf de master invult.

mysql> START SLAVE;

Done! ✅

MySQL replicatie instellen

Als jouw gegevens steeds belangrijker worden, dan is replicatie van jouw MySQL databases natuurlijk geen overbodige luxe. Onderstaande stappen toont hoe replicatie in te stellen op Ubuntu 20.04. Ik ga er hierbij van uit dat MySQL op zowel de Master als Slave al geïnstalleerd zijn.

Op de master

Wijzig de MySQL-configuratie.

sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

Wijzig de regel server-id naar:

server-id = 1

Het kan ook nodig zijn om het bind-address aan te passen. Als deze op 127.0.0.1 staat, dan is het namelijk onmogelijk om extern verbinding te maken. Pas deze in dit geval dan aan naar het lokale netwerkadres, bijvoorbeeld:

bind-address = 192.168.0.104

Voeg aan het einde van het bestand de volgende regels toe:

log_bin = /var/log/mysql/mysql-bin.log
log_bin_index =/var/log/mysql/mysql-bin.log.index
relay_log = /var/log/mysql/mysql-relay-bin
relay_log_index = /var/log/mysql/mysql-relay-bin.index

Herstart de MySQL service om de wijzigingen door te voeren:

sudo systemctl restart mysql

Open MySQL:

sudo mysql -u root -p

Maak nu een gebruiker voor replicatie aan:

mysql> CREATE USER replication_user@192.168.0.10 IDENTIFIED BY 'wachtwoord';

Vervang de oranje velden naar de juiste waarden, waarbij het bovenstaande IP adres vervangen moet worden naar het adres van de MySQL Replication Slave.

Geef de nieuwe gebruiker nu replicatie-rechten:

mysql> GRANT REPLICATION SLAVE ON *.* TO replication_user@192.168.0.10;
mysql> FLUSH PRIVELEGES;

Vervang in bovenstaande opdrachten de oranje velden naar de eerder aangemaakte gebruiker met het juiste IP-adres.

Je kunt controleren of de rechten juist toegekend zijn:

mysql> SHOW GRANTS FOR replication_user@192.168.0.10;

MySQL geeft dan als het goed is onderstaande uitvoer:

+---------------------------------------------------------------------+
| Grants for replication_user@192.168.0.10                            |
+---------------------------------------------------------------------+
| GRANT REPLICATION SLAVE ON *.* TO `replication_user`@`192.168.0.10` |
+---------------------------------------------------------------------+
1 row in set (0.01 sec)

De Master is nu juist geconfigureerd.

Op de Slave

Wijzig de MySQL-configuratie.

sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

Wijzig de regel server-id naar:

server-id = 2

Voeg onderstaande regels aan het einde toe:

read_only = 1
log_bin = /var/log/mysql/mysql-bin.log
log_bin_index =/var/log/mysql/mysql-bin.log.index
relay_log = /var/log/mysql/mysql-relay-bin
relay_log_index = /var/log/mysql/mysql-relay-bin.index

In het verleden ben ik de regel read_only = 1 eens vergeten. Zonder deze regel kunnen de gegevens in de Slave aangepast worden wat natuurlijk niet de bedoeling is en ervoor zorgt dat replicatie stopt.

Herstart de MySQL service om de wijzigingen door te voeren:

sudo systemctl restart mysql

Kijk nu op de Master naar de status van het replicatie-proces. Onthoud hierbij het bestand (File) en de positie (Position).

mysql> SHOW MASTER STATUS\G

Je krijgt uitvoer die er ongeveer zo uitziet:

*************************** 1. row ***************************
             File: mysql-bin.000001
         Position: 8149807

     Binlog_Do_DB:
 Binlog_Ignore_DB:
Executed_Gtid_Set:
1 row in set (0.00 sec)

Ga terug naar de Slave.

Open MySQL:

sudo mysql -u root -p

Configureer de Slave voor replicatie:

mysql> CHANGE MASTER TO MASTER_HOST='192.168.0.104', MASTER_USER='replication_user', MASTER_PASSWORD='wachtwoord', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=8149807;

Velden in oranje zijn eerder verkregen/ingestelde waarden. Start de Slave:

mysql> START SLAVE;

Je kunt de status van de Slave controleren:

mysql> SHOW SLAVE STATUS\G

Als achter Slave_IO_Running en Slave_SQL_Running de waarde Yes staat, dan betekent dit dat alles naar behoren werkt:

Slave_IO_Running: Yes
Slave_SQL_Running: Yes

Done! ✅

Problemen Sudo Ubuntu 20.04 Raspberry Pi 4

Omdat mijn Ubuntu 20.04 server installatie op de Raspberry Pi ineens problemen met sudo had en ik hier lange tijd mee bezig geweest ben om dit op te lossen, deel ik hierbij de genomen stappen om dit te verhelpen.

Op de Raspberry Pi zelf inloggen met een gebruikersaccount en vervolgens:

systemctl rescue

Je komt nu in rescue mode. Enter door totdat je opnieuw in de shell bent.

Voer volgende opdracht uit:

chown root:root /usr/bin/sudo && chmod 4755 /usr/bin/sudo

Als het goed is werkt nu alles na een reboot weer!

Tailwind CSS installeren

In de hoofdmap van het Laravel project voer je de volgende opdrachten uit:

npm install tailwindcss
npm install
npm run dev
npx tailwind init

Bestand webpack.mix.js verander je naar:

const mix = require('laravel-mix');
const tailwindcss = require('tailwindcss');


mix.js('resources/js/app.js', 'public/js')
    .postCss('resources/css/app.css', 'public/css', [
        require('tailwindcss'),
    ]);

i

Open resources/css/app.css en plaats de volgende code:

@tailwind base;
@tailwind components;
@tailwind utilities;

Voer daarna opnieuw de volgende opdracht uit:

npm run dev

Database instellen

De database-instellingen voor Laravel moeten ingesteld worden in de volgende bestanden:

.env

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=

/config/database.php

 'default' => env('DB_CONNECTION', 'mysql'),

 'mysql' => [
            'driver' => 'mysql',
            'url' => env('DATABASE_URL'),
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE', 'forge'),
            'username' => env('DB_USERNAME', 'forge'),
            'password' => env('DB_PASSWORD', ''),
            'unix_socket' => env('DB_SOCKET', ''),
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
            'prefix' => '',
            'prefix_indexes' => true,
            'strict' => true,
            'engine' => null,
            'options' => extension_loaded('pdo_mysql') ? array_filter([
                PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
            ]) : [],
        ],

Nieuw Laravel-project opstarten

Om een Laravel project te starten zijn PHP en Composer nodig. Ik ga er van uit dat PHP al geinstalleerd is. Om composer te installeren kun je volgende opdrachten gebruiken (getest op Raspbian 8 Jessie):

wget -O composer-setup.php https://getcomposer.org/installer
sudo php composer-setup.php --install-dir=/usr/local/bin --filename=composer
rm -rf composer-setup.php

Na succesvolle installatie van Composer kun je een Laravel project aanmaken:

composer create-project laravel/laravel <projectnaam>

Om project met naam dennisbor-laravel te maken gebruik je dus volgende opdracht:

composer create-project laravel/laravel dennisbor-laravel

Na enige tijd is het project aangemaakt en is de subfolder met de projectnaam aangemaakt. Open de map via:

cd dennisbor-laravel

Je kunt het project nu starten met volgende opdracht:

php artisan serve

Er wordt nu getoond hoe het project te bereiken is:

[Sun May 16 13:03:56 2021] PHP 8.0.5 Development Server (http://127.0.0.1:8000) started

Je kunt natuurlijk ook zorgen dat je via je huidige webserver het project kunt bereiken, zorg er dan wel voor dat de ‘/public’ map de root-map wordt.

Belangrijk is ook dat de webserver kan schrijven naar de mappen ‘storage’ en ‘bootstrap/cache’.