面试面到这个问题,以前只知道dba大概用的啥工具,从来没想自己搞过,现在面试要求有这方面技能,回答的不是太好,我只知道通过binlog可以支持异步同步,具体不知道怎么做。配置软件的事还要问,也是醉了。
先搞最简单的模式,mysql自带的replication,这个应该就是最普通读写分离的主从模式了,可以一写多读。流量不高还是可以的,然后需要加一下主备,我看之前一般是通过keepalived去做的,多主这种一般使用percona的工具去做的,支持强一致的模式,这些都没搞过。我看mysql文档,mysql支持innodb集群,支持多主,这个文档还没看,后面再研究。还提到一个NDB Cluster。
我的mysql是安装的8.0.26,看官网不但支持普通的replication模式,通过binlog日志和同步的位置来同步,还支持global transaction identifiers (GTIDs) 的模式,这个replication模式不需要binlog了,看名字是事务相关。相关的文档还没看,只是先走了一下普通的模式。
首先,需要设置实例的server_id,这个需要集群里唯一,可在/etc/my.cnf里面加一条
[mysqld]
server-id=142
主从库都需要配置。
主库需要开启binlog,这个默认是开启的。从库视情况,如果需要作为别的从库的主库,也是必须要开启的。
从库需要配置一下relay-log,默认是按照主机名配置的,说是防止主机名变动,导致错误。
relay-log=/var/lib/mysql/re-relay-log
relay-log-index=/var/lib/mysql/re-relay-log.i
创建用于同步的专属用户
mysql> CREATE USER 'repl'@'%.example.com' IDENTIFIED BY 'password';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%.example.com';
官网说,这个用户的密码是明文保存在从库中的,所以为了安全还是有必要创建一个的。
然后需要确定binlog同步的位置
先在主库加表的读锁,这样会阻塞写事务的提交。
mysql> FLUSH TABLES WITH READ LOCK;
新启动一个mysqlsession,执行SHOW MASTER STATUS,查看binary log的文件名和位置。文档说如果之前主库禁止了binlog,这个命令会返回空,在后边需要用到这俩值的时候,文件名为'',位置为4
释放锁的命令, UNLOCK TABLES;
最后一步是涉及在从库配置刚刚日志位置信息和主库信息。分两种情况,一种是新搭建的集群,另一种是主库本来有数据的情况。
我是刚搭建的环境,先用第一种。不同版本的mysql有两种方式,从8.0.23版本开始使用下面的语句
CHANGE REPLICATION SOURCE TO SOURCE_HOST='10.1.11.142', SOURCE_USER='repl', SOURCE_PASSWORD='123456', SOURCE_LOG_FILE='binlog.000001', SOURCE_LOG_POS=1012;
使用START REPLICA 启动同步
查看从库状态: show slave status\G
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
这两个状态为yes基本就没啥问题了
第二种情况,需要手动先把已有的数据从主库同步到从库中,其他一致。官方推荐使用mysqldump,特别是使用innodb引擎的时候。这种模式需要保持表锁不释放,不能退出session。
mysqldump 添加--master-data参数会包含CHANGE REPLICATION SOURCE 语句。然后导入到从库中。文档说有mysql插件可以方便做到数据迁移和从库配置。
又大概看了一些replication实现的文档,主实例有一个dump线程, SHOW PROCESSLIST里为Binlog Dump。从库两个线程,一个线程接受主库的dump线程的数据,写到单独日志文件,上边状态的Slave_IO_running为这个线程状态。一个线程应用前一个线程的relay日志的线程。多从的情况,主库会为每个从库配置一个dump线程。
复制的数据格式,有三种模式,一种基于语句的( statement-based replication),这种的在特定语句引擎会造成数据不一致。默认是基于行数据的( row-based logging),这种好像是复制更改内容的。还有一种是混合模式,是前两种的结合。
Read more...
Archive for 数据库
mysql数据库client连接配置
又换ubuntu环境开发了,没找到好用的mysql客户端。用了几天mysql workbench,发现用不了,太难用了。准备还是用命令行来解决。
新建-:> vim ~/.my.cnf
-:> cat ~/.my.cnf
[clienttest_icloud]
host=10.144.12.36
port=3306
user=icloud
password=_icloud
database=icloud
.bashrc里边配置:
alias db_test_icloud="mysql --defaults-group-suffix=test_icloud"
然后就可以直接执行db_test_icloud 来链接数据库了。
Read more...
ubuntu12.04+sqlalchemy+pymssql连接mssql server错误的解决
开始提示,
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/dialects/mssql/pymssql.py", line 72, in _get_server_version_info
r"Microsoft SQL Server.*? - (\d+).(\d+).(\d+).(\d+)", vers)
File "/usr/lib/python2.7/re.py", line 137, in match
return _compile(pattern, flags).match(string)
TypeError: expected string or buffer
然后我打印了vers,发现为None,然后有修改连接字符串,发现不是连接的错误。
然后使用~$ sqsh -U sa -P 123456 -S 192.168.1.21,
1> select @@version
2> go
正确的打印了版本信息,这也不可能是我sqlserver的问题了。
为什么就会为None了呢,shell下直接用pymssql 执行select语句也都返回None。
这期间各种搜索。。各种啊,,没有找到有用的信息,啥都有。
然后 搜索 pymssql no data 发现google都有好多关键字提示。。。然后搜到了问题。
http://stackoverflow.com/questions/7250464/python-and-pymssql
https://bugs.launchpad.net/ubuntu/+source/pymssql/+bug/918896
Read more...
$ apt-get remove python-pymssql
$ apt-get install freetds-dev
$ pip install Cython
$ pip install pymssql
就好了,我之前好像也是用apt-get安装的 因为我看编译需要依赖库,就没有安装,
直接apt-get了。fretds我是安装了的,Cython之前没有安装。不知道与Cython有没关系。
今天部署的时候发现好像是版本的问题,用1.0.2有这个问题,去下载dev 30130403没问题。。。
php跨库复制备份表
需要定时把一些数据表备份,并做数据统计。
Read more...
$dates=date('Ymd',time());
//player表的备份
$newtable = "PlayerLog" . $dates;
$sql = "CREATE TABLE ".$newtable." LIKE game_qd.Player";
$linelist = $logdb->exec($sql);
print_r($linelist);
echo "\n\r\n";
$sql2 = "INSERT INTO ".$newtable." SELECT * FROM game_qd.Player";
$linelist = $logdb->exec($sql2);
print_r($linelist);
echo "\n\r\n player done";
,主要的代码就两行。
还学会了left join的用法,当时没想到,是解决了判断一个备份表里有,另一个备份表里没有是计算差值时的问题。
$sql7 = "select a.PlayerID,a.Score,(a.Score-IFNULL(b.Score , 0)) as Scorecha from ".$formtable." as a left join ".$endtable." as b on a.PlayerID=b.PlayerID order BY Scorecha desc,Score desc limit ".$limitnum;
.
PHP5 PDO使用
在wamp下的开发环境,查找资料有两种方法。使用query,使用prepare。看的代码是第二种,网上说第二种效率高,并且安全。
总结使用方法:
Read more...
$sth = $dbh->prepare('update db set zh_CN= :str where SN=:SN');
$sth->bindParam(':str',$str,PDO::PARAM_STR,12);
$sth->bindParam(':SN',$SN);
$sth->execute();
$sth->lastInsertId();
$sth->closeCursor();
源代码使用bindValue(),lastInsertId()返回id。
mysql图形化界面工具
当需要修改数据库表名字的时候,发现命令超长超麻烦,就想找一个可以界面显示的工具。以前接触phpmyadmin,那个需要php环境,但被我卸载了,又到网上搜索,随便找了一个,名字mysql-gui-tools-5.0-r17-win32.zip。具体叫什么我也不清楚,下载地址:http://dev.mysql.com/downloads/gui-tools/5.0.html
使用后发现很好操作,功能还没有都熟悉,感觉挺强大的。
安装目录下有个MySQLAdministrator.exe,打开后填写host,username,password进入。我只使用了导入导出功能、表的名字修改,字段的添加删除,名字修改。
Read more...
bae上添加django应用数据库配置
配置文件settings.py:
Read more...
if 'SERVER_SOFTWARE' in os.environ:
from bae.core import const
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'XXX',
'USER': const.MYSQL_USER,
'PASSWORD': const.MYSQL_PASS,
'HOST': const.MYSQL_HOST,
'PORT': const.MYSQL_PORT,
}
}
else:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'baidu',
'USER': 'root',
'PASSWORD': '',
'HOST': 'localhost',
'PORT': '3306',
}
}
这里是django应用数据库的配置,具体可以参考官网:http://developer.baidu.com/wiki/index.php?title=%E5%B8%AE%E5%8A%A9%E6%96%87%E6%A1%A3%E9%A6%96%E9%A1%B5/%E4%BA%91%E7%8E%AF%E5%A2%83/WEB%E5%BC%80%E5%8F%91%E6%A1%86%E6%9E%B6
数据库需要先在本地导出来,然后用官网提供的phpmyadmin导入到bae数据库中。这里我只用到session表,直接执行sql语句简历一个django_session表就搞定了。
修改mysql 字符编码的时候遇到一个错误
World-writable config file '/etc/mysql/my.cnf' is ignored
在修改mysql 字符编码的时候,修改了文件的权限为777,然后就出现这个问题。解决方法是把文件权限再设置回来就搞定了
sudochmod 644 my.cnf
不在root下操作真的很麻烦,很多时候忘记用sudo命令。唉~
Read more...
mysql数据库命令大全
每次都要重新搜索,所以这次直接copy过来了,以后就不用找了.
一、连接MYSQL。
格式: mysql -h主机地址 -u用户名 -p用户密码
1、连接到本机上的MYSQL。
首先打开DOS窗口,然后进入目录mysql\bin,再键入命令mysql -u root -p,回车后提示你输密码.注意用户名前可以有空格也可以没有空格,但是密码前必须没有空格,否则让你重新输入密码.
如果刚安装好MYSQL,超级用户root是没有密码的,故直接回车即可进入到MYSQL中了,MYSQL的提示符是: mysql>
2、连接到远程主机上的MYSQL。假设远程主机的IP为:110.110.110.110,用户名为root,密码为abcd123。则键入以下命令:
mysql -h110.110.110.110 -u root -p 123;(注:u与root之间可以不用加空格,其它也一样)
3、退出MYSQL命令: exit (回车)
二、修改密码。
格式:mysqladmin -u用户名 -p旧密码 password 新密码
1、给root加个密码ab12。首先在DOS下进入目录mysql\bin,然后键入以下命令
mysqladmin -u root -password ab12
注:因为开始时root没有密码,所以-p旧密码一项就可以省略了。
2、再将root的密码改为djg345。
mysqladmin -u root -p ab12 password djg345
三、增加新用户。
(注意:和上面不同,下面的因为是MYSQL环境中的命令,所以后面都带一个分号作为命令结束符)
格式:grant select on 数据库.* to 用户名@登录主机 identified by “密码”
1、增加一个用户test1密码为abc,让他可以在任何主机上登录,并对所有数据库有查询、插入、修改、删除的权限。首先用root用户连入MYSQL,然后键入以下命令:
grant select,insert,update,delete on *.* to [email=test1@”%]test1@”%[/email]” Identified by “abc”;
但增加的用户是十分危险的,你想如某个人知道test1的密码,那么他就可以在internet上的任何一台电脑上登录你的mysql数据库并对你的数据可以为所欲为了,解决办法见2。
2、增加一个用户test2密码为abc,让他只可以在localhost上登录,并可以对数据库mydb进行查询、插入、修改、删除的操作(localhost指本地主机,即MYSQL数据库所在的那台主机),
这样用户即使用知道test2的密码,他也无法从internet上直接访问数据库,只能通过MYSQL主机上的web页来访问了。
grant select,insert,update,delete on mydb.* to [email=test2@localhost]test2@localhost[/email] identified by “abc”;
如果你不想test2有密码,可以再打一个命令将密码消掉。
grant select,insert,update,delete on mydb.* to [email=test2@localhost]test2@localhost[/email] identified by “”;
下篇我是MYSQL中有关数据库方面的操作。注意:你必须首先登录到MYSQL中,以下操作都是在MYSQL的提示符下进行的,而且每个命令以分号结束。
一、操作技巧
1、如果你打命令时,回车后发现忘记加分号,你无须重打一遍命令,只要打个分号回车就可以了。
也就是说你可以把一个完整的命令分成几行来打,完后用分号作结束标志就OK。
2、你可以使用光标上下键调出以前的命令。
二、显示命令
1、显示当前数据库服务器中的数据库列表:
mysql> SHOW DATABASES;
注意:mysql库里面有MYSQL的系统信息,我们改密码和新增用户,实际上就是用这个库进行操作。
2、显示数据库中的数据表:
mysql> USE 库名;
mysql> SHOW TABLES;
3、显示数据表的结构:
mysql> DESCRIBE 表名;
4、建立数据库:
mysql> CREATE DATABASE 库名;
5、建立数据表:
mysql> USE 库名;
mysql> CREATE TABLE 表名 (字段名 VARCHAR(20), 字段名 CHAR(1));
6、删除数据库:
mysql> DROP DATABASE 库名;
7、删除数据表:
mysql> DROP TABLE 表名;
8、将表中记录清空:
mysql> DELETE FROM 表名;
9、显示表中的记录:
mysql> SELECT * FROM 表名;
10、往表中插入记录:
mysql> INSERT INTO 表名 VALUES (”hyq”,”M”);
11、更新表中数据:
mysql-> UPDATE 表名 SET 字段名1=’a',字段名2=’b’ WHERE 字段名3=’c';
12、用文本方式将数据装入数据表中:
mysql> LOAD DATA LOCAL INFILE “D:/mysql.txt” INTO TABLE 表名;
13、导入.sql文件命令:
mysql> USE 数据库名;
mysql> SOURCE d:/mysql.sql;
14、命令行修改root密码:
mysql> UPDATE mysql.user SET password=PASSWORD(’新密码’) WHERE User=’root’;
mysql> FLUSH PRIVILEGES;
15、显示use的数据库名:
mysql> SELECT DATABASE();
16、显示当前的user:
mysql> SELECT USER();
三、一个建库和建表以及插入数据的实例
drop database if exists school; //如果存在SCHOOL则删除
create database school; //建立库SCHOOL
use school; //打开库SCHOOL
create table teacher //建立表TEACHER
(
id int(3) auto_increment not null primary key,
name char(10) not null,
address varchar(50) default ‘深圳’,
year date
); //建表结束
//以下为插入字段
insert into teacher values(”,’allen’,'大连一中’,'1976-10-10′);
insert into teacher values(”,’jack’,'大连二中’,'1975-12-23′);
如果你在mysql提示符键入上面的命令也可以,但不方便调试。
(1)你可以将以上命令原样写入一个文本文件中,假设为school.sql,然后复制到c:\\下,并在DOS状态进入目录[url=file://\\mysql\\bin]\\mysql\\bin[/url],然后键入以下命令:
mysql -uroot -p密码 < c:\\school.sql
如果成功,空出一行无任何显示;如有错误,会有提示。(以上命令已经调试,你只要将//的注释去掉即可使用)。
(2)或者进入命令行后使用 mysql> source c:\\school.sql; 也可以将school.sql文件导入数据库中。
四、将文本数据转到数据库中
1、文本数据应符合的格式:字段数据之间用tab键隔开,null值用[url=file://\\n]\\n[/url]来代替.例:
3 rose 大连二中 1976-10-10
4 mike 大连一中 1975-12-23
假设你把这两组数据存为school.txt文件,放在c盘根目录下。
2、数据传入命令 load data local infile “c:\\school.txt” into table 表名;
注意:你最好将文件复制到[url=file://\\mysql\\bin]\\mysql\\bin[/url]目录下,并且要先用use命令打表所在的库。
五、备份数据库:(命令在DOS的[url=file://\\mysql\\bin]\\mysql\\bin[/url]目录下执行)
1.导出整个数据库
导出文件默认是存在mysql\bin目录下
mysqldump -u 用户名 -p 数据库名 > 导出的文件名
mysqldump -u user_name -p123456 database_name > outfile_name.sql
2.导出一个表
mysqldump -u 用户名 -p 数据库名 表名> 导出的文件名
mysqldump -u user_name -p database_name table_name > outfile_name.sql
3.导出一个数据库结构
mysqldump -u user_name -p -d –add-drop-table database_name > outfile_name.sql
-d 没有数据 –add-drop-table 在每个create语句之前增加一个drop table
4.带语言参数导出
mysqldump -uroot -p –default-character-set=latin1 –set-charset=gbk –skip-opt database_name > outfile_name.sql
Read more...
Ubuntu下mysql数据库的编码修改
上传到Ubuntu服务器后错误百出,报错Data truncated for column 'title' at row 1,
Google搜索发现是编码不统一的问题。
查看数据库编码的方法:
show variables like 'character%';
修改/etc/mysql/my.cnf文件
找到客户端配置[client] 在下面添加
default-character-set=utf8 默认字符集为utf8
在找到[mysqld] 添加
default-character-set=utf8 默认字符集为utf8
init_connect='SET NAMES utf8' (设定连接mysql数据库时使用utf8编码,以让mysql数据库为utf8运行)
重启mysql服务:service mysql restart
再查看发现成为utf8了。
drop掉原来建立的数据库,新建一个utf8的:
CREATE DATABASE ms_db CHARACTER SET utf8 ;
前台测试,不再报错。
Read more...