Tag Archive for 'mysql'

SQL: get the database size

I’m going on writing primitive posts about the fascinating world of relational database management systems. :)

MySQL, size of all databases:

mysql> SELECT table_schema \
       "Database name", \
       sum( data_length + index_length ) / 1024 / 1024 \
       "Data Base Size in MB" FROM \
       information_schema.TABLES GROUP BY table_schema;
+--------------------+----------------------+
| Database name      | Data Base Size in MB |
+--------------------+----------------------+
| fluxbb             |           0.04585648 |
| information_schema |           0.00781250 |
| mysql              |           0.60614872 |
| wordpress          |           2.22493362 |
+--------------------+----------------------+
4 rows in set (0.13 sec)

PostgreSQL, size of all databases:

cdr=> SELECT pg_database.datname,pg_size_pretty(pg_database_size(pg_database.datname)) \
      AS size FROM pg_database;
  datname  |  size   
-----------+---------
 template1 | 6705 kB
 template0 | 6697 kB
 postgres  | 6820 kB
 cdr       | 28 GB

Size of ‘acme_cdr’ table:

cdr=> SELECT pg_size_pretty(pg_total_relation_size('acme_cdr'));
 pg_size_pretty 
----------------
 28 GB

MySQL: myisamchk

Decided to get better knowledge of MySQL with crawling on http://dev.mysql.com/doc/refman/YOUR_VERSION/en/ , for example http://dev.mysql.com/doc/refman/5.7/en/ .

Before MySQL 5.5.5, MyISAM was the default storage engine. (The default was changed to InnoDB in MySQL 5.5.5.)
One of my deployments uses MySQL version prior to 5.5.5. While reading the documentation I found a nice utility, ‘myisamchk‘ and instantly decided to check with it one of *.MYI files. I was a little bit astonished when the utilite showed me some problems with one of files, while everything worked fine. This is the silent mode, only errors (if found) are showed:

root@zenwalk:~# myisamchk -s /var/lib/mysql/webapp/doityourself.MYI
myisamchk: MyISAM file /var/lib/mysql/webapp/doityourself.MYI
myisamchk: warning: 12 clients are using or haven't closed the table properly
MyISAM-table '/var/lib/mysql/webapp/doityourself.MYI' is usable but should be fixed

Normal mode:

root@zenwalk:~# myisamchk /var/lib/mysql/webapp/doityourself.MYI
Checking MyISAM file: /var/lib/mysql/webapp/doityourself.MYI
Data records:     170   Deleted blocks:       2
myisamchk: warning: 12 clients are using or haven't closed the table properly
- check file-size
- check record delete-chain
- check key delete-chain
- check index reference
- check data record references index: 1
- check data record references index: 2
- check record links
MyISAM-table '/var/lib/mysql/webapp/doityourself.MYI' is usable but should be fixed

So, let’s recover the .MYI file. Fire!

root@zenwalk:~# myisamchk --recover /var/lib/mysql/webapp/doityourself.MYI
- recovering (with sort) MyISAM-table '/var/lib/mysql/webapp/doityourself.MYI'
Data records: 170
- Fixing index 1
- Fixing index 2

И снова про обновление WordPress

Мануалов море, тем, кто привык всё делать в консоли, наиболее понятным будет вот этот: http://codex.wordpress.org/UNIX_Shell_Skills#Upgrading_WordPress_from_the_Shell

В нём только забыли напомнить сделать бэкап БД. И лишь уведомление “Необходимо обновить базу данных. Нажмите “Обновить” для обновления” насторожит внимательного :) А те, кто не только внимательны, но и разумны, делают бэкапы регулярно :)

Итак, если вы просто внимательны, то предварительно сохраняем резервную копию нашей базы (будет полагать, что мы используем MySQL, а имя базы нашего блога – wordpress):

mysqldump -u root -p wordpress > /some/path/to/backup/dir/wordpress_db_backup.sql

А вообще про создание/восстановление из бэкапа коротко и ясно написано здесь: http://www.thegeekstuff.com/2008/09/backup-and-restore-mysql-database-using-mysqldump/

MySQL: смотрим список пользователей

Заходим в mysql под пользователем root , в базу mysql:

mysql -u root -p mysql

И смотрим всю информацию о пользователях (хранится она, как можно понять, в базе под одноименным названием “mysql”, в таблице “user”):

mysql> select * from user;

Этот запрос выведет достаточно много информации, которая некрасиво умещается на экране. Поэтому сначала можно посмотреть список колонок этой таблицы:

mysql> describe user;

… а потом сделать запрос только по интересующим нас колонкам:

mysql> select host,user from user;
+-----------+------------------+
| host      | user             |
+-----------+------------------+
| 127.0.0.1 | root             |
| lexus     | root             |
| localhost | debian-sys-maint |
| localhost | root             |
+-----------+------------------+
4 rows in set (0.00 sec)

Creating user petrov_ak, who will connect from anywhere (%):

mysql> CREATE USER 'petrov_ak'@'%' IDENTIFIED BY 'pAsSwOrD';
Query OK, 0 rows affected (0.00 sec)

Grant privileges. Let him SELECT only from DB ‘asterisk’, table ‘cdr’:

mysql> GRANT SELECT ON asterisk.cdr TO 'petrov_ak'@'%';
Query OK, 0 rows affected (0.00 sec)

MySQL: меняем тип столбца, переименовываем таблицу и др.

Меняем тип столбца под названием “ip” на VARCHAR(20) (был INT):

mysql> ALTER TABLE ubuntu_users MODIFY ip VARCHAR(20);

Разумеется, предполагается, что мы находимся в конкретной БД (mysql> use dbname;), содержащей таблицу “ubuntu_users”.

Подробнее тут: http://mysqlru.com/reference/data-definition/alter-table.html

О типах данных читать тут http://mysqlru.com/reference/column-types.html

===============================

Переименовываем таблицу из ubuntu_users  в ubuntu_victims:

mysql> ALTER TABLE ubuntu_users RENAME ubuntu_victims;

Подробнее тут http://mysqlru.com/reference/data-definition/rename-table.html

===============================

Добавляем столбец с названием “comment” и типом VARCHAR(50) :

mysql> ALTER TABLE ubuntu_users ADD comment VARCHAR(50);

===============================

Удаляем столбец с именем “comment”:

mysql> ALTER TABLE ubuntu_users DROP COLUMN comment;

===============================

Добавить новый числовой столбец AUTO_INCREMENT с именем "count":

mysql> ALTER TABLE ubuntu_users ADD count INT UNSIGNED NOT NULL AUTO_INCREMENT, ADD INDEX (comment);

Заметьте, что столбец "comment" индексируется, так как столбцы AUTO_INCREMENT должны быть индексированы, кроме того, столбец "comment" объявляется как NOT NULL, поскольку индексированные столбцы не могут быть NULL.

При добавлении столбца AUTO_INCREMENT значения этого столбца автоматически заполняются последовательными номерами (при добавлении записей).

Подробнее о команде SET: http://mysqlru.com/mysql-optimisation/optimising-the-server/set-option.html

==============================

Удаляем БД:

mysql> DROP DATABASE dbname;

http://mysqlru.com/reference/data-definition/drop-database.html

===============================

Получаем информацию о столбцах таблицы “ubuntu_users”:

mysql> DESCRIBE ubuntu_users;

===============================

Устанавливаем значение по умолчанию :
mysql> ALTER TABLE ubuntu_users MODIFY comment varchar Default ‘this is comment’;