分类目录归档:linux

fredzeng与你一起对linux,linux操作系统,linux命令大全,linux查看磁盘空间学习相关知识及探讨!

查看修改mysql数据库的字符集

Liunx下修改MySQL字符集:
1.查找MySQL的cnf文件的位置
find / -iname ‘*.cnf’ -print
/usr/share/mysql/my-innodb-heavy-4G.cnf
/usr/share/mysql/my-large.cnf
/usr/share/mysql/my-small.cnf
/usr/share/mysql/my-medium.cnf
/usr/share/mysql/my-huge.cnf
/usr/share/texmf/web2c/texmf.cnf
/usr/share/texmf/web2c/mktex.cnf
/usr/share/texmf/web2c/fmtutil.cnf
/usr/share/texmf/tex/xmltex/xmltexfmtutil.cnf
/usr/share/texmf/tex/jadetex/jadefmtutil.cnf
/usr/share/doc/MySQL-server-community-5.1.22/my-innodb-heavy-4G.cnf
/usr/share/doc/MySQL-server-community-5.1.22/my-large.cnf
/usr/share/doc/MySQL-server-community-5.1.22/my-small.cnf
/usr/share/doc/MySQL-server-community-5.1.22/my-medium.cnf
/usr/share/doc/MySQL-server-community-5.1.22/my-huge.cnf
2. 拷贝 small.cnf、my-medium.cnf、my-huge.cnf、my-innodb-heavy-4G.cnf其中的一个到/etc下,命名为my.cnf
cp /usr/share/mysql/my-medium.cnf /etc/my.cnf
3. 修改my.cnf
vi /etc/my.cnf
在[client]下添加
default-character-set=utf8
在[mysqld]下添加
default-character-set=utf8
4.重新启动MySQL
[root@bogon ~]# /etc/rc.d/init.d/mysql restart
Shutting down MySQL                                         [ 确定 ]
Starting MySQL.                                             [ 确定 ]
[root@bogon ~]# mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.1.22-rc-community-log MySQL Community Edition (GPL)
Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the buffer.
5.查看字符集设置
mysql> show variables like ‘collation_%’;
+———————-+—————–+
| Variable_name         | Value            |
+———————-+—————–+
| collation_connection | utf8_general_ci |
| collation_database    | utf8_general_ci |
| collation_server      | utf8_general_ci |
+———————-+—————–+
3 rows in set (0.02 sec)
mysql> show variables like ‘character_set_%’;
+————————–+—————————-+
| 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/share/mysql/charsets/ |
+————————–+—————————-+
8 rows in set (0.02 sec)
mysql>

其他的一些设置方法:
修改数据库的字符集
    mysql>use mydb
    mysql>alter database mydb character set utf-8;
创建数据库指定数据库的字符集
    mysql>create database mydb character set utf-8;
通过配置文件修改:
修改/var/lib/mysql/mydb/db.opt
default-character-set=latin1
default-collation=latin1_swedish_ci

default-character-set=utf8
default-collation=utf8_general_ci
重起MySQL:
[root@bogon ~]# /etc/rc.d/init.d/mysql restart
通过MySQL命令行修改:
mysql> set character_set_client=utf8;
Query OK, 0 rows affected (0.00 sec)
mysql> set character_set_connection=utf8;
Query OK, 0 rows affected (0.00 sec)
mysql> set character_set_database=utf8;
Query OK, 0 rows affected (0.00 sec)
mysql> set character_set_results=utf8;
Query OK, 0 rows affected (0.00 sec)
mysql> set character_set_server=utf8;
Query OK, 0 rows affected (0.00 sec)
mysql> set character_set_system=utf8;
Query OK, 0 rows affected (0.01 sec)
mysql> set collation_connection=utf8;
Query OK, 0 rows affected (0.01 sec)
mysql> set collation_database=utf8;
Query OK, 0 rows affected (0.01 sec)
mysql> set collation_server=utf8;
Query OK, 0 rows affected (0.01 sec)
查看:
mysql> show variables like ‘character_set_%’;
+————————–+—————————-+
| 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/share/mysql/charsets/ |
+————————–+—————————-+
8 rows in set (0.03 sec)
mysql> show variables like ‘collation_%’;
+———————-+—————–+
| Variable_name         | Value            |
+———————-+—————–+
| collation_connection | utf8_general_ci |
| collation_database    | utf8_general_ci |
| collation_server      | utf8_general_ci |
+———————-+—————–+
3 rows in set (0.04 sec)

————————————————————————-
【知识性文章转载】
MYSQL 字符集问题

MySQL的字符集支持(Character Set Support)有两个方面:
      字符集(Character set)和排序方式(Collation)。
对于字符集的支持细化到四个层次:
      服务器(server),数据库(database),数据表(table)和连接(connection)。
1.MySQL默认字符集
MySQL对于字符集的指定可以细化到一个数据库,一张表,一列,应该用什么字符集。
但是,传统的程序在创建数据库和数据表时并没有使用那么复杂的配置,它们用的是默认的配置,那么,默认的配置从何而来呢?     (1)编译MySQL 时,指定了一个默认的字符集,这个字符集是 latin1;
     (2)安装MySQL 时,可以在配置文件 (my.ini) 中指定一个默认的的字符集,如果没指定,这个值继承自编译时指定的;
     (3)启动mysqld 时,可以在命令行参数中指定一个默认的的字符集,如果没指定,这个值继承自配置文件中的配置,此时 character_set_server 被设定为这个默认的字符集;
     (4)当创建一个新的数据库时,除非明确指定,这个数据库的字符集被缺省设定为character_set_server;
     (5)当选定了一个数据库时,character_set_database 被设定为这个数据库默认的字符集;
     (6)在这个数据库里创建一张表时,表默认的字符集被设定为 character_set_database,也就是这个数据库默认的字符集;
     (7)当在表内设置一栏时,除非明确指定,否则此栏缺省的字符集就是表默认的字符集;
简单的总结一下,如果什么地方都不修改,那么所有的数据库的所有表的所有栏位的都用
latin1 存储,不过我们如果安装 MySQL,一般都会选择多语言支持,也就是说,安装程序会自动在配置文件中把
default_character_set 设置为 UTF-8,这保证了缺省情况下,所有的数据库的所有表的所有栏位的都用 UTF-8 存储。
2.查看默认字符集(默认情况下,mysql的字符集是latin1(ISO_8859_1)
通常,查看系统的字符集和排序方式的设定可以通过下面的两条命令:
      mysql> SHOW VARIABLES LIKE ‘character%’;
+————————–+———————————+
| Variable_name             | Value                            |
+————————–+———————————+
| character_set_client      | latin1                           |
| character_set_connection | latin1                           |
| character_set_database    | latin1                           |
| character_set_filesystem | binary                      |
| character_set_results     | latin1                           |
| character_set_server      | latin1                           |
| character_set_system     | utf8                             |
| character_sets_dir        | D:”mysql-5.0.37″share”charsets” |
+————————–+———————————+
mysql> SHOW VARIABLES LIKE ‘collation_%’;
+———————-+—————–+
| Variable_name         | Value            |
+———————-+—————–+
| collation_connection | utf8_general_ci |
| collation_database    | utf8_general_ci |
| collation_server      | utf8_general_ci |
+———————-+—————–+
3.修改默认字符集
(1) 最简单的修改方法,就是修改mysql的my.ini文件中的字符集键值,
如     default-character-set = utf8
       character_set_server = utf8
    修改完后,重启mysql的服务,service mysql restart
    使用 mysql> SHOW VARIABLES LIKE ‘character%’;查看,发现数据库编码均已改成utf8
+————————–+———————————+
| 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        | D:”mysql-5.0.37″share”charsets” |
+————————–+———————————+
    (2) 还有一种修改字符集的方法,就是使用mysql的命令
    mysql> SET character_set_client = utf8 ;

MySQL中涉及的几个字符集

character-set-server/default-character-set:服务器字符集,默认情况下所采用的。
character-set-database:数据库字符集。
character-set-table:数据库表字符集。
优先级依次增加。所以一般情况下只需要设置character-set-server,而在创建数据库和表时不特别指定字符集,这样统一采用character-set-server字符集。
character-set-client:客户端的字符集。客户端默认字符集。当客户端向服务器发送请求时,请求以该字符集进行编码。
character-set-results:结果字符集。服务器向客户端返回结果或者信息时,结果以该字符集进行编码。
在客户端,如果没有定义character-set-results,则采用character-set-client字符集作为默认的字符集。所以只需要设置character-set-client字符集。

要处理中文,则可以将character-set-server和character-set-client均设置为GB2312,如果要同时处理多国语言,则设置为UTF8。

关于MySQL的中文问题

解决乱码的方法是,在执行SQL语句之前,将MySQL以下三个系统参数设置为与服务器字符集character-set-server相同的字符集。
character_set_client:客户端的字符集。
character_set_results:结果字符集。
character_set_connection:连接字符集。
设置这三个系统参数通过向MySQL发送语句:set names gb2312

关于GBK、GB2312、UTF8
UTF- 8:Unicode Transformation Format-8bit,允许含BOM,但通常不含BOM。是用以解决国际上字符的一种多字节编码,它对英文使用8位(即一个字节),中文使用24为(三个字节)来编码。UTF-8包含全世界所有国家需要用到的字符,是国际编码,通用性强。UTF-8编码的文字可以在各国支持UTF8字符集的浏览器上显示。如,如果是UTF8编码,则在外国人的英文IE上也能显示中文,他们无需下载IE的中文语言支持包。

GBK是国家标准GB2312基础上扩容后兼容GB2312的标准。GBK的文字编码是用双字节来表示的,即不论中、英文字符均使用双字节来表示,为了区分中文,将其最高位都设定成1。GBK包含全部中文字符,是国家编码,通用性比UTF8差,不过UTF8占用的数据库比GBD大。

GBK、GB2312等与UTF8之间都必须通过Unicode编码才能相互转换:
GBK、GB2312--Unicode--UTF8
UTF8--Unicode--GBK、GB2312

对于一个网站、论坛来说,如果英文字符较多,则建议使用UTF-8节省空间。不过现在很多论坛的插件一般只支持GBK。

GB2312是GBK的子集,GBK是GB18030的子集
GBK是包括中日韩字符的大字符集合
如果是中文的网站 推荐GB2312 GBK有时还是有点问题
为了避免所有乱码问题,应该采用UTF-8,将来要支持国际化也非常方便
UTF-8可以看作是大字符集,它包含了大部分文字的编码。
使用UTF-8的一个好处是其他地区的用户(如香港台湾)无需安装简体中文支持就能正常观看你的文字而不会出现乱码。

gb2312是简体中文的码
gbk支持简体中文及繁体中文
big5支持繁体中文
utf-8支持几乎所有字符

首先分析乱码的情况
1.写入数据库时作为乱码写入
2.查询结果以乱码返回
究竟在发生乱码时是哪一种情况呢?
我们先在mysql 命令行下输入
show variables like ‘%char%’;
查看mysql 字符集设置情况:

mysql> show variables like ‘%char%’;
+————————–+—————————————-+
| Variable_name            | Value                                  |
+————————–+—————————————-+
| character_set_client     | gbk                                    | 
| character_set_connection | gbk                                    | 
| character_set_database   | gbk                                    | 
| character_set_filesystem | binary                                 | 
| character_set_results    | gbk                                    | 
| character_set_server     | gbk                                    | 
| character_set_system     | utf8                                   | 
| character_sets_dir       | /usr/local/mysql/share/mysql/charsets/ | 
+————————–+—————————————-+

在查询结果中可以看到mysql 数据库系统中客户端、数据库连接、数据库、文件系统、查询
结果、服务器、系统的字符集设置
在这里,文件系统字符集是固定的,系统、服务器的字符集在安装时确定,与乱码问题无关
乱码的问题与客户端、数据库连接、数据库、查询结果的字符集设置有关
*注:客户端是看访问mysql 数据库的方式,通过命令行访问,命令行窗口就是客户端,通
过JDBC 等连接访问,程序就是客户端
我们在向mysql 写入中文数据时,在客户端、数据库连接、写入数据库时分别要进行编码转

在执行查询时,在返回结果、数据库连接、客户端分别进行编码转换
现在我们应该清楚,乱码发生在数据库、客户端、查询结果以及数据库连接这其中一个或多
个环节
接下来我们来解决这个问题
在登录数据库时,我们用mysql –default-character-set=字符集-u root -p 进行连接,这时我们
再用show variables like ‘%char%’;命令查看字符集设置情况,可以发现客户端、数据库连接、
查询结果的字符集已经设置成登录时选择的字符集了
如果是已经登录了,可以使用set names 字符集;命令来实现上述效果,等同于下面的命令:
set character_set_client = 字符集
set character_set_connection = 字符集
set character_set_results = 字符集

如果碰到上述命令无效时,也可采用一种最简单最彻底的方法:

一、Windows

1、中止MySQL服务
2、在MySQL的安装目录下找到my.ini,如果没有就把my-medium.ini复制为一个my.ini即可
3、打开my.ini以后,在[client]和[mysqld]下面均加上default-character-set=utf8,保存并关闭
4、启动MySQL服务

要彻底解决编码问题,必须使

| character_set_client     | gbk                                    | 
| character_set_connection | gbk                                    | 
| character_set_database   | gbk                                    | 
| character_set_results    | gbk                                    | 
| character_set_server     | gbk                                    | 
| character_set_system     | utf8     

这些编码相一致,都统一。


如果是通过JDBC 连接数据库,可以这样写URL:
URL=jdbc:mysql://localhost:3306/abs?useUnicode=true&characterEncoding=字符集
JSP 页面等终端也要设置相应的字符集
数据库的字符集可以修改mysql 的启动配置来指定字符集,也可以在create database 时加上
default character set 字符集来强制设置database 的字符集
通过这样的设置,整个数据写入读出流程中都统一了字符集,就不会出现乱码了
为什么从命令行直接写入中文不设置也不会出现乱码?
可以明确的是从命令行下,客户端、数据库连接、查询结果的字符集设置没有变化
输入的中文经过一系列转码又转回初始的字符集,我们查看到的当然不是乱码
但这并不代表中文在数据库里被正确作为中文字符存储
举例来说,现在有一个utf8 编码数据库,客户端连接使用GBK 编码,connection 使用默认
的ISO8859-1(也就是mysql 中的latin1),我们在客户端发送“中文”这个字符串,客户端
将发送一串GBK 格式的二进制码给connection 层,connection 层以ISO8859-1 格式将这段
二进制码发送给数据库,数据库将这段编码以utf8 格式存储下来,我们将这个字段以utf8
格式读取出来,肯定是得到乱码,也就是说中文数据在写入数据库时是以乱码形式存储的,
在同一个客户端进行查询操作时,做了一套和写入时相反的操作,错误的utf8 格式二进制
码又被转换成正确的GBK 码并正确显示出来。

CentOS,Debian,Ubuntu一键安装 ShadowsocksR 服务端

本脚本适用环境: 系统支持:CentOS,Debian,Ubuntu 内存要求:≥128M 日期:2016 年 08 月 13 日

关于本脚本: 一键安装 ShadowsocksR 服务端。 请下载与之配套的客户端程序来连接。 (以下客户端只有 Windows 客户端和 Python 版客户端可以使用 SSR 新特性,其他原版客户端只能以兼容的方式连接 SSR 服务器)

默认配置: 服务器端口:自己设定(如不设定,默认为 8989) 客户端端口:1080 密码:自己设定(如不设定,默认为teddysun.com)

客户端下载: Windows / OS X Linux Android / iOS OpenWRT

使用方法: 使用root用户登录,运行以下命令:

wget --no-check-certificate https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocksR.sh
chmod +x shadowsocksR.sh
./shadowsocksR.sh 2>&1 | tee shadowsocksR.log 

安装完成后,脚本提示如下:

Congratulations, ShadowsocksR install completed!
Server IP:your_server_ip
Server Port:your_server_port
Password:your_password
Local IP:127.0.0.1
Local Port:1080
Protocol:origin
obfs:plain
Encryption Method:aes-256-cfb

Welcome to visit:https://shadowsocks.be/9.html
If you want to change protocol & obfs, reference URL:
https://github.com/breakwa11/shadowsocks-rss/wiki/Server-Setup
Enjoy it!

卸载方法:
使用 root 用户登录,运行以下命令:

./shadowsocksR.sh uninstall 

安装完成后即已后台启动 ShadowsocksR ,运行:

/etc/init.d/shadowsocks status 

可以查看 ShadowsocksR 进程是否已经启动。
本脚本安装完成后,已将 ShadowsocksR 自动加入开机自启动。

使用命令:
启动:/etc/init.d/shadowsocks start
停止:/etc/init.d/shadowsocks stop
重启:/etc/init.d/shadowsocks restart
状态:/etc/init.d/shadowsocks status

配置文件路径:/etc/shadowsocks.json
日志文件路径:/var/log/shadowsocks.log
代码安装目录:/usr/local/shadowsocks

多用户配置 sample:

{
"server":"0.0.0.0",
"server_ipv6": "[::]",
"local_address":"127.0.0.1",
"local_port":1080,
"port_password":{
    "8989":"password1",
    "8990":"password2",
    "8991":"password3"
},
"timeout":300,
"method":"aes-256-cfb",
"protocol": "origin",
"protocol_param": "",
"obfs": "plain",
"obfs_param": "",
"redirect": "",
"dns_ipv6": false,
"fast_open": false,
"workers": 1
} 

如果你想修改配置文件,请参考:
https://github.com/breakwa11/shadowsocks-rss/wiki/Server-Setup

更新日志:
2016 年 08 月 13 日:
1、新增多用户配置 sample。注意:如果你新增了端口,也要将该端口从防火墙(iptables 或 firewalld)中打开。

2016 年 05 月 12 日:
1、新增在 CentOS 下的防火墙规则设置。

参考链接:
https://github.com/breakwa11/shadowsocks-rss

CentOS下shadowsocks-libev一键安装脚本

脚本适用环境:
系统支持:CentOS
内存要求:≥128M
日期:2017 年 02 月 24 日

关于本脚本:
一键安装 libev 版的 Shadowsocks 最新版本。该版本的特点是内存占用小(600k左右),低 CPU 消耗,甚至可以安装在基于 OpenWRT 的路由器上。
友情提示:如果你有问题,请先参考这篇《Shadowsocks Troubleshooting》后再问。

默认配置:
服务器端口:自己设定(如不设定,默认为 8989)
客户端端口:1080
密码:自己设定(如不设定,默认为teddysun.com)

客户端下载:
https://github.com/shadowsocks/shadowsocks-windows/releases

使用方法:
使用root用户登录,运行以下命令:

wget --no-check-certificate -O shadowsocks-libev.sh https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocks-libev.sh
chmod +x shadowsocks-libev.sh
./shadowsocks-libev.sh 2>&1 | tee shadowsocks-libev.log

安装完成后,脚本提示如下:

Congratulations, Shadowsocks-libev install completed!
Your Server IP:your_server_ip
Your Server Port:your_server_port
Your Password:your_password
Your Local IP:127.0.0.1
Your Local Port:1080
Your Encryption Method:aes-256-cfb

Welcome to visit:https://teddysun.com/357.html
Enjoy it!

卸载方法:
使用 root 用户登录,运行以下命令:

./shadowsocks-libev.sh uninstall

其他事项:
客户端配置的参考链接:https://teddysun.com/339.html

安装完成后即已后台启动 Shadowsocks-libev ,运行:

/etc/init.d/shadowsocks status

可以查看进程是否启动。
本脚本安装完成后,会将 Shadowsocks-libev 加入开机自启动。

使用命令:
启动:/etc/init.d/shadowsocks start
停止:/etc/init.d/shadowsocks stop
重启:/etc/init.d/shadowsocks restart
查看状态:/etc/init.d/shadowsocks status

更多版本 Shadowsocks 安装:
ShadowsocksR 版一键安装脚本(CentOS,Debian,Ubuntu)
Shadowsocks Python 版一键安装脚本(CentOS,Debian,Ubuntu)
Debian 下 Shadowsocks-libev 一键安装脚本
Shadowsocks-go 一键安装脚本(CentOS,Debian,Ubuntu)

更新日志

2017 年 02 月 24 日:
1、恢复: 通过 Github API 自动获取 Shadowsocks-libev 的最新 release 版本的功能(v3.0.3)。
2017 年 02 月 13 日:
1、更新:升级版本到 3.0.2。
2017 年 02 月 12 日:
1、更新:升级版本到 3.0.1(请下载最新的脚本来安装)。
2016 年 11 月 05 日:
1、新增:判断是否已安装,若已安装,则获取版本号与最新版比较,然后可以升级覆盖安装;
2、修正:未安装时获取最新版本号的问题。
2016 年 09 月 23 日:
1、修正:偶尔自动获取版本号失败的问题;
2、新增:自动判断如果 VPS 存在 IPv6 地址,则在配置文件里添加监听 IPv6 地址。
2016 年 09 月 17 日:
1、重构代码,自动获取 Github 上最新版来安装,不再手动修改版本号;
2、自动检测本机是否已经安装,若已安装则正常退出(若要安装新版,则需先卸载);
3、改为下载 tar.gz 包来安装,不用依赖 unzip 命令。
2016 年 09 月 12 日:
1、更新:升级版本到 2.5.2。
2016 年 09 月 11 日:
1、更新:升级版本到 2.5.1。
2016 年 08 月 29 日:
1、更新:升级版本到 2.5.0;
2、修正:由于安装时文件名的更新,卸载时文件名改为一致。
2016 年 07 月 14 日:
1、更新:升级版本到 2.4.7。
2016 年 07 月 05 日:
1、修正:新增的依赖 xmlto、asciidoc;
2、修正:由于安装时文件名的更新,卸载时文件名改为一致。
2016 年 05 月 12 日:
1、新增:在 CentOS 7 下的防火墙规则设置。
2015 年 08 月 01 日:
1、新增:自定义服务器端口功能(如不设定,默认为 8989)。
2015 年 04 月 30 日:
1、修正:配置文件 /etc/shadowsocks-libev/config.json 同时启用 IPv4 与 IPv6 支持:

{
    "server":["[::0]","0.0.0.0"],
    "server_port":your_server_port,
    "local_address":"127.0.0.1",
    "local_port":1080,
    "password":"your_password",
    "timeout":600,
    "method":"aes-256-cfb"
}

2、Shadowsocks libev 版不能通过修改配置文件来多端口(只能开启多进程),如果你需要多端口请安装 Python 或 Go 版;

特别说明:
1、已安装旧版本的 shadowsocks 需要升级的话,需下载本脚本的最新版,运行卸载命令

./shadowsocks-libev.sh uninstall 

然后,下载最新版脚本即可安装最新版。

参考链接:
https://github.com/shadowsocks/shadowsocks-libev

永久更改hostname主机名

# vi /etc/sysconfig/network 

NETWORKING=yes 

HOSTNAME=yourname //在这修改hostname 

NISDOMAIN=eng-cn.platform.com 



2.修改/etc/hosts里面的名字 

# vi /etc/hosts 

127.0.0.1 localhost.localdomain localhost 

172.17.33.169 yourname //在这修改hostname 



3.最后在终端下执行: 

#hostname ***** //*****为修改的hostname

hostname命令只是临时改变主机名,重启后主机名还是恢复成原来的。要想永久更改主机名,需要修改/etc/sysconfig/network 文件。

今天发现一个问题,由于个人习惯问题,装系统的时候并没有设置好LINUX的主机名,而是习惯用 

# hostname (主机名) 

进行设置,当重新登录到系统的时候,设置的主机名就生效,由于服务器长期开着,也不太重启,所以一直没有注意当重启机器后,使用hostname 设置的主机名并不记录到系统文件中。 



查看主机名命令 

# uname -n 

qmail.hzhyzg.com 



配置文件 

# cat /etc/sysconfig/network 

NETWORKING=yes 

HOSTNAME=localhost.localdomain 



将HOSTNAME改成设置的主机名,永远生效 



linux下修改主机名

修改主机名:

1./etc/sysconfig/network

内容:

networking=yes

hostname=lh //主机名(没有这行?那就添加这一行吧) 

gateway=192.168.1.1

2.运行命令:

#hostname lh 

//lh为主机名 

3./etc/hosts

内容:

# do not remove the following line, or various programs

# that require network functionality will fail.

127.0.0.1 localhost localhost.localdomain localhost

把第二localhost写为lh,即:

127.0.0.1 lh localhost.localdomain localhost

但是步骤3不是必须的。如果这三个步骤都做了,无论是否重起,

主机名都将修改成功 

在linux 系统中,默认的主机名是loalhost,如果想修改自己的主机名,可以使用命令:hostname xxx。不过如果你正在使用x window窗口,用这个命令修改了主机名之后就打不开xterm了。所以,彻底一点的办法是直接修改/etc/network文件:hostname= xxx,然后重启计算机,主机名已经被修改了。

使用dhcp的系统就不能用上述方法了,因为启动network时主机名会被改成dhcp服务器提供的名称。怎么办呢?既然主机名被粗暴的修改了,那咱们也粗暴的改回来:编辑/etc/rc,在最后加上一行hostname xxx,重启系统就ok了。。



本人参考以上两处,首先更改了/etc/sysconfig/network;然后#hostname landnow,此时可能出现终端打不开的情况,所以也把/etc/hosts文件也更改了。如果主机名称确定以后,建议更改两个文件(即/etc/sysconfig/network,/etc/hosts)后重启,或者更改两个文件后再执行该命令#hostname landnow 注:landnow是我预设的主机名。

linux下mount硬盘步骤,含UUID mount办法

linux下mount步骤

一、建立分区

fdisk -l /dev/emcpowera

fdisk /dev/emcpowera

输入n,p,default,default,建立一个主分区,分给全部空间。

二、建立ext3文件系统

mkfs.ext3 /dev/emcpowera1

[@more@]

三、创建挂载的目录

mkdir /archive

chown oracle:oinstall /archive

四、挂载

挂载分区:mount /dev/emcpowera1 /archive

卸载分区:umount /dev/emcpowera1 /archive

mount 查看各挂载点状态

mount -a 执行fstab中的文件系统的挂载

五、自动挂载

编辑/etc/fstab, 添加要挂载的条目,要使用UUID方式,不要使用设备分区名(如/dev/sdb1),因为有多个磁盘时使用设备分区名可能会挂载错误(如,变换主机Lun映射的顺序,则在Linux上相应的设备分区名会被改变,也即通常所说的盘符漂移。所以要用UUID方式,才能保证设备分区名发生改变时,挂载的设备不发生调换)。

1)、查询需要挂载的磁盘的UUID,使用命令如下:

# blkid

或vol_id 最准确,blkid 要 sudo 才反映新 uuid

相关文件:/etc/blkid.tab

2)、修改/etc/fstab文件,在文件末尾加上:(把/dev/emcpowera1的文件系统mount到目录/archive上)

Redhat系统下添加:

UUID=894d76a6-b175-4eb1-89e5-3fd8d146eab7 /archive ext3 defaults 0 0

第三列(ext3)指定了设备和分区的文件系统格式,可以使用auto”选项简单地表示文件系统格式由系统自动检测

第四列(defaults)列出了对于每一个设备或者分区的所有挂载选项,使用defaults选项与rw,suid,dev,exec,auto,nouser,async等价。



3)、修改系统的启动文件,让系统重启后执行fstab文件参数中的挂载。

Redhat系统:

SMCDB-1:/# vi /etc/rc.d/rc 在文件的末尾行添加“/bin/ mount -a”

/bin/ mount -a 此命令是在系统启动后再去执行fstab中mount

注:/bin/mount –a命令要添加在exit0前面

4)、重新启动Linux后,使用mount查看

#mount

centos history显示命令执行时间、执行用户,执行IP

1.在/etc/profile的最后添加如下部分:

USER_IP=`who -u am i 2>/dev/null| awk ‘{print $NF}’|sed -e ‘s/[()]//g’`  
export HISTTIMEFORMAT=”[%F %T][`whoami`][${USER_IP}] ” 

重载:source /etc/profile

export HISTTIMEFORMAT


测试一下:#history 

    1  [2016-12-08 22:53:49][root][192.168.1.20] ifconfig
    2  [2016-12-08 22:53:49][root][192.168.1.20] init 3
    3  [2016-12-08 22:53:49][root][192.168.1.20] df
    4  [2016-12-08 22:53:49][root][192.168.1.20] vi /etc/resolv.conf 
    5  [2016-12-08 22:53:49][root][192.168.1.20] ll
    6  [2016-12-08 22:53:49][root][192.168.1.20] df
    7  [2016-12-08 22:53:49][root][192.168.1.20] df -h
    8  [2016-12-08 22:53:49][root][192.168.1.20] ll
    9  [2016-12-08 22:53:49][root][192.168.1.20] df -h
   10  [2016-12-08 22:53:49][root][192.168.1.20] netstat -npt
   11  [2016-12-08 22:53:49][root][192.168.1.20] cd /etc/sysconfig/
   12  [2016-12-08 22:53:49][root][192.168.1.20] ll
   13  [2016-12-08 22:53:49][root][192.168.1.20] cd network
   14  [2016-12-08 22:53:49][root][192.168.1.20] cd network-scripts/
   15  [2016-12-08 22:53:49][root][192.168.1.20] ll
   16  [2016-12-08 22:53:49][root][192.168.1.20] vi ifcfg-eth0 
   17  [2016-12-08 22:53:49][root][192.168.1.20] df -h
   18  [2016-12-08 22:53:49][root][192.168.1.20] vi /etc/fstab 
   19  [2016-12-08 22:53:49][root][192.168.1.20] \df
   20  [2016-12-08 22:53:49][root][192.168.1.20] df
   21  [2016-12-08 22:53:49][root][192.168.1.20] umount tmpfs
   22  [2016-12-08 22:53:49][root][192.168.1.20] df
   23  [2016-12-08 22:53:49][root][192.168.1.20] df -h
   24  [2016-12-08 22:53:49][root][192.168.1.20] dmesg 
   25  [2016-12-08 22:53:49][root][192.168.1.20] df
   26  [2016-12-08 22:53:49][root][192.168.1.20] ll
   27  [2016-12-08 22:53:49][root][192.168.1.20] vi ifcfg-eth0 
   28  [2016-12-08 22:53:49][root][192.168.1.20] ifup eth0
   29  [2016-12-08 22:53:49][root][192.168.1.20] ifconfig
   30  [2016-12-08 22:53:49][root][192.168.1.20] ping 192.168.1.100
   31  [2016-12-08 22:53:49][root][192.168.1.20] vi ifcfg-eth0 
   32  [2016-12-08 22:53:49][root][192.168.1.20] ifconifg
   33  [2016-12-08 22:53:49][root][192.168.1.20] ls
   34  [2016-12-08 22:53:49][root][192.168.1.20] reboot ;exit
   35  [2016-12-08 22:53:49][root][192.168.1.20] ifconfig
   36  [2016-12-08 22:53:49][root][192.168.1.20] df -h
   37  [2016-12-08 22:53:49][root][192.168.1.20] dmesg 
   38  [2016-12-08 22:53:49][root][192.168.1.20] df -h
   39  [2016-12-08 22:53:49][root][192.168.1.20] netstat -nlpt
   40  [2016-12-08 22:53:49][root][192.168.1.20] df -h
   41  [2016-12-08 22:53:49][root][192.168.1.20] exit
   42  [2016-12-08 22:53:49][root][192.168.1.20] shutdown -P now
   43  [2016-12-08 22:53:49][root][192.168.1.20] ifconifg
   44  [2016-12-08 22:53:49][root][192.168.1.20] ifconfig
   45  [2016-12-08 22:53:49][root][192.168.1.20] ping 192.168.1.1
   46  [2016-12-08 22:53:49][root][192.168.1.20] ping 192.168.1.3
   47  [2016-12-08 22:53:49][root][192.168.1.20] ping 192.168.1.100
   48  [2016-12-08 22:53:49][root][192.168.1.20] cd /etc/sysconfig/network-scripts/
   49  [2016-12-08 22:53:49][root][192.168.1.20] ll
   50  [2016-12-08 22:53:49][root][192.168.1.20] vi ifcfg-eth0 
   51  [2016-12-08 22:53:49][root][192.168.1.20] /etc/init.d/network restart
   52  [2016-12-08 22:53:49][root][192.168.1.20] ping 192.168.1.100
   53  [2016-12-08 22:53:49][root][192.168.1.20] ifconfig
   54  [2016-12-08 22:53:49][root][192.168.1.20] route -a
   55  [2016-12-08 22:53:49][root][192.168.1.20] route -n
   56  [2016-12-08 22:53:49][root][192.168.1.20] vi ifcfg-eth0 
   57  [2016-12-08 22:53:49][root][192.168.1.20] /etc/init.d/network restart
   58  [2016-12-08 22:53:49][root][192.168.1.20] vi ifcfg-eth0 
   59  [2016-12-08 22:53:49][root][192.168.1.20] /etc/init.d/network restart
   60  [2016-12-08 22:53:49][root][192.168.1.20] ping 192.168.1.100
   61  [2016-12-08 22:53:49][root][192.168.1.20] iptables-save
   62  [2016-12-08 22:53:49][root][192.168.1.20] iptables -F
   63  [2016-12-08 22:53:49][root][192.168.1.20] ping 192.168.1.100
   64  [2016-12-08 22:53:49][root][192.168.1.20] /etc/init.d/network restart
   65  [2016-12-08 22:53:49][root][192.168.1.20] vi ifcfg-eth0 
   66  [2016-12-08 22:53:49][root][192.168.1.20] /etc/init.d/network restart
   67  [2016-12-08 22:53:49][root][192.168.1.20] vi ifcfg-eth0 
   68  [2016-12-08 22:53:49][root][192.168.1.20] /etc/init.d/network restart
   69  [2016-12-08 22:53:49][root][192.168.1.20] vi ifcfg-eth0 
   70  [2016-12-08 22:53:49][root][192.168.1.20] /etc/init.d/network restart
   71  [2016-12-08 22:53:49][root][192.168.1.20] ping 192.168.1.100
   72  [2016-12-08 22:53:49][root][192.168.1.20] vi ifcfg-eth0 
   73  [2016-12-08 22:53:49][root][192.168.1.20] /etc/init.d/network restart
   74  [2016-12-08 22:53:49][root][192.168.1.20] ping 192.168.1.100
   75  [2016-12-08 22:53:49][root][192.168.1.20] ifconfig
   76  [2016-12-08 22:53:49][root][192.168.1.20] ping v.qq.com
   77  [2016-12-08 22:53:49][root][192.168.1.20] ifconfig
   78  [2016-12-08 22:53:49][root][192.168.1.20] vi ifcfg-eth0 
   79  [2016-12-08 22:53:49][root][192.168.1.20] /etc/init.d/network restart
   80  [2016-12-08 22:53:49][root][192.168.1.20] df -h
   81  [2016-12-08 22:53:49][root][192.168.1.20] dmesg 
   82  [2016-12-08 22:53:49][root][192.168.1.20] df -h
   83  [2016-12-08 22:53:49][root][192.168.1.20] shutdown -p now
   84  [2016-12-08 22:53:49][root][192.168.1.20] shutdown -P now
   85  [2016-12-08 22:53:49][root][192.168.1.20] reboot
   86  [2016-12-08 22:53:49][root][192.168.1.20] df
   87  [2016-12-08 22:53:49][root][192.168.1.20] dmesg 
   88  [2016-12-08 22:53:49][root][192.168.1.20] df -h
   89  [2016-12-08 22:53:49][root][192.168.1.20] netstat -nlpt
   90  [2016-12-08 22:53:49][root][192.168.1.20] cd /usr/local/
   91  [2016-12-08 22:53:49][root][192.168.1.20] ll
   92  [2016-12-08 22:53:49][root][192.168.1.20] rz -dey
   93  [2016-12-08 22:53:49][root][192.168.1.20] yum install -y lrzsz telnet tcpdump traceroute vmstat sysstat rsync mail bind-utils
   94  [2016-12-08 22:53:49][root][192.168.1.20] rz -dey
   95  [2016-12-08 22:53:49][root][192.168.1.20] tar -zxvf services.20160816.tgz 
   96  [2016-12-08 22:53:49][root][192.168.1.20] df -h
   97  [2016-12-08 22:53:49][root][192.168.1.20] ll
   98  [2016-12-08 22:53:49][root][192.168.1.20] w
   99  [2016-12-08 22:53:49][root][192.168.1.20] df -h
  100  [2016-12-08 22:53:49][root][192.168.1.20] vi /etc/sysconfig/iptables
  101  [2016-12-08 22:53:49][root][192.168.1.20] /etc/init.d/iptables restart
  102  [2016-12-08 22:53:49][root][192.168.1.20] w
  103  [2016-12-08 22:53:49][root][192.168.1.20] df
  104  [2016-12-08 22:53:49][root][192.168.1.20] df -h
  105  [2016-12-08 22:53:49][root][192.168.1.20] dmesg 
  106  [2016-12-08 22:53:49][root][192.168.1.20] vi /etc/profile
  107  [2016-12-08 22:53:49][root][192.168.1.20] exit
  108  [2016-12-08 22:53:49][root][192.168.1.20] history 
  109  [2016-12-08 22:53:49][root][192.168.1.20] vi /etc/profile
  110  [2016-12-08 22:53:49][root][192.168.1.20] exit
  111  [2016-12-08 22:53:49][root][192.168.1.20] history 
  112  [2016-12-08 22:53:49][root][192.168.1.20] vi /etc/profile
  113  [2016-12-08 22:53:49][root][192.168.1.20] exit
  114  [2016-12-08 22:53:49][root][192.168.1.20] w
  115  [2016-12-08 22:53:49][root][192.168.1.20] history 
  116  [2016-12-08 22:53:49][root][192.168.1.20] vi /etc/profile
  117  [2016-12-08 22:53:49][root][192.168.1.20] exit
  118  [2016-12-08 22:53:50][root][192.168.1.20] history 

2种方法解决mysql主从不同步

今天发现Mysql的主从数据库没有同步
 
先上Master库:
 
mysql>show processlist;   查看下进程是否Sleep太多。发现很正常。
show master status; 也正常。
 
mysql> show master status;
+——————-+———-+————–+——————————-+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB              |
+——————-+———-+————–+——————————-+
| mysqld-bin.000001 |     3260 |              | mysql,test,information_schema |
+——————-+———-+————–+——————————-+
1 row in set (0.00 sec)
 
再到Slave上查看
 
mysql> show slave status\G                                                
 
Slave_IO_Running: Yes
Slave_SQL_Running: No
 
可见是Slave不同步
 
下面介绍两种解决方法:
 
 
方法一:忽略错误后,继续同步
该方法适用于主从库数据相差不大,或者要求数据可以不完全统一的情况,数据要求不严格的情况
 
解决: 
stop slave;
 
#表示跳过一步错误,后面的数字可变
set global sql_slave_skip_counter =1;
start slave;
 
之后再用mysql> show slave status\G  查看:
 
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
 
ok,现在主从同步状态正常了。。。
 
 
方式二:重新做主从,完全同步
该方法适用于主从库数据相差较大,或者要求数据完全统一的情况
 
解决步骤如下:
 
1.先进入主库,进行锁表,防止数据写入
 
使用命令:
 
mysql> flush tables with read lock;
 
注意:该处是锁定为只读状态,语句不区分大小写
 
2.进行数据备份 
 
#把数据备份到mysql.bak.sql文件
[root@server01 mysql]#mysqldump -uroot -p -hlocalhost > mysql.bak.sql
这里注意一点:数据库备份一定要定期进行,可以用shell脚本或者python脚本,都比较方便,确保数据万无一失
3.查看master 状态
 
mysql> show master status;
+——————-+———-+————–+——————————-+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB              |
+——————-+———-+————–+——————————-+
| mysqld-bin.000001 |     3260 |              | mysql,test,information_schema |
+——————-+———-+————–+——————————-+
1 row in set (0.00 sec)
 
4.把mysql备份文件传到从库机器,进行数据恢复
 
#使用scp命令
[root@server01 mysql]# scp mysql.bak.sql root@192.168.128.101:/tmp/
 
5.停止从库的状态
mysql> stop slave;
 
 
6.然后到从库执行mysql命令,导入数据备份
 
mysql> source /tmp/mysql.bak.sql
 
7.设置从库同步,注意该处的同步点,就是主库show master status信息里的| File| Position两项
 
change master to master_host = ‘192.168.128.100’, master_user = ‘rsync’, master_port=3306, master_password=”, master_log_file = ‘mysqld-bin.000001’, master_log_pos=3260;
 
8.重新开启从同步
mysql> start slave;
 
9.查看同步状态
mysql> show slave status\G  查看:
 
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
 
好了,同步完成啦。

mysql运维-slave_skip_errors

1 简介

    mysql在主从复制过程中,由于各种的原因,从服务器可能会遇到执行BINLOG中的SQL出错的情况,在默认情况下,服务器会停止复制进程,不再进行同步,等到用户自行来处理。

    slave-skip-errors的作用就是用来定义复制过程中从服务器可以自动跳过的错误号,当复制过程中遇到定义的错误号,就可以自动跳过,直接执行后面的SQL语句。

2 官方参考


Command-Line Format

–slave-skip-errors=name

System Variable Name

slave_skip_errors

Variable Scope

Global

Dynamic Variable

No

 

Permitted Values

Type

string

Default

OFF

Valid Values

OFF

[list of error codes]

all

ddl_exist_errors

    slave_skip_errors选项有四个可用值,分别为:off,all,ErorCode,ddl_exist_errors

     默认情况下该参数值是off,我们可以列出具体的error code,也可以选择all,mysql5.6及MySQL Cluster NDB 7.3以及后续版本增加了参数ddl_exist_errors,该参数包含一系列error code(1007,1008,1050,1051,1054,1060,1061,1068,1094,1146)

    一些error code代表的错误如下:

    1007:数据库已存在,创建数据库失败

    1008:数据库不存在,删除数据库失败

    1050:数据表已存在,创建数据表失败

    1051:数据表不存在,删除数据表失败

    1054:字段不存在,或程序文件跟数据库有冲突

    1060:字段重复,导致无法插入

    1061:重复键名

    1068:定义了多个主键

    1094:位置线程ID

    1146:数据表缺失,请恢复数据库

    1053:复制过程中主服务器宕机

    1062:主键冲突 Duplicate entry ‘%s’ for key %d    my.cnf中的写法:

[sql] view plain copy

  1. slave_skip_errors=1062,1053  
  2. slave_skip_errors=all  
  3. slave_skip_errors=ddl_exist_errors  

    作为mysql启动参数的写法:

[sql] view plain copy

  1. –slave-skip-errors=1062,1053  
  2. –slave-skip-errors=all  
  3. –slave-skip-errors=ddl_exist_errors  

    从数据库中查看该参数的值:

[sql] view plain copy

  1. mysql> show variables like ‘slave_skip%’;  
  2. +——————-+——-+  
  3. | Variable_name     | Value |  
  4. +——————-+——-+  
  5. | slave_skip_errors | 1007  |  
  6. +——————-+——-+  

3 举例分析

    3.1 测试说明
    配置好MySQL主从同步,然后在从上写入数据,造成主从不一致。
    3.2 准备测试表结构
    在主机上创建表:

[sql] view plain copy

  1. create table replication (c1 int not null primary key, c2 varchar(10));  

    3.3 准备测试数据

    在主机上插入基础数据

[sql] view plain copy

  1. mysql> insert into replication values (1, ‘test1’);  
  2. mysql> insert into replication values (2, ‘test2’);  

    此时,主机从机replication表里面都有两条记录
    3.4 开始测试
    从机插入一条记录

[sql] view plain copy

  1. mysql> insert into replication values (3, ‘test3’);  

    然后在主机上执行相同的操作

[sql] view plain copy

  1. mysql> insert into replication values (3, ‘test3’);  

    在从机上查看复制状态

[sql] view plain copy

  1. mysql> show slave status \G  
  2. *************************** 1. row ***************************  
  3.                Slave_IO_State: Waiting for master to send event  
  4.                   Master_Host: 192.168.1.222  
  5.                   Master_User: repl  
  6.                   Master_Port: 3306  
  7.                 Connect_Retry: 60  
  8.               Master_Log_File: mysql-bin.000003  
  9.           Read_Master_Log_Pos: 16700  
  10.                Relay_Log_File: mysql-relay-bin.000003  
  11.                 Relay_Log_Pos: 16595  
  12.         Relay_Master_Log_File: mysql-bin.000003  
  13.              Slave_IO_Running: Yes  
  14.             Slave_SQL_Running: No  
  15.               Replicate_Do_DB:   
  16.           Replicate_Ignore_DB:   
  17.            Replicate_Do_Table:   
  18.        Replicate_Ignore_Table: mysql.ibbackup_binlog_marker  
  19.       Replicate_Wild_Do_Table:   
  20.   Replicate_Wild_Ignore_Table: mysql.backup_%  
  21.                    Last_Errno: 1062  
  22.                    Last_Error: Error ‘Duplicate entry ‘3‘ for key ‘PRIMARY on query. Default database‘test’. Query: ‘insert into replication values (3, ‘test3‘)’  
  23.                  Skip_Counter: 0  
  24.           Exec_Master_Log_Pos: 16425  
  25.               Relay_Log_Space: 17544  

    可以看到:sql线程已经停止工作 Slave_SQL_Running: No

                        错误号为:Last_Errno: 1062

                        错误信息为:Last_Error: Error ‘Duplicate entry ‘3’ for key ‘PRIMARY” on query. Default database: ‘test’. Query: ‘insert into replication values (3, ‘test3′)’

    如果我们在my.cnf中加入如下选项,则可跳过此错误,数据同步继续进行。

[sql] view plain copy

  1. [mysqld]  
  2. slave_skip_errors=1062  

    具体测试方法同上,大家可自己验证。

4 从backup恢复时从机复制出错的一些解释

    mysql企业版备份工具meb提供在线热备功能,如果在备份过程中执行ddl操作,从机需要从主机的备份恢复时可能会异常,从而导致从机同步数据失败。原因是从机恢复时需要先从备份文件恢复(包含备份过程中执行的ddl语句),同步时不是从全备后的最后一个位置同步,而是从ddl的上个位置同步,如果再次执行该ddl语句在从机上不会造成冲突,则同步继续,如果会造成冲突,同步终止。解决此冲突的办法是在my.cnf文件中加入一行

[sql] view plain copy

  1. [mysqld]  
  2. slave_skip_errors=ddl_exist_errors  

5 注意事项

    5.1 该参数为全局静态参数,不能动态调整,可在my.cnf中加入该参数列表后重启mysql服务器生效。

    5.2 必须注意的是,启动这个参数,如果处理不当,很可能造成主从数据库的数据不同步,在应用中需要根据实际情况,如果对数据完整性要求不是很严格,那么这个选项确实可以减轻维护的成本


解决办法一、
Slave_SQL_Running: No
1.程序可能在slave上进行了写操作
2.也可能是slave机器重起后,事务回滚造成的.



 Last_SQL_Errno: 1677
 Last_SQL_Error: Column 1 of table 'test.t' cannot be converted from type 'int' to type 'bigint(20)'
解决方法:这个案例是从网上找到的,自己动手实验了一把。从错误信息来看表面上是由于在slave上无法执行一条转换字段类型的SQL语句。实际上并不是有这种语句直接引起的,而是间接引起的(之前某些操作导致主从表字段类型不一致,接下来对这个表进行DML时就会报错)。它的意思是在对这个表t进行DML操作时,发现主从上表结果不一致,比如这里是说在主上t的字段1是int类型,但是从上t的字段1是bigint类型,所以报错。那么为什么要报错呢?这是从安全角度考虑,因为如果字段类型不一致可能会导致数据截断之类的问题。那么解决方法呢?通过参数slave_type_conversions进行控制,它有三种取值:
ALL_LOSSY:仅支持有损转换,什么叫有损?比如一个值本来是bigint存储为9999999999999,现在转换为int类型势必会要截断从而导致数据不一致。
ALL_NON_LOSSY:仅支持无损转换,只能在无损的情况下才能进行转换
ALL_LOSSY,ALL_NON_LOSSY:有损/无算转换都支持
空,即不设置这个参数:必须主从的字段类型一模一样。
注意: 前面说的这几中情况都只在binlog_format=ROW的情况下才有效。


 Last_SQL_Errno: 1194
 Last_SQL_Error: Error 'Table 'traincenter' is marked as crashed and should be repaired' on query. Default database: 'basketballman'. Query: 'update traincenter set points='4',pointstime='1361912066' where uid = '1847482697' limit 1'
 解决方法:myisam表traincenter损坏,直接repair table即可。至于为什么myisam类型表比innodb更容易损坏,我觉得有两个原因:1,innodb有double write机制,损坏或者half write的页可以用它恢复,第二innodb是事务引擎,都有操作都是事务的,而myisam是非事务的,存在写一半但是操作终止情况。


 Last_IO_Errno: 1236
 Last_IO_Error: Got fatal error 1236 from master when reading data from binary log: 'Could not find first log file name in binary log index file'
 解决方法:主库上的binlog文件已经不存在但是在index file中确有相应记录存在。我这里发生这个错误的原因在于由于复制中断时间很长,报警出来一直没人处理,这个中断时间超过master上binlog超期时间,等恢复复制时需要的binlog已经由于其超期而被删掉,没办法只好重建这个实例了。以大家都要引以为戒
stop slave;
reset slave; 
slave start;


 Last_IO_Errno: 1593
 Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server ids; these ids must be different for replication to work (or the --replicate-same-server-id option must be used on slave but this does not always make sense; please check the manual before using it).
 解决方法:主从配置的server-id一样,而在主从复制环境中server-id一样的binlog events都会被过滤掉。具体server-id的含义可以了解一下复制原理。这个一般是因为拷贝配置文件时忘记修改server-id导致,遇到这类问题也比较容易,平时操作谨慎一点即可。


 Last_Errno: 1053
 Last_Error: Query partially completed on the master (error on master: 1053) and was aborted. There is a chance that your master is inconsistent at this point. If you are sure that your master is ok, run this query manually on the slave and then restart the slave with SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1; START SLAVE; . Query: 'insert into ...
 解决方法:查询在master上部分完成,然后终止了。这马上又能想到是myisam表,结果也正是这样。由于myisam不支持事务所以可能存在一个查询完成一部分然后失败的情况。解决方法一般也就是提示信息给出的跳过一个binlog event。不过确认跳过之前最好还是查询一下master上是否真的存在相应的记录,因为错误信息同时还会给出它认为在master上执行一部分然后终止的查询语句。


 Last_SQL_Errno: 1666
 Last_SQL_Error: Error executing row event: 'Cannot execute statement: impossible to write to binary log since statement is in row format and BINLOG_FORMAT = STATEMENT.' 
 解决方法:这个案例的背景是做一个ABC结构的复制,B、C中设定的binlog_format=statement,A中的是MIXED,所以当B尝试重做A过来的relay log,然后记录binlog(传给C)时发现relay log的binlog_format与自己设定的binlog_format不一致。我当时就是直接先更改BC的binlog_format=MIXED解决。


 Last_Errno: 1032
 Last_Error: Could not execute Update_rows event on table db.table; Can't find record in 'table', Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND; the event's master log mysql-bin.000064, end_log_pos 158847
解决方法:这个是在binlog_format=row复制下发生的。原因是因为row格式复制是最严格的,所以在mysql看来如果在从库上找不到要更新的这条记录,那么就代表主从数据不一致,因此报错。另外顺便说一句,对于row格式binlog,如果某个更新操作实际上并没有更新行,这个操作是不会记binlog的,因为row格式的binlog宗旨就是只记录发生了改变的行。所以这个解决办法根据你自己实际应用来定,最好的方法还是重做slave吧,这样更放心。


 Last_Errno: 28
 Last_Error: Error in Append_block event: write to '/tmp/SQL_LOAD-32343798-72213798-1.data' failed
 解决方法: 首先说错误原因:主库执行load data infile,同步到从库后load data infile存放的文件默认是放在/tmp(由参数slave_load_tmpdir控制),而/tmp空间不够因此报错。因此只要将从库上slave_load_tmpdir设置到一个磁盘空间足够大的分区就行。

配置mysql5.5主从服务器(转)

配置mysql5.5主从服务器

Mysql提供了主从复制的功能,作用类似oracle的dataguard,但是配置和管理远比dataguard简单,没有所谓的物理备库和逻辑备库之分,也没有提供相应的数据保护模式,只有master和slave数据库角色,这种架构广泛应用于各大门户,游戏网站中,提供数据库的读写分离功能;相比之下oracle的读写功能到了11g版本才能借助active dataguard完美实现,否则就只能用logical standby,但又有许多的数据类型和操作不被逻辑备库支持!先前使用过mysql5.1.36版本的master-slave架构做CMS数据库的读写分离,有着非常痛苦的使用经历,经常由于各种各样的原因的导致主从数据不同步,然后又没有提供额外的同步机制(确切的说是没学会),于是经常在下班时间重构主从架构;下一步将在mysql5.5平台测试mha架构,故本文记录下如何在mysql5.5平台下构建主从数据库复制环境;另外mysql的主从也可看为是mysql的实时备份,有一定的数据灾备功能,mysql本身没有提供类似oracle rman的热备份工具,因而多数场景下会使用主从对数据库做一个实时备份,以备不时只需!PS:一直比较不解的mysql如何做基于时间或者SCN的不完全恢复?难道真要一个个binlog分析过去?

一、安装MySQL

说明:在两台MySQL服务器192.168.1.2和192.168.1.3上分别进行如下操作,安装MySQL 5.5.22

 二、配置MySQL主服务器(192.168.1.2)
mysql  -uroot  -p    #进入MySQL控制台
create database osyunweidb;   #建立数据库osyunweidb
insert into mysql.user(Host,User,Password) values(‘localhost’,’osyunweiuser’,password(‘Mypasswd8800’));   #创建用户osyunweiuser

#建立MySQL主从数据库同步用户osyunweidbbak密码Mypasswd8800 

flush privileges;   #刷新系统授权表

#授权用户osyunweidbbak只能从192.168.1.3这个IP访问主服务器192.168.1.2上面的数据库,并且只具有数据库备份的权限
grant replication slave  on *.* to ‘osyunweidbbak’@’192.168.1.3’ identified by ‘Mypasswd8800’ with grant option; 

三、把MySQL主服务器192.168.1.2中的数据库osyunweidb导入到MySQL从服务器192.168.1.3中
1、导出数据库osyunweidb

mysqldump -u root -p osyunweidb > /home/osyunweidbbak.sql    #在MySQL主服务器进行操作,导出数据库osyunweidb到/home/osyunweidbbak.sql 

备注:在导出之前可以先进入MySQL控制台执行下面命令

flush tables with read lock;    #数据库只读锁定命令,防止导出数据库的时候有数据写入

unlock tables;   #解除锁定

2、导入数据库到MySQL从服务器

mysql  -u root -p  #进入从服务器MySQL控制台

create database osyunweidb;   #创建数据库

use osyunweidb    #进入数据库

source  /home/osyunweidbbak.sql  #导入备份文件到数据库

mysql -u osyunweidbbak -h 192.168.1.2 -p  #测试在从服务器上登录到主服务器
四、配置MySQL主服务器的my.cnf文件
vi /etc/my.cnf   #编辑配置文件,在[mysqld]部分添加下面内容
server-id=1   #设置服务器id,为1表示主服务器,注意:如果原来的配置文件中已经有这一行,就不用再添加了。
log-bin=mysql-bin  #启动MySQ二进制日志系统,注意:如果原来的配置文件中已经有这一行,就不用再添加了。
binlog-do-db=osyunweidb  #需要同步的数据库名,如果有多个数据库,可重复此参数,每个数据库一行
binlog-ignore-db=mysql   #不同步mysql系统数据库
service mysqld  restart  #重启MySQL
mysql -u root -p   #进入mysql控制台
show master status;  查看主服务器,出现以下类似信息
+——————+———-+————–+——————+
| File                        | Position  | Binlog_Do_DB | Binlog_Ignore_DB |
+——————+———-+————–+——————+
| mysql-bin.000019 |    7131    | osyunweidb    | mysql                  |
+——————+———-+————–+——————+
1 row in set (0.00 sec)
注意:这里记住File的值:mysql-bin.000019和Position的值:7131,后面会用到。
五、配置MySQL从服务器的my.cnf文件
vi /etc/my.cnf   #编辑配置文件,在[mysqld]部分添加下面内容
server-id=2   #配置文件中已经有一行server-id=1,修改其值为2,表示为从数据库
log-bin=mysql-bin  #启动MySQ二进制日志系统,注意:如果原来的配置文件中已经有这一行,就不用再添加了。
replicate-do-db=osyunweidb   #需要同步的数据库名,如果有多个数据库,可重复此参数,每个数据库一行
replicate-ignore-db=mysql   #不同步mysql系统数据库
:wq!    #保存退出
service mysqld restart   #重启MySQL
注意:MySQL 5.1.7版本之后,已经不支持把master配置属性写入my.cnf配置文件中了,只需要把同步的数据库和要忽略的数据库写入即可。
mysql  -u root -p  #进入MySQL控制台
slave stop;   #停止slave同步进程
change master to master_host=’192.168.1.2′,master_user=’osyunweidbbak’,master_password=’Mypasswd8800′,master_log_file=’mysql-bin.000019′ ,master_log_pos=7131;    #执行同步语句
slave start;    #开启slave同步进程
SHOW SLAVE STATUS\G   #查看slave同步信息,出现以下内容
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.1.2
                  Master_User: osyunweidbbak
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000019
          Read_Master_Log_Pos: 7131
               Relay_Log_File: MySQLSlave-relay-bin.000002
                Relay_Log_Pos: 253
        Relay_Master_Log_File: mysql-bin.000019
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: osyunweidb
          Replicate_Ignore_DB: mysql
           Replicate_Do_Table:
       Replicate_Ignore_Table:
1 row in set (0.00 sec)
注意查看:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
以上这两个参数的值为Yes,即说明配置成功!
 

六、测试MySQL主从服务器双机热备是否成功
1、进入MySQL主服务器

mysql -u root -p  #进入主服务器MySQL控制台

use osyunweidb   #进入数据库

CREATE TABLE test ( id int not null primary key,name char(20) );   #创建test表
2、进入MySQL从服务器

mysql -u root -p  #进入MySQL控制台

use osyunweidb   #进入数据库

show  tables;  #查看osyunweidb表结构,会看到有一个新建的表test,表示数据库同步成功

至此,MySQL数据库配置主从服务器实现双机热备实例教程完成