Chinaunix

标题: mysqlbiblog 问题,在线等待 [打印本页]

作者: qq15570453    时间: 2009-12-10 17:05
标题: mysqlbiblog 问题,在线等待
我使用mysqldump备份的数据,恢复的话中文数据很正常,但是我用mysqlbinlog 恢复二进制日志文件的话,所有中文数据都丢失了,请问这是什么原因?
作者: qq15570453    时间: 2009-12-10 17:08
mysql上的字符集有


mysql> show char set;
+----------+-----------------------------+---------------------+--------+
| Charset  | Description                 | Default collation   | Maxlen |
+----------+-----------------------------+---------------------+--------+
| dec8     | DEC West European           | dec8_swedish_ci     |      1 |
| cp850    | DOS West European           | cp850_general_ci    |      1 |
| hp8      | HP West European            | hp8_english_ci      |      1 |
| koi8r    | KOI8-R Relcom Russian       | koi8r_general_ci    |      1 |
| latin1   | cp1252 West European        | latin1_swedish_ci   |      1 |
| latin2   | ISO 8859-2 Central European | latin2_general_ci   |      1 |
| swe7     | 7bit Swedish                | swe7_swedish_ci     |      1 |
| ascii    | US ASCII                    | ascii_general_ci    |      1 |
| hebrew   | ISO 8859-8 Hebrew           | hebrew_general_ci   |      1 |
| koi8u    | KOI8-U Ukrainian            | koi8u_general_ci    |      1 |
| gb2312   | GB2312 Simplified Chinese   | gb2312_chinese_ci   |      2 |
| greek    | ISO 8859-7 Greek            | greek_general_ci    |      1 |
| cp1250   | Windows Central European    | cp1250_general_ci   |      1 |
| gbk      | GBK Simplified Chinese      | gbk_chinese_ci      |      2 |
| latin5   | ISO 8859-9 Turkish          | latin5_turkish_ci   |      1 |
| armscii8 | ARMSCII-8 Armenian          | armscii8_general_ci |      1 |
| utf8     | UTF-8 Unicode               | utf8_general_ci     |      3 |
| cp866    | DOS Russian                 | cp866_general_ci    |      1 |
| keybcs2  | DOS Kamenicky Czech-Slovak  | keybcs2_general_ci  |      1 |
| macce    | Mac Central European        | macce_general_ci    |      1 |
| macroman | Mac West European           | macroman_general_ci |      1 |
| cp852    | DOS Central European        | cp852_general_ci    |      1 |
| latin7   | ISO 8859-13 Baltic          | latin7_general_ci   |      1 |
| cp1251   | Windows Cyrillic            | cp1251_general_ci   |      1 |
| cp1256   | Windows Arabic              | cp1256_general_ci   |      1 |
| cp1257   | Windows Baltic              | cp1257_general_ci   |      1 |
| binary   | Binary pseudo charset       | binary              |      1 |
| geostd8  | GEOSTD8 Georgian            | geostd8_general_ci  |      1 |
+----------+-----------------------------+---------------------+--------+
28 rows in set (0.00 sec)
作者: 面皮    时间: 2009-12-10 17:15
你是怎么恢复的呀?
作者: qq15570453    时间: 2009-12-10 17:18
mysqlbinlog mysql-bin.000001 |mysql -uroot -p
作者: 面皮    时间: 2009-12-10 17:20
中文数据都丢了?是不是编码不对?
作者: qq15570453    时间: 2009-12-10 17:20
mysql> SHOW VARIABLES LIKE 'character%';
+--------------------------+----------------------------------------+
| Variable_name            | Value                                  |
+--------------------------+----------------------------------------+
| character_set_client     | gb2312                                 |
| character_set_connection | gb2312                                 |
| character_set_database   | gb2312                                 |
| character_set_filesystem | binary                                 |
| character_set_results    | gb2312                                 |
| character_set_server     | gb2312                                 |
| character_set_system     | utf8                                   |
| character_sets_dir       | /usr/local/mysql/share/mysql/charsets/ |
+--------------------------+----------------------------------------+


是不是要把gb2312的编码改成UTF8的?
作者: qq15570453    时间: 2009-12-11 09:46
是不是太简单了,没人回答我?
作者: cenalulu    时间: 2009-12-11 10:53
先确定你数据表的字符集是什么?
然后mysqlbinlog相应的使用--set-charset=name选项
作者: qq15570453    时间: 2009-12-14 10:09
还没解决,哎,烦死了
作者: qq15570453    时间: 2009-12-14 10:10
mysql> SHOW VARIABLES LIKE 'character%';
+--------------------------+----------------------------------------+
| Variable_name            | Value                                  |
+--------------------------+----------------------------------------+
| character_set_client     | utf8                                   |
| character_set_connection | utf8                                   |
| character_set_database   | utf8                                   |
| character_set_filesystem | binary                                 |
| character_set_results    | utf8                                   |
| character_set_server     | utf8                                   |
| character_set_system     | utf8                                   |
| character_sets_dir       | /usr/local/mysql/share/mysql/charsets/ |
+--------------------------+----------------------------------------+
作者: ruochen    时间: 2009-12-14 12:38
6楼和10楼的不是同一个数据库?
作者: Coolriver    时间: 2009-12-14 16:59
export LANG=gbk
在用你的方法试一下。
作者: qq15570453    时间: 2009-12-16 11:41
用了楼上的办法,还是不行
作者: Coolriver    时间: 2009-12-16 22:29
原帖由 qq15570453 于 2009-12-16 11:41 发表
用了楼上的办法,还是不行

你用的什么终端,字符集是什么?
locale

连接到DB的字符集是什么?
mysql>status;
结果?
操作步骤?
作者: qq15570453    时间: 2009-12-22 16:01
1.我对数据库不熟,是菜鸟,此过程有问题,希望大家能给我提出来
2.  
mysql> status;
--------------
mysql  Ver 14.14 Distrib 5.1.35, for i686-redhat-linux-gnu (i686-redhat-linux-gnu) using  EditLine wrapper

Connection id:          480
Current database:
Current user:           root@localhost
SSL:                    Not in use
Current pager:          stdout
Using outfile:          ''
Using delimiter:        ;
Server version:         5.1.35-mysql-log compiled-by-WinLinKer
Protocol version:       10
Connection:             Localhost via UNIX socket
Server characterset:    utf8
Db     characterset:    utf8
Client characterset:    utf8
Conn.  characterset:    utf8
UNIX socket:            /tmp/mysql.sock
Uptime:                 21 hours 43 sec

Threads: 17  Questions: 142646741  Slow queries: 0  Opens: 304  Flush tables: 1  Open tables: 298  Queries per second avg: 1885.789
--------------
3.cat /etc/sysconfig/i18n

   LANG="zh_CN.UTF-8"
   SYSFONT="latarcyrheb-sun16"
4.mysql> SHOW VARIABLES LIKE 'character%';
+--------------------------+----------------------------------------+
| Variable_name            | Value                                  |
+--------------------------+----------------------------------------+
| character_set_client     | utf8                                   |
| character_set_connection | utf8                                   |
| character_set_database   | utf8                                   |
| character_set_filesystem | binary                                 |
| character_set_results    | utf8                                   |
| character_set_server     | utf8                                   |
| character_set_system     | utf8                                   |
| character_sets_dir       | /usr/local/mysql/share/mysql/charsets/ |
+--------------------------+----------------------------------------+
8 rows in set (0.00 sec)

5. 使用mysqldump -uUSER -pPWSSWORD dbname > backdbname  完全备份数据库
   然后使用 mysql  -uUSER -pPWSSWORD  dbname <  backdbname   这样恢复数据库无任何问题
6. 我每天凌晨5点使用第5步的方法完全备份数据库(数据很少的,也就100多M)备份完成后,立即清除凌晨5点前的binlog二进制日志文件
7. 我的想法是当数据库发生故障后,首先使用 mysql  -uUSER -pPWSSWORD  dbname <  backdbname   恢复上次完全备份的数据库,
   然后使用下面的方法使用增量恢复数据
  mysql  -uUSER -pPWSSWORD  dbname <  backdbname   
  DATA_DIR="/data/mysql-bin-log/"
   for BINFILE in `ls $DATA_DIR/mysql-bin.0* |sort`;
   do
     RESTORECMD="mysqlbinlog  $BINFILE | mysql  -uUSER -pPWSSWORD"
     eval $RESTORECMD
  done
  问题就在这里,使用mysqlbinlog恢复数据后,中文全是乱码,而mysql  -uUSER -pPWSSWORD  dbname <  backdbname  恢复无任何问题
作者: qq15570453    时间: 2009-12-22 16:03
应该是这样

7. 我的想法是当数据库发生故障后,首先使用 mysql  -uUSER -pPWSSWORD  dbname <  backdbname   恢复上次完全备份的数据库,
   然后使用下面的方法使用增量恢复数据
  
  DATA_DIR="/data/mysql-bin-log/"
   for BINFILE in `ls $DATA_DIR/mysql-bin.0* |sort`;
   do
     RESTORECMD="mysqlbinlog  $BINFILE | mysql  -uUSER -pPWSSWORD"
     eval $RESTORECMD
  done
  问题就在这里,使用mysqlbinlog恢复数据后,中文全是乱码,而mysql  -uUSER -pPWSSWORD  dbname <  backdbname  恢复无任何问题
作者: qq15570453    时间: 2009-12-22 16:06
今天用了主从备份,因为主从备份也是需要binlog的,遇到中文依然还是乱码。学艺不精,遇到问题公司里也没人和我讨论,google了好久还是没有解决问题,希望能在CU上顺利解决
作者: justlooks    时间: 2009-12-22 16:14
检查,连接服务器的客户端的设置(比如putty),看下mysqlbinlog直接显示的是否是中文(不是的话myslbinlog有个参数设置字符集,具体看mysqlbinlog --help)
作者: qq15570453    时间: 2009-12-22 16:18
putty 已经是utf8的字符集了,我在windows上用navicat.exe,mysql客服端连这台服务器中文字符要么是空,要么是乱码
作者: qq15570453    时间: 2009-12-22 16:25
使用  mysqlbinlog --set-charset=utf8 /usr/local/mysql/var/mysql-bin.000001

里面的中文都是16进制
作者: justlooks    时间: 2009-12-22 16:52
不能吧,你自己建个表,插些中文进去看看
mysqlbinlog --set-charset=utf8 mysql-bin.000013|tail -10
/*!\C utf8 *//*!*/;
SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=8/*!*/;
insert into t1 values(5,'测试测试啊')/*!*/;
DELIMITER ;
# End of log file
ROLLBACK /* added by mysqlbinlog */;
作者: qq15570453    时间: 2009-12-22 17:23
按照你的方法,建一个表,插入中文,可以显示,那我的问题到底出在什么地方?
作者: qq15570453    时间: 2009-12-22 17:26
insert into game_log_player_core (logType, userId, playerId, playerCode, playerName, playerGrade, logValue, logDesc, logObject, commitTime, type) values (16, 32662, 22197, 0x3537393038363232, 0x74616E6B3837, 26, 0xB7E2C4A7C8D04C7633A1C1315B4A4E445A3030365F335D, NULL, NULL, '2009-12-16 11:34:06', '6')

这是我原始数据库binlog的一些记录 有些应该显示中文的地方,都是16进制
作者: qq15570453    时间: 2009-12-22 17:31
#091216  5:00:12 server id 1  end_log_pos 97502         Query   thread_id=2355  exec_time=0     error_code=0
SET TIMESTAMP=1260910812/*!*/;
update user_player set userid=60723, nickname=0xCDF5B0AEBDBF, sex=2, grade=1, experience=0, goldCoin=170, deposit=0, school=4, playerState=0, commitTime='2009-12-16 05:00:12', onlineState=1, position=0x3230353034, lastPosition=NULL, pack=40, hp=40, mp=80, gloypoint=10, banghuiId=0, shopSpace=3, goldblock=0, shouLanNum=3, isDelete=0, jinjifen=0, glodBlockPoint=0 where id=41670
/*!*/;


nickname  position 后面显示的都是16进制,本来应该是中文啊
作者: qq15570453    时间: 2009-12-23 09:41
顶呀!

谁能告诉我问题出在什么地方呀!
作者: wiliiwin    时间: 2009-12-23 10:39
字符集分 数据库字符集   表字符集  字段字符集 你看你这些都是什么字符集
作者: qq15570453    时间: 2010-01-22 18:08
顶呀!

谁能告诉我问题出在什么地方呀!
作者: justin033    时间: 2010-01-22 18:31
原帖由 ruochen 于 2009-12-14 12:38 发表
6楼和10楼的不是同一个数据库?



从这边可以看出,你两次连接时的字符集不一样的。你要先确认下!!!
你可以用mysqlbinlog把内容dump出来看下中文的情况,不一定要马上导进库内




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2