Форум администраторов игровых серверов

Форум администраторов игровых серверов (https://forum.zone-game.info/TT.php)
-   Работа со скриптами (https://forum.zone-game.info/forumdisplay.php?f=37)
-   -   Автосохранение базы mysql каждые 6 часов (https://forum.zone-game.info/showthread.php?t=8750)

Travesil 22.06.2010 21:32

Автосохранение базы mysql каждые 6 часов
 
Всем привет.У меня возникла такая проблема: держу сервер, сборка L2Phoenix 17v . Рейты высокие и игроки быстро набивают адену, покупают шмот. Выключили электроэнергию и сервер перестал запускаться, ошибка итем таблицы, вернул базы на день назад, народ в гневе - типо многое пропало. Хотел спросить, как мне сделать автосохранение базы mysql каждые 6 часов вроде сохраняется с батника StartGameServer.bat иногда, но там о килобайт или есть другой способ автосохранять ?
PHP код:

@echo off
:start
set user
=root
set pass
=
set DBname=l2pdb
set DBHost
=localhost
set ctime
=%TIME:~0,2%
if 
"%ctime:~0,1%" == " " (
set ctime=0%ctime:~1,1%
)
set ctime=%ctime%'%TIME:~3,2%'%TIME:~6,2%
echo.
echo 
Making a full backup into %DATE%-%ctime%_backup_full.sql
echo.
mysqldump.exe %Ignore% --add-drop-table -%DBHost% -%user% --password=%pass% %DBname% > backup/%DATE%-%ctime%_backup_full.sql
echo.
echo 
Backup complite %DATE%-%ctime%_backup_full.sql
echo.
TITLE L2P Game Server
echo %DATE% %TIMEGame server is running !!! > gameserver_is_running.tmp
echo Starting L2P Game Server.
echo.
rem ======== Optimize memory settings =======
rem Minimal size with geodata is 1.5Gw/o geo 1G
rem Make sure 
-Xmn value is always 1/4 the size of -Xms and -Xmx.
rem -Xms and -Xmx should always be equal.
rem ==========================================
java -server -Dfile.encoding=UTF--Xms1g -Xmx1400m -Xmn192m  -cp bsf.jar;bsh-2.0.jar;javolution.jar;c3p0-0.9.1.2.jar;mysql-connector-java-5.1.6-bin.jar;l2pserver.jar;jython.jar;rrd4j-2.0.1.jar;jacksum.jar l2p.gameserver.GameServer

if ERRORLEVEL 2 goto restart
if ERRORLEVEL 1 goto error
goto end
:restart
echo.
echo 
Admin Restart ...
echo.
goto 
start
:error
echo.
echo 
Server terminated abnormaly
echo.
:
end
echo.
echo 
server terminated
echo.
del gameserver_is_running.tmp
pause 


ginger 23.06.2010 05:44

Re: Автосохранение базы mysql каждые 6 часов
 
правильный способ - репликация (вообще ничего не теряется). Корявый способ - mysqldump + планировщик задач.

pitch 23.06.2010 07:33

Re: Автосохранение базы mysql каждые 6 часов
 
Цитата:

Сообщение от ginger (Сообщение 76110)
правильный способ - репликация (вообще ничего не теряется). Корявый способ - mysqldump + планировщик задач.

Думаю правильнее и то и то, тк есть ситуации когда приходится откатываться, да и дамп все таки полезно хранить, история и тп.

ginger 23.06.2010 09:06

Re: Автосохранение базы mysql каждые 6 часов
 
Цитата:

Сообщение от pitch (Сообщение 76115)
Думаю правильнее и то и то, тк есть ситуации когда приходится откатываться, да и дамп все таки полезно хранить, история и тп.

правильнее - дампить реплику. А для откатов на время короче промежутка до последнего дапма есть такая штука как PITR.

Дух системы 23.06.2010 10:43

Re: Автосохранение базы mysql каждые 6 часов
 
Travesil, а не проще фиксить items таблицу, вместо того, чтобы делать откаты?
как правило такие ошибки возникают уже после рестарта, когда например пытается загрузиться итемы с одинаковыми id (банить обладателя, тк дюп налицо).
а вообще идеальный вариант, на случай утери бд или краха харда сервера, это дампить все таблицы базы на отдельный сервер.

на пхп реализовать несложно, + всегда есть возможность следить за сбоем таблиц.
к примеру записываем mysql_error() в переменную и выясняем почему не происходит дамп, тут же на лету фиксим таблицу и дампим снова.

пример кода:
Код:

<?
$db_original = mysql_connect ( $host_original, $dblogin_original, $dbpass_original ) or die ("Coudn't connect to [$db_original]");
mysql_select_db ( $db_original );
$db_copy = mysql_connect ( $host_copy, $dblogin_copy, $dbpass_copy ) or die ("Coudn't connect to [$db_copy]");
mysql_select_db ( $db_copy );
$curdate=date("ymdhis");
$n=0;
$query_tables = mysql_query("SELECT * FROM `$db_original`.`tables` ORDER BY `table_name`");
while ($tables_temp = mysql_fetch_array($query_tables))
{
        $table_name = $tables_temp['table_name'];
        $mysql_query = "CRATE TABLE `$db_copy`.`$table_name` SELECT * FROM `$db_original`.`$table_name`";       
        mysql_query($mysql_query);
        if (!mysql_error())
        {
                $mysql_error = mysql_error();
                echo "<li>Ошибка при копировании таблицы $table_name<br>$mysql_error.";
                echo "<li>И тут уже исходя из условий обрабатываем mysql_error(), фиксим таблицу db_original.table_name и запускаем повторный mysql_query.";
        }
        else
        {
                mysql_query("INSERT INTO `$db_copy`.`backup_story` (`backupdate`, `table`, `status`) VALUES ('$curdate', '$table_name', '1');";
                $n=$n+1;
        }
}
echo "<li>Скопировано $n таблиц из $host_original:$db_original в $host_copy:$db_copy.";
mysql_close();
?>


Travesil 23.06.2010 11:22

Re: Автосохранение базы mysql каждые 6 часов
 
Как я понял с твоих слов крах произошел не из-за выключения электроинергии а применение стороних программ и дюпа предмета?Но какже фиксить если таблица итемов не открывается вообще.Вот и хочу запись дампа реализовать только проблема что не очень шарю как подскажите подробней допустим корявый способ - mysqldump + планировщик задач.У меня windows xp.

Дух системы 23.06.2010 11:51

Re: Автосохранение базы mysql каждые 6 часов
 
Travesil, напиши ошибку почему не открывается.
попробуй REPAIR `tablename`
Здесь подробнее об этом
электроэнергия бывает причем только при железных поломках, а это программная часть, значит и сломалась она программно.
есть конечно форс мажор, что именно во время сохранения таблицы items (это пара секунд) произошло отключение от электричества, но все равно это не приведет к нечитаемости таблицы, тк сохранение несет собой лишь добавление или обновление существующих id.

в большинстве случаев крах таблиц это дублированный primary key

ginger 23.06.2010 11:55

Re: Автосохранение базы mysql каждые 6 часов
 
Цитата:

Сообщение от Travesil (Сообщение 76151)
Как я понял с твоих слов крах произошел не из-за выключения электроинергии а применение стороних программ и дюпа предмета?Но какже фиксить если таблица итемов не открывается вообще.Вот и хочу запись дампа реализовать только проблема что не очень шарю как подскажите подробней допустим корявый способ - mysqldump + планировщик задач.У меня windows xp.

1. Сделать скрипт, который дампит базу.
2. Поставить его в расписание планировщика.

Дух системы 23.06.2010 11:58

Re: Автосохранение базы mysql каждые 6 часов
 
ginger, а если он сдампит уже поврежденную базу?

Travesil 23.06.2010 12:07

Re: Автосохранение базы mysql каждые 6 часов
 
Уже удалил ту итем таблицу ошибку не запомнил.Так как мне поправить батник чтоб он автоматически сохранял базы в бекап сервера каждые 6 часов или с помощью планировщика задачь как настроить их сохранение в виндовс хп?Допустим логин root пасс 44879 название базы l2pdb и время каждые 6 часов помогите прописать где надо.


Текущее время: 13:52. Часовой пояс GMT +3.

Powered by vBulletin® Version 3.8.6
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot