在配置主从的时候出现1032错误, 远程访问登录不上,需要配置主的授权,和修改my.ini 配置,(具体查看 2)
1.配置主 my.cnf centos 目录(/etc/my.ini),错误日志(/var/log/mysqld.log),存储路径(/var/lib/mysql))
server-id = 35 #服务器id (主从必须不一样)
log-bin = D:/pro/phpStudy/MySQL/mysql-bin #打开日志(主机需要打开),这个mysql-bin也可以自定义,这里也可以加上路径,如:/home/www/mysql_bin_log/mysql-bin
binlog-do-db = demo # 要给从机同步的库
2.
如果被拒绝 需要 my.ini (设置放其他用户可以访问)
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
skip-name-resolve
skip-grant-tables
3. 主服务器授权用户
grant replication slave on *.* to 'root'@'192.168.174.131' identified by 'root';
grant all privileges on *.* to 'root'@'192.168.174.131' identified by 'root'; 所有的
flush privileges; 需要刷新下
4. 从服务器配置
mysql -h192.168.0.3 -udemo2 -p123456 测试远程连接
从数据库配置
server-id = 131 #服务器id (主从必须不一样)
#作为从机的配置
master-host = 192.168.0.35 # 目标主机IP
master-user = root # 目标主机用户名
master-password = root # 目标主机密码
master-port = 3306 # 目标主机端口
master-connect-retry = 60 # 链接重连间隔(单位s)
replicate-ignore-db = mysql # 不从主机同步的数据库(多个写多行)
replicate-do-db = demo # 要从主机同步的库(多个写多行)
#log-slave-update # 启用从机服务器上的slave日志功能,使这台计算机可以用来构成一个镜像链(A->B->C)
slave-skip-errors # 跳过错误,从机一般应该配置该项
5.查看主数据库的bin-log状态
show master status\G; 获取前两个字段值 (主查询)
change master to master_host='192.168.0.35', master_user='root' ,master_password='root', master_log_file='mysql-bin.000008' ,master_log_pos=1986;
show slave status\G; 查看状态 (从查询)
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
只要在这个现实yes就正常了
----------------数据异常--------------------
主从赋值时候,出现数据丢失
数据丢失较多的时候可以 重做
mysqldump -h192.168.0.35 -uroot -proot demo users > mysql2.bar.sql
dmeo:为数据库名称
users:为表名
mysqldump -u root -p --databases test mysql > D:\backup.sql 备份多个数据库
mysqldump -u username -p -all-databases > BackupName.sql 备份所有数据库
mysql -u root -p < C:\backup.sql 数据还原
source xxxx.sql 导入数据
mysqlhotcopy 热备份 比mysqldump速度快 备份需要lock table
mysql操作 锁表
//执行SQL语句 锁掉stat_num表
$sql = "LOCK TABLES stat_num WRITE"; //表的WRITE锁定,阻塞其他所有mysql查询进程
$DatabaseHandler->exeCute($sql);
//执行更新或写入操作
$sql = "UPDATE stat_num SET `correct_num`=`correct_num`+1 WHERE stat_date='{$cur_date}'";
$DatabaseHandler->exeCute($sql);
//当前请求的所有写操作做完后,执行解锁sql语句
$sql = "UNLOCK TABLES";
$DatabaseHandler->exeCute($sql);
备份数据 锁表
FLUSH TABLES WITH READ LOCK 整个数据库表都锁住
LOCK TABLES tbl_name READ; 只锁住指定的表, 不影响其他的表
unlock tables;
P.S. MYSQL的read lock和wirte lock
read-lock: 允许其他并发的读请求,但阻塞写请求,即可以同时读,但不允许任何写。也叫共享锁
write-lock: 不允许其他并发的读和写请求,是排他的(exclusive)。也叫独占锁