Database Tips
Some common tricks for quick database optimizations
See what is slowing things down -
`show full processlist;
Creating Index in old databases
Sometimes adding index will give error when moving from 5.7 to 8 to change that you can set the sql_mode
SELECT @@SESSION.sql_mode; // See what is the current mode
// For ex for Date error
SET SESSION sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
ALTER TABLE `wp_posts` ADD INDEX `post_date_gmt` (`post_date_gmt`);
Upgradeing to InnoDB
Quick upgrade to InnoDB
SET @DATABASE_NAME = 'name_of_your_db';
SELECT CONCAT('ALTER TABLE `', table_name, '` ENGINE=InnoDB;') AS sql_statements
FROM information_schema.tables AS tb
WHERE table_schema = @DATABASE_NAME
AND `ENGINE` = 'MyISAM'
AND `TABLE_TYPE` = 'BASE TABLE'
ORDER BY table_name DESC;
You will get the queries for all the databases , execute them to convert the tables. If an error regarding the data then set sql_mode . That should resolve the issue .
Manually Creating Wordpress Database and login
To list the users -
SELECT User, Host FROM mysql.user;
log into mysql and -
CREATE DATABASE d_{name};
CREATE USER u_{name}@localhost IDENTIFIED BY '{password}';
GRANT ALL ON d_{name}.* TO u_{name}@locahost;
flush privileges;
sometimes grant will require password ( older versions )
GRANT ALL ON d_{name}.* TO u_{name}@locahost identifed by '{password}';
GRANT ALL PRIVILEGES ON d_{name}.* TO u_{name}@locahost WITH GRANT OPTION;
Manual setting up wordpress database
wp core install --title="Site Title" --url={domain_name} --admin_user=siteadmin --admin_password={password} --admin_email={email} --skip-email --allow-root
Flush Tables issue
Run command from /srv/www
find -maxdepth 3 -name "wp-config.php" -exec cat {} \; | grep DB_USER
Search replace using -
(u_[A-Z0-9]+)
GRANT RELOAD ON *.* TO '\1'@'localhost';
Run it inside mysql and it should work now . GRANT reload can only be global.
Importing databases
Import Single Database
mysql -uroot -D d_J2MK3T -o d_J2MK3T < db_dump.sql
Intsall mssql client
https://docs.microsoft.com/en-us/sql/connect/php/installation-tutorial-linux-mac?view=sql-server-ver15 https://docs.microsoft.com/en-us/sql/connect/php/microsoft-php-drivers-for-sql-server-support-matrix?view=sql-server-ver15#supported-operating-systems
Get the base ready
curl https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add -
curl https://packages.microsoft.com/config/ubuntu/16.04/prod.list | sudo tee /etc/apt/sources.list.d/msprod.list
apt-get update
apt-get install mssql-tools unixodbc-dev
Now lets install PHP modules
apt install php-pear
apt install php7.4-dev
pecl install sqlsrv
pecl install pdo_sqlsrv
# Create the file sqlsrv.ini and pdo_sqlsrv.ini in modsavailbile
# Create links in config
ln -s /etc/php/7.4/mods-available/pdo_sqlsrv.ini 20-pdo_sqlsrv.ini
ln -s /etc/php/7.4/mods-available/sqlsrv.ini 20-sqlsrv.ini
SSL Bug : https://github.com/microsoft/msphpsql/issues/1112#issuecomment-609972220
Database Recovery
This is to be done if the innodb mysql crashes. First try to do things without putting the DB in recovery mode. If it does not work move to steps below.
Stop Mysql , to copy its files
service stop mysql
cp -rf /var/lib/mysql /var/lib/mysql.orig
Add innodb_force_recovery = 1 in my.cnf under [mysqld] , you can increase value from 1 - 6 where mysql starts to work.
Dump all database names -
mkdir ~/recovery/
mysql -e 'show databases;' | grep -v information_schema | grep -v Database > ~/recovery/database_list.txt
Next dump all databases -
for db in `cat /mnt/temp_storage/database_list.txt`; do mysqldump --skip-lock-tables $db > /mnt/temp_storage/backup/$db.sql;done
Now we drop the databases -
for db in `cat /mnt/temp_storage/database_list.txt`; do mysqladmin drop $db ; done
Incase Database tale does not drop , please drop it manually , also move teh ibdata files
cd /var/lib/mysql
rm -rf database_name
mv /var/lib/mysql/ibdata1 /mnt/temp_storage/backup/
mv /var/lib/mysql/ib_logfile0 /mnt/temp_storage/backup/
mv /var/lib/mysql/ib_logfile1 /mnt/temp_storage/backup/
Remove innodb_force_recovery = 1 from my.cnf
Start mysql and create the datrabases
for db in `cat /mnt/temp_storage/database_list.txt`; do mysqladmin create $db ; done
Import all the databases
for db in `cat /mnt/temp_storage/database_list.txt`; do mysqldump $db < /mnt/temp_storage/backup/$db.sql;done
Repair Databases if any
mysqlcheck --repair --all-databases
The above should fix the issue hopefully .
Database Recovery 2
This menthod is the last resort , Incase the datable is very large and the mysql dump keeps failing. We will manually delete the databases.
innodb_force_recovery = 6
This is readonly mode mainly for dumping and not command which mae changes will work.
Step 1 is to run mysql check and see which databases it is faling.
service mysql stop
mysqlcheck -c -u root -p --all-databases
Mae a note of all databases which have errors , no move those databases out of the /var/lib/mysql directory .
mv d_AHDKIT ~/db_backup
mkdir d_AHDKIT
chown -R mysql:mysql d_AHDKIT
Now try starting mysql after removing innodb_force_recovery
service mysql start
Now drop the database with the errors.
DROP DATABASE d_AHDKIT;
Now you can recreate the database , grant priviliges to use and import from backup.
No Comments