MySQL与Oracle

今天给各位分享oracle转mysql字符长度过长的知识,其中也会对mysql id 不建议过长进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录

  1. mysql数据库cpu飙升800%,如何故障定位及优化
  2. oracle转mysql字符长度过长
  3. 如何使用mysql主从配置

mysql数据库cpu飙升800%,如何故障定位及优化

mysql中CPU占用过高的诊断思路,举个栗子~

mpstat-PALL1,查看cpu使用情况,主要消耗在sys即os系统调用上

perftop,cpu主要消耗在_spin_lock

生成perfreport查看详细情况

CPU主要消耗在mutex争用上,说明有锁热点。

采用pt-pmp跟踪mysqld执行情况,热点主要集中在mem_heap_alloc和mem_heap_free上。

Pstack提供更详细的API调用栈

#00x0000003e0caf80cfin__lll_unlock_wake_private()from/lib64/libc.so.6#10x0000003e0ca7cf6ain_L_unlock_5936()from/lib64/libc.so.6#20x0000003e0ca78bbcin_int_free()from/lib64/libc.so.6#30x000000000097dcb3inmem_area_free(void*,mem_pool_t*)()#40x000000000097d2d2inmem_heap_block_free(mem_block_info_t*,mem_block_info_t*)()#50x00000000009e6474inrow_vers_build_for_consistent_read(unsignedcharconst*,mtr_t*,dict_index_t*,unsignedlong**,read_view_t*,mem_block_info_t**,mem_block_info_t*,unsignedchar**)()#60x00000000009dce75inrow_search_for_mysql(unsignedchar*,unsignedlong,row_prebuilt_t*,unsignedlong,unsignedlong)()#70x0000000000939c95inha_innobase::index_read(unsignedchar*,unsignedcharconst*,unsignedint,ha_rkey_function)()

Innodb在读取数据记录时的API路径为

row_search_for_mysql--》row_vers_build_for_consistent_read--》mem_heap_create_block_func--》mem_area_alloc--》malloc--》_L_unlock_10151--》__lll_unlock_wait_private

row_vers_build_for_consistent_read会陷入一个死循环,跳出条件是该条记录不需要快照读或者已经从undo中找出对应的快照版本,每次循环都会调用mem_heap_alloc/free。

而该表的记录更改很频繁,导致其undohistorylist比较长,搜索快照版本的代价更大,就会频繁的申请和释放堆内存。

Linux原生的内存库函数为ptmalloc,malloc/free调用过多时很容易产生锁热点。

当多条SQL并发执行时,会最终触发os层面的spinlock,导致上述情形。

解决方案

将mysqld的内存库函数替换成tcmalloc,相比ptmalloc,tcmalloc可以更好的支持高并发调用。

修改my.cnf,添加如下参数并重启

[mysqld_safe]malloc-lib=tcmalloc

上周五早上7点执行的操作,到现在超过72小时,期间该实例没有再出现cpu长期飙高的情形。

以下是修改前后cpu使用率对比

oracle转mysql字符长度过长

其实这不是一个固定的数字,varchar的长度是有限制规则的,在MySQL数据库中varchar的限制规则;1、限制规则字段的限制在字段定义的时候有以下规则:

a)存储限制varchar字段是将实际内容单独存储在聚簇索引之外,内容开头用1到2个字节表示实际长度(长度超过255时需要2个字节),因此最大长度不能超过65535。

b)编码长度限制字符类型若为gbk,每个字符最多占2个字节,最大长度不能超过32766;字符类型若为utf8

如何使用mysql主从配置

mysql主从配置

MySQL主从又叫做Replication、AB复制。简单讲就是A和B两台机器做主从后,在A上写数据,另外一台B也会跟着写数据,两者数据实时同步的

MySQL主从是基于binlog的,主上须开启binlog才能进行主从。

主从过程大致有3个步骤

1)主将更改操作记录到binlog里

2)从将主的binlog事件(sql语句)同步到从本机上并记录在relaylog(中继日志)里

3)从根据relaylog里面的sql语句按顺序执行

主上有一个logdump线程,用来和从的I/O线程传递binlog

从上有两个线程,其中I/O线程用来同步主的binlog并生成relaylog,另外一个SQL线程用来把relaylog里面的sql语句落地

这里写图片描述

主从配置-主上操作

安装mysql

修改my.cnf,增加server-id=130和log_bin=aminglinux1

[root@wwlinux701logs]#vim/etc/my.cnf

server-id=130

log_bin=wwlinux701

修改完配置文件后,启动或者重启mysqld服务

[root@wwlinux701logs]#/etc/init.d/mysqldrestart

ShuttingdownMySQL....SUCCESS!

StartingMySQL..............SUCCESS!

[root@wwlinux701logs]#

1

2

3

4

把mysql库备份并恢复成aming库,作为测试数据

mysqldump-uroot-p123456mysql>/tmp/mysql.sql

mysql-uroot-p123456-e“createdatabaseaming”

mysql-uroot-p123456aming</tmp/mysql.sql

[root@wwlinux701logs]#mysqldump-uroot-p123456mysql>/tmp/mysql.sql

Warning:Usingapasswordonthecommandlineinterfacecanbeinsecure.

[root@wwlinux701logs]#mysql-uroot-p123456-e"createdatabaseaming"

Warning:Usingapasswordonthecommandlineinterfacecanbeinsecure.

[root@wwlinux701logs]#mysql-uroot-p123456aming</tmp/mysql.sql

Warning:Usingapasswordonthecommandlineinterfacecanbeinsecure.

[root@wwlinux701logs]#

创建用作同步数据的用户

mysql-uroot-p123456aming

grantreplicationslaveon.to‘repl’@192.168.11.131identifiedby‘123456’;

flushtableswithreadlock;#需要先锁定表

showmasterstatus;

[root@wwlinux701logs]#mysql-uroot-p123456aming

grantreplicationslaveon*.*to'repl'@192.168.11.131identifiedby'123456';

mysql>grantreplicationslaveon*.*to'repl'@192.168.11.131identifiedby'123456';

QueryOK,0rowsaffected(1.00sec)

mysql>

flushtableswithreadlock;#需要先锁定表

mysql>flushtableswithreadlock;

QueryOK,0rowsaffected(0.11sec)

mysql>

wwlinux701.000001|660619#需要记住这两个参数

这里写图片描述

主从配置-从上操作

安装mysql

查看my.cnf,配置server-id=131,从要求和主不一样从上不需要log_bin,因为只有主才需要二进制文件

修改完配置文件后,启动或者重启mysqld服务

scp192.168.11.130:/tmp*.sql/tmp/

把主上aming库同步到从上mysql库除外的其他库都同步一下

可以先创建aming库,然后把主上的/tmp/mysql.sql拷贝到从上,然后导入aming库

mysql-uroot-p123456

stopslave;

changemastertomaster_host=’192.168.11.130’,master_user=’repl’,master_password=’123456’,master_log_file=’wwlinux701.000001’,master_log_pos=660619;

startslave;

showslavestatus\G#用这个命令监测如果是两个yes就是没问题的

这里写图片描述

还要到主上执行unlocktables;

查看主从同步是否正常

从上执行mysql-uroot

showslavestauts\G

看是否有

Slave_IO_Running:Yes

Slave_SQL_Running:Yes

还需关注

Seconds_Behind_Master:0//为主从延迟的时间

Last_IO_Errno:0

Last_IO_Error:

Last_SQL_Errno:0

Last_SQL_Error:

几个配置参数

主服务器上

binlog-do-db=//仅同步指定的库

binlog-ignore-db=//忽略指定库

从服务器上

replicate_do_db=

replicate_ignore_db=

replicate_do_table=

replicate_ignore_table=

replicate_wild_do_table=//如aming.%,支持通配符%

replicate_wild_ignore_table=

测试主从

主上mysql-uroot-p123456aming

selectcount(*)fromdb;

这里写图片描述

truncatetabledb;

到从上mysql-uroot-p123456aming

selectcount(*)fromdb;

这里写图片描述

主上继续droptabledb;

从上查看db表

主上执行

select*fromuserwhereHost=’localhost’;

mysql>deletefromuserwhereHost=’localhost’;

这里写图片描述

从上执行

select*fromuserwhereHost=’localhost’;

这里写图片描述

如果你还想了解更多这方面的信息,记得收藏关注本站。

Oracle MySQL数据快速导入MySQL的方法