Mysql Trouble shooting
This blog basically deals with the how to troubleshoot the problems related to the mysql.
Sunday, 19 February 2012
MySQL Backup Strategy.
Wednesday, 8 February 2012
How to recover a currupted InnoDB table.
The issue was as
mysql> check table City;
+-------------------+-------+----------+----------------------------------------------------------+
| Table | Op | Msg_type | Msg_text |
+-------------------+-------+----------+----------------------------------------------------------+
| world_innodb.City | check | Error | Incorrect information in file: './world_innodb/City.frm' |
| world_innodb.City | check | error | Corrupt |
+-------------------+-------+----------+----------------------------------------------------------+
2 rows in set (0.00 sec)
Then I Created a test scenario and found solution
I created a table called test2
CREATE TABLE `test2` ( `t` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
I then inserted one record
insert into test2 values(1);
I stopped MySQL and then added a bunch of characters to the test2.frm file with vi.
I then started MySQL and saw the following
mysql> show table status \G;
*************************** 1. row ***************************
Name: test2
Engine: NULL
Version: NULL
Row_format: NULL
Rows: NULL
Avg_row_length: NULL
Data_length: NULL
Max_data_length: NULL
Index_length: NULL
Data_free: NULL
Auto_increment: NULL
Create_time: NULL
Update_time: NULL
Check_time: NULL
Collation: NULL
Checksum: NULL
Create_options: NULL
Comment: Incorrect information in file: './test2/test2.frm'
I then created another table with the same structure
CREATE TABLE `test3` ( `t` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
I then stopped mysql and copied test3.frm over test2.frm
cp /var/lib/mysql/testdb/test3.frm /var/lib/mysql/testdb/test2.frm
I restarted MySQL and had access to test2
mysql> show table status \G;
*************************** 1. row ***************************
Name: test2
Engine: InnoDB
Version: 10
Row_format: Compact
Rows: 1
Avg_row_length: 16384
Data_length: 16384
Max_data_length: 0
Index_length: 0
Data_free: 25675431936
Auto_increment: NULL
Create_time: 2012-02-07 16:24:20
Update_time: NULL
Check_time: NULL
Collation: latin1_swedish_ci
Checksum: NULL
Create_options:
Comment:
Here is the record that I inserted
mysql> select * from test2;
+------+
| t |
+------+
| 1 |
+------+
1 row in set (0.00 sec)
If you know the structure of the table City , you could create an identical table and then copy the .frm file over the existing corrupted one
Thursday, 1 December 2011
Step by step process for how to set the mk-heartbeat monitoring
Monday, 17 October 2011
MySQL replication set up
Wednesday, 12 October 2011
MySQL startup issue
If you are facing problem in starting the mysql server try to start mysqld with the option –verbose it will tell what is the problem or you can also check the problem by your error log file.
Take a case here
abdul@system:~$ mysqld --verbose --user=mysql –datadir=/var/lib/mysql/ &
[1] 2975
abdul@system:~$ 111013 10:42:35 [Warning] '--log_slow_queries' is deprecated and will be removed in a future release. Please use ''--slow_query_log'/'--slow_query_log_file'' instead.
111013 10:42:35 [Warning] Can't create test file /var/lib/mysql/OSS-240.lower-test
111013 10:42:35 [Warning] Can't create test file /var/lib/mysql/OSS-240.lower-test
mysqld: Can't change dir to '/var/lib/mysql/' (Errcode: 13)
111013 10:42:35 [ERROR] Aborting
111013 10:42:35 [Note] mysqld: Shutdown complete
Above wee see that we are getting error code 13.means its permission issue login as root and now try.
root@system:~$mysqld --verbose --user=mysql --datadir=/var/lib/mysql/ &
now mysql is running & working properly.
But one point you should consider in mind is that we have written –user=mysql.
Always try to start your mysql server as mysql user if you start it as root its not a good practice.
Tuesday, 11 October 2011
Restore your data using mysqlbinlogs
Its a simple article on How you can restore your data using mysql binary logs.
mysql binary logs contain a record of each SQL query executed against the database that changes data since the logs where last flushed (new log file started).MySQL Binary Logs must be enabled by passing the –log-bin option to mysqld.
The log contains queries like UPDATE and DELETE. The log does not record SELECT or SHOW queries for example because they do not change the database.
MySQL Binary Logs are some times confused with the InnoDB binary transaction log. InnoDB uses a binary log to journal changes to the InnoDB table space file(s) as a protection from crashes to protect table space data integrity.
When --log-bin is enabled even InnoDB transactions are written to the binary transaction log used for replication or restores.
At this time take a scenario you has binary logs as follows:
see the location where binary logs are stored.
localhost-bin.000001
localhost-bin.000002
localhost-bin.000003
localhost-bin.index
firstly lock the tables as
LOCK TABLES
then flush the logs as
FLUSH LOGS
At this time take a scenario you has binary logs as follows:
see the location where binary logs are stored.
localhost-bin.000001
localhost-bin.000002
localhost-bin.000003
localhost-bin.000004
localhost-bin.index
after flushing the logs a new bianry log generated as localhost-bin.000004.
Now upto binary log localhost-bin.000003 you can take the complete backup.
take the backup using any method that you want.
This is you complete backup upto the log localhost-bin.000003
Then unlock the tables as
UNLOCK TABLES
Restoring with Binary Logs
To restore from a point in time using binary logs you would:
Restore the database from the last SQL Dump completed before the desired recovery point.
Use mysqlbinlog to restore to the desired point in timewhere N is the log entry number you want to restore up to.
mysqlbinlog –start-position=N localhost-bin.000004 | mysql N is the position of binary log.
Monday, 10 October 2011
How to reduce the ibdata space in Mysql
Dump the Whole Database
This is the easiest method How to reclaim the ibdata space
In fact, this is the method I used to solve the problem. It requires much more space and time but it’s maybe the easiest one. So here it is:
Dump all databases by using:
mysqldump -uroot -proot --extended-insert --all-databases --add-drop-database --disable-keys --flush-privileges --quick --routines --triggers > all-databases.sql
Stop the MySQL server;
/etc/init.d/mysql stop
Rename or remove the MySQL data directory and create an empty one with the same name and permissions;
i.e In case the datadir is /var/lib/mysql then remove the all content of that.
else remove /var/lib/mysql and create other one with the same permission and same name.
Make the appropriate changes in my.cnf.
Re-initialize the database with the following command.
sudo -u root mysql_install_db
Start the MySQL server;
/etc/init.d/mysql start
Get into the ‘mysql‘ console and type:
SET FOREIGN_KEY_CHECKS=0;
SOURCE all-databases.sql;
SET FOREIGN_KEY_CHECKS=1;Restart the MySQL server.
At this point of time everything should be running fine.