Documentation Home
MySQL 5.6 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 26.8Mb
PDF (A4) - 26.9Mb
HTML Download (TGZ) - 7.1Mb
HTML Download (Zip) - 7.2Mb


5.2.7 サーバーログの保守

セクション5.2「MySQL Server ログ」で説明したように、MySQL Server は実行中のアクティビティーの内容を確認するのに役立ついくつかの異なるログファイルを作成することができます。ただし、多くのディスクスペースを占有しすぎないようにするために、これらのファイルを定期的にクリーンアップする必要があります。

ロギングを有効にして MySQL を使用しているとき、古いログファイルをときどきバックアップおよび削除して、新しいファイルへのロギングを開始するよう MySQL に指示することが必要な場合があります。セクション7.2「データベースバックアップ方法」を参照してください。

Linux (Red Hat) のインストールでは、これを行うために mysql-log-rotate スクリプトを使用できます。RPM 配布から MySQL をインストールした場合、このスクリプトは自動的にインストールされているはずです。レプリケーション用にバイナリログを使用している場合、このスクリプトには注意が必要です。バイナリログの内容がすべてのスレーブによって処理されたことに確信が持てるまでは、バイナリログを削除しないでください。

ほかのシステムでは、ログファイルを処理するための、cron (またはその同等物) で開始する短いスクリプトを自分でインストールする必要があります。

バイナリログの場合、指定した日数後にバイナリログファイルを自動的に期限切れにする expire_logs_days システム変数を設定できます (セクション5.1.4「サーバーシステム変数」を参照してください)。レプリケーションを使用している場合、スレーブがマスターよりも遅延できる最大日数を下回らないような変数を設定するようにしてください。バイナリログをオンデマンドで削除するには、PURGE BINARY LOGS ステートメントを使用します (セクション13.4.1.1「PURGE BINARY LOGS 構文」を参照してください)。

ログをフラッシュすることによって、MySQL が新しいログファイルを使用することを強制的に開始できます。ログのフラッシュは、FLUSH LOGS ステートメントを発行したり、mysqladmin flush-logsmysqladmin refreshmysqldump --flush-logs、または mysqldump --master-data コマンドを実行したりしたときに実行されます。セクション13.7.6.3「FLUSH 構文」セクション4.5.2「mysqladmin — MySQL サーバーの管理を行うクライアント」、およびセクション4.5.4「mysqldump — データベースバックアッププログラム」を参照してください。さらに、バイナリログは、サイズが max_binlog_size システム変数の値に達するとフラッシュされます。

FLUSH LOGS は、個々のログの選択的なフラッシュを可能にするためのオプションの修飾子をサポートします (FLUSH BINARY LOGS など)。

ログのフラッシュ操作は、次のことを実行します。

  • ログファイルに対する一般クエリーロギングまたはスロークエリーロギングが有効化されている場合、サーバーは一般クエリーログファイルまたはスロークエリーログファイルを閉じて再オープンします。

  • バイナリロギングが有効化されている場合、サーバーは現在のバイナリログファイルを閉じ、新しいログファイルを次のシーケンス番号で開きます。

  • エラーログがファイルに書き込まれるようにするためにサーバーが --log-error オプションで開始されている場合、サーバーはログファイルを閉じて再オープンします。

ログをフラッシュすると、サーバーは新しいバイナリログファイルを作成します。ただし、一般クエリーログファイルおよびスロークエリーログファイルについては、それらを閉じて再オープンするだけです。Unix で新しいファイルが作成されるようにするには、現在のログファイルをフラッシュする前にそれらを名前変更します。フラッシュ時に、サーバーは新しいログファイルを元の名前で開きます。たとえば、一般クエリーログファイルおよびスロークエリーログファイルの名前が mysql.log および mysql-slow.log の場合、次のような一連のコマンドを使用することができます。

shell> cd mysql-data-directory
shell> mv mysql.log mysql.old
shell> mv mysql-slow.log mysql-slow.old
shell> mysqladmin flush-logs

Windows では、mv の代わりに rename を使用してください。

この時点で、mysql.old および mysql-slow.old のバックアップを作成し、そのあとこれらをディスクから削除することができます。

エラーログファイルがある場合、同様の方法を使用してこれらをバックアップできます。

ログを無効化することによって、一般クエリーログまたはスロークエリーログを実行時に名前変更できます。

SET GLOBAL general_log = 'OFF';
SET GLOBAL slow_query_log = 'OFF';

ログが無効化されている場合、コマンド行などの外部からログファイルを名前変更してください。次に、ログをふたたび有効にします。

SET GLOBAL general_log = 'ON';
SET GLOBAL slow_query_log = 'ON';

この方法はすべてのプラットフォームで動作し、サーバー再起動を必要としません。


User Comments
User comments in this section are, as the name implies, provided by MySQL users. The MySQL documentation team is not responsible for, nor do they endorse, any of the information provided here.
  Posted by Virender Bhanot on April 6, 2011
A PHP script to purge the master bin logs based on the position of slave. Can also be used to send alerts if slave is found to have a problem as mentioned below. Uncomment the line mentioned to actually purge logs.


<?
# Use as you like. No Warranties please. Use at your own risk.
# The script purges (deletes) the old log files based on the current file on which slave is acting.
# The script was tested by running the same on slave server. 
# It additionally sends an email/ sms if some of the parameters on slave are not found as required.

# define the number of logs to keep
define('KEEPNUM'5);
define('LINEBRK'"\n"); //make it <br> if running on browser

# connectivity settings for the slave (localhost)
define('HOST''localhost');
define('USER''user');
define('PASS''pass');

# connectivity settings for the master (remote)
define('HOSTM''x.x.x.x');
define('USERM''user');
define('PASSM''pass');

function 
send_email_sms($text

   
//Put here your code to send email and sms
   //return $retval; 


if(!
$dbh mysql_connect(HOSTUSERPASS)) die(mysql_error());
$query 'show slave status;';
if(!
$rs mysql_query($query$dbh)) die(mysql_error());
$row mysql_fetch_array($rs);

if (
strcmp($row['Slave_IO_Running'],"Yes") != 0send_email_sms("Alert. Slave IO not running.");
if (
strcmp($row['Slave_SQL_Running'],"Yes") != 0send_email_sms("Alert. Slave IO not running.");
if (
strcmp($row['Last_Error'],"") != 0send_email_sms("Alert. Error on Slave. ".$row['Last_Error']);

$x $row['Master_Log_File'];
echo 
"Current Master file on which Slave is acting: ".$x.LINEBRK;

if(!
$dbhm mysql_connect(HOSTMUSERMPASSM)) die(mysql_error());
$query1 'show master logs;';
if(!
$rs1 mysql_query($query1$dbhm)) die(mysql_error());
$lognames = array();

while(
$row1 mysql_fetch_array($rs1))
  
$lognames[] = $row1[0];

$marker array_search($x,$lognames);
$delmarker $marker KEEPNUM;

if(
$delmarker 2) {echo "Not enough logs to keep. Exiting..".LINEBRK;exit;}

echo 
"We are going to purge logs upto (not including) $lognames[$delmarker]".LINEBRK;

$del_query "PURGE MASTER LOGS TO '$lognames[$delmarker]'";
# Uncomment the following line to actually purge (i.e. delete) the logs
//if(!$rs2 = mysql_query($del_query, $dbhm)) die(mysql_error());
echo "The Master Server MySQL binary logs have been purged. The oldest log now available on the master is $lognames[$delmarker].".LINEBRK;
?> 

  Posted by Matthieu Bienvenüe on October 12, 2012
Here is an upgraded version of the Virender Bhanot ones that could handle multiple slaves. This script could run on CLI or web browser.

#!/usr/bin/php

<?
// purge_master_logs.php - MB 08/10/2012
//
// Source inspired by Virender Bhanot comment's : http://dev.mysql.com/doc/refman/5.6/en/log-file-maintenance.html
//
// Use as you like. No Warranties please. Use at your own risk.
// The script purges (deletes) the old log files based on the current file on which Slaves are acting.
// It additionally sends an email/ sms if some of the parameters on slave are not found as required.
//
// Modified in order to support multiple slaves. Get the oldest log file used by all slaves in order to use it as the reference.
// The script could be executed on any host (even another one that don't have mysql installed; this is the case for host with only Mysql installed and no PHP).
// Remove nothing if one Slave (or Master) is down or has a problem.
//
// The script assumes that bin log filenames use the default Mysql pattern (e.g. : mysql-bin.000003).
//
// Settings are read from slaves.config and master.config files, one host per line with the following format: host:user:password; comments lines starting with # are ignored.
//
// To display debuging information use ./purge_master_logs.php debug on CLI or purge_master_logs.php?debug on a web browser, by default nothing is displayed in order to avoid cron jobs send e-mails.
//


define('KEEPNUM'5); // define the number of logs to keep
define('SLAVE_CONFIG_FILE''slaves.config');
define('MASTER_CONFIG_FILE''master.config');
//---- Nothing to be changed under this line

function send_email_sms($text)
{
   
//Put here your code to send email and sms
   //return $retval;
   
echo $text LINEBRK;
   exit(
1);
}

if( empty(
$_SERVER['HTTP_USER_AGENT']) ) // used on CLI
{
   
define('LINEBRK'"\n");
   
parse_str(implode('&'array_slice($argv1)), $_GET); // populate $_GET with CLI parameters
}
else
{
   
define('LINEBRK'"<br>\n"); // make it <br> if running on browser
}

if( isset(
$_GET['debug']) )
{
   
$debug true;
}
else
{
   
$debug false;
}

register_shutdown_function('shutdown'$debug); // display nothing (with echo, etc.) when in production (usefull for cron jobs)
ob_start();


//---- Read configs files
//---- Slaves
$slaves_lines file(SLAVE_CONFIG_FILEFILE_IGNORE_NEW_LINES FILE_SKIP_EMPTY_LINES);

if( 
$slaves_lines === false )
{
   
send_email_sms("Cannot read Slaves config file (" SLAVE_CONFIG_FILE ")");
}
$slaves_host = array();
$slaves_users = array();
$slaves_pass = array();
foreach( 
$slaves_lines as $line )
{
   if( 
substr($line0strlen('#')) !== '#' // lines starting with # are comments, ignore it
   
{
      list(
$host$user$password) = explode(':'$line3);
      
$slaves_host[] = $host;
      
$slaves_users[] = $user;
      
$slaves_pass[] = $password;
   }
}
unset(
$slaves_lines);
if( empty(
$slaves_host) || empty($slaves_users) || empty($slaves_pass) )
{
   
send_email_sms("No hosts defined in Slaves config file (" SLAVE_CONFIG_FILE ")");
}
echo 
"Slaves config : host|user|password" LINEBRK;
foreach( 
$slaves_host as $index => $host )
{
   if( empty(
$slaves_pass[$index]) )
   {
      
$password_txt 'NOT DEFINED';
   }
   else
   {
      
$password_txt 'SET BUT NOT DISPLAYED HERE';
   }
   echo 
$host '|' $slaves_users[$index] . '|' $password_txt LINEBRK;
}

//---- Master
$master_lines file(MASTER_CONFIG_FILEFILE_IGNORE_NEW_LINES FILE_SKIP_EMPTY_LINES);

if( 
$master_lines === false )
{
   
send_email_sms("Cannot read Master config file (" MASTER_CONFIG_FILE ")");
}
foreach( 
$master_lines as $line )
{
   if( 
substr($line0strlen('#')) !== '#' // lines starting with # are comments, ignore it
   
{
      list(
$master_host$master_user$master_password) = explode(':'$line3);
      break; 
// only one line of settings
   
}
}
unset(
$master_lines);
if( empty(
$master_host) || empty($master_user) || empty($master_password) )
{
   
send_email_sms("Problem when reading Master config file (" MASTER_CONFIG_FILE "); missing parameter");
}
echo 
"Master config : host|user|password" LINEBRK;
if( empty(
$master_password) )
{
   
$password_txt 'NOT DEFINED';
}
else
{
   
$password_txt 'SET BUT NOT DISPLAYED HERE';
}
echo 
$master_host '|' $master_user '|' $password_txt LINEBRK LINEBRK;


//---- get log files number on each slave
$file_numbers = array();
$min_file_number 999999;
foreach( 
$slaves_host as $index => $host )
{
   if( !
$dbh mysql_connect($host$slaves_users[$index], $slaves_pass[$index]) )
   {
      die(
mysql_error() . LINEBRK "line: " __LINE__ LINEBRK "Host: " $host LINEBRK);
   }
   
$query 'show slave status;';
   if( !
$rs mysql_query($query$dbh) )
   {
      die(
mysql_error() . LINEBRK "line: " __LINE__ LINEBRK "Host: " $host LINEBRK);
   }
   
$row mysql_fetch_array($rs);

   if( 
strcmp($row['Slave_IO_Running'], "Yes") != )
   {
      
send_email_sms("Alert. Slave IO not running on host: " $host);
   }
   if( 
strcmp($row['Slave_SQL_Running'], "Yes") != )
   {
      
send_email_sms("Alert. Slave SQL not running on host: " $host);
   }
   if( 
strcmp($row['Last_Error'], "") != )
   {
      
send_email_sms("Alert. Error on Slave on host: " $host LINEBRK $row['Last_Error']);
   }
   
mysql_close($dbh);

   
$log_file $row['Master_Log_File'];
   echo 
"Current Master file used on Slave host " $host ": " $log_file LINEBRK;

   
$ext pathinfo($log_filePATHINFO_EXTENSION);
   
$min_file_number min($min_file_numberintval($ext)); // the smallest number is the oldest log file
}

$file_name "mysql-bin." sprintf("%06d"$min_file_number);
echo 
LINEBRK "Current Master oldest file on which Slaves are acting: " $file_name LINEBRK;

if( !
$dbhm mysql_connect($master_host$master_user$master_password) )
{
   
send_email_sms(mysql_error() . LINEBRK "line: " __LINE__ LINEBRK);
}
$query1 'show master logs;';
if( !
$rs1 mysql_query($query1$dbhm) )
{
   die(
mysql_error() . LINEBRK "line: " __LINE__ LINEBRK);
}
$lognames = array();

while( 
$row1 mysql_fetch_array($rs1) )
{
   
$lognames[] = $row1[0];
}

$marker array_search($file_name$lognames);
$delmarker $marker KEEPNUM;

if( 
$delmarker )
{
   echo 
"Not enough logs to keep. Nothing to purge. Exiting." LINEBRK;
   exit(
0);
}

echo 
"We are going to purge logs up to (not including) $lognames[$delmarker]LINEBRK;

$del_query "PURGE MASTER LOGS TO '$lognames[$delmarker]'";
# Uncomment the following lines to actually purge (i.e. delete) the logs
//if( !$rs2 = mysql_query($del_query, $dbhm) )
//{
//   die(mysql_error() . LINEBRK . "line: " . __LINE__ . LINEBRK);
//}
echo "The Master Server MySQL binary logs have been purged. The oldest log now available on the master is $lognames[$delmarker]." LINEBRK;
exit(
0);
/*
 * shutdown(): used to display echo's only when debuging is activated
 */
function shutdown($debug)
{
   if( 
$debug )
   {
      
ob_end_flush();
   }
   else
   {
      
ob_end_clean();
   }
}


?>

Sign Up Login You must be logged in to post a comment.