しがないエンジニアのつぶやき

某IT企業でシステムエンジニアをしてます。 メイン担当はデータベースです。 色々な技術情報をメモしていこうと思っています。

2013年09月

mysqldumpコマンドで、--no-dataのオプションを使用することで、該当データベースの表定義だけを取得することができるよ!

こんな感じ。

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| test      |
| mysql              |
| performance_schema |
+--------------------+

testデータベースの表定義をぬきだそう!

$ mysqldump -u root -p --no-data test > /tmp/test.sql

testデータベースの表のみを取得。
これを適用する場合はこんな感じ。

$ mysql -u root -p
mysql > create database test;
mysql > use test;
mysql > source /tmp/test.sql

sourceでtestデータベースの表を読み込んだらOK.
ちなみに、この場合はデータベースのdropやcreateは含まれないので、手動で作成等が必要になります。

Oracleの表領域の使用率を確認したい!というときは下記を実行すればすぐに確認ができるよ。

下記をそのまま実行でOK。
-------------------------------------
set pages 999
set line 200
col 表領域名 for a10
col 容量(Mバイト) for a15
col 使用量(Mバイト) for a15
col 空き容量(Mバイト) for a20
col 使用率(%) for a15

SELECT d.tablespace_name "表領域名", TO_CHAR((a.bytes / 1024 / 1024),'99,999,990') "容量(Mバイト)",
TO_CHAR(((a.bytes - DECODE(f.bytes, NULL, 0, f.bytes)) / 1024 / 1024),'99,999,990') "使用量(Mバイト)" ,
TO_CHAR((f.bytes / 1024 / 1024),'99,999,990') "空き容量(Mバイト)",
TO_CHAR((a.bytes - f.bytes) / a.bytes * 100,'990.00') "使用率(%)"
FROM  sys.dba_tablespaces d, sys.sm$ts_avail a, sys.sm$ts_free f
WHERE  d.tablespace_name = a.tablespace_name
AND f.tablespace_name (+)= d.tablespace_name;
-------------------------------------

日本語で文字化けするときは、下記でいいかな?

文字化け対応版
-------------------------------------
set pages 999
set line 200
col NAME for a10
col youryou(MB) for a15
col siyou(MB) for a15
col aki(MB) for a20
col siyouritu(%) for a15

SELECT d.tablespace_name "NAME", TO_CHAR((a.bytes / 1024 / 1024),'99,999,990') "youryou(MB)",
TO_CHAR(((a.bytes - DECODE(f.bytes, NULL, 0, f.bytes)) / 1024 / 1024),'99,999,990') "siyou(MB)" ,
TO_CHAR((f.bytes / 1024 / 1024),'99,999,990') "aki(MB)",
TO_CHAR((a.bytes - f.bytes) / a.bytes * 100,'990.00') "siyouritu(%)"
FROM  sys.dba_tablespaces d, sys.sm$ts_avail a, sys.sm$ts_free f
WHERE  d.tablespace_name = a.tablespace_name
AND f.tablespace_name (+)= d.tablespace_name;
-------------------------------------

これを定期的に取得していれば、表領域の成長具合も分かって表領域の拡張も計画的にできるね。

MySQLで準同期レプリケーション組んで、複数のスレーブDBを複製するためたまたま仮想サーバだったのでクローンして数台増やしたところ、下記のメッセージがマスター側で大量に出力されてた。

------- 2013-08-23 22:17:51 5705 [Note] Stop asynchronous binlog_dump to slave (server_id: 2199) 2013-08-23 22:17:51 5705 [Note] Start asynchronous binlog_dump to slave (server_id: 2199), pos(mysql-bin.000015, 120) 2013-08-23 22:17:51 5705 [Note] Stop semi-sync binlog_dump to slave (server_id: 2103) 2013-08-23 22:17:51 5705 [Note] Start semi-sync binlog_dump to slave (server_id: 2103), pos(mysql-bin.000015, 120) ------- 上記メッセージが1秒に30行以上出続ける。やばいよ、すぐにエラーログがいっぱいに。。
一応マスタDBでエラーログの監視はしてたが、ステータスがNoteなので検知できず。。

で、本エラーが出る原因は主に2つであることが調査してすぐにわかりました。 1.server-idが被った場合。 2.uuidが被った場合。
server-idはmy.cnfでserver-idパラメータを全サーバで分けてるのでここは影響をうけないはず!
では、uuidか?

複数のスレーブDBのuuidを確認。

・スレーブDB 1台目

mysql> show variables like 'server_uuid'; +---------------+--------------------------------------+ | Variable_name | Value | +---------------+--------------------------------------+ | server_uuid | 17e7fe43-0bbf-11e3-8f75-df9b683ae8de | +---------------+--------------------------------------+

・スレーブDB 2台目

mysql> show variables like 'server_uuid'; +---------------+--------------------------------------+ | Variable_name | Value | +---------------+--------------------------------------+ | server_uuid | 17e7fe43-0bbf-11e3-8f75-df9b683ae8de | +---------------+--------------------------------------+
いっしょじゃん!
これが原因で出力されていることが分かった。
結局のところdatadir配下で自動作成されるauto.cnfが原因であることが分かった。
クローンで作ったサーバだから削除を忘れてたよ・・。

なので、auto.cnfを削除してMySQLを再起動したところuuidが自動で割り当てられて、マスタ側の大量のログ出力がストップした!

ちなみにauto.cnfの中身はこんな感じ。
[auto]
server-uuid=17e7fe43-0bbf-11e3-8f75-df9b683ae8de

う~ん、MySQL5.6の機能GTIDでuuidを割り当てる必要があるために自動で作成されるファイルのようだが、不要なファイルは削除しないとトラブルの種だね。

某企業のSEとして業務しています!
日々追われる生活をしていますが、気軽に色々とつぶやいていこうと思います。

このページのトップヘ