網(wǎng)上有很多關(guān)于pos機錯誤null,Mysql最容易犯的錯誤TOP10的知識,也有很多人為大家解答關(guān)于pos機錯誤null的問(wèn)題,今天pos機之家(m.xjcwpx.cn)為大家整理了關(guān)于這方面的知識,讓我們一起來(lái)看下吧!
本文目錄一覽:
pos機錯誤null
今天就給大家列舉 MySQL 數據庫中,最經(jīng)典的十大錯誤案例,并附有處理問(wèn)題的解決思路和方法,希望能給剛入行,或數據庫愛(ài)好者一些幫助。
今后再遇到任何報錯,我們都可以很淡定地去處理。學(xué)習任何一門(mén)技術(shù)的同時(shí),其實(shí)就是自我修煉的過(guò)程。沉下心,嘗試去擁抱數據的世界!
Top 1:Too many connections(連接數過(guò)多,導致連接不上數據庫,業(yè)務(wù)無(wú)法正常進(jìn)行)
問(wèn)題還原
MySQL> show variables like \'%max_connection%\';| Variable_name | Value |mysql> set global max_connections=1;Query OK, 0 rows affected (0.00 sec)max_connections | 151 |[root@node4 ~]# mysql -uzs -p123456 -h 192.168.56.132ERROR 1040 (00000): Too many connections
解決問(wèn)題的思路:
1、首先先要考慮在我們 MySQL 數據庫參數文件里面,對應的 max_connections 這個(gè)參數值是不是設置的太小了,導致客戶(hù)端連接數超過(guò)了數據庫所承受的最大值。
● 該值默認大小是151,我們可以根據實(shí)際情況進(jìn)行調整。
● 對應解決辦法:set global max_connections=500
但這樣調整會(huì )有隱患,因為我們無(wú)法確認數據庫是否可以承擔這么大的連接壓力,就好比原來(lái)一個(gè)人只能吃一個(gè)饅頭,但現在卻非要讓他吃 10 個(gè),他肯定接受不了。反應到服務(wù)器上面,就有可能會(huì )出現宕機的可能。
所以這又反應出了,我們在新上線(xiàn)一個(gè)業(yè)務(wù)系統的時(shí)候,要做好壓力測試。保證后期對數據庫進(jìn)行優(yōu)化調整。
2、其次可以限制 Innodb 的并發(fā)處理數量,如果 innodb_thread_concurrency = 0(這種代表不受限制) 可以先改成 16 或是 64 看服務(wù)器壓力。如果非常大,可以先改的小一點(diǎn)讓服務(wù)器的壓力下來(lái)之后,然后再慢慢增大,根據自己的業(yè)務(wù)而定。個(gè)人建議可以先調整為 16 即可。
MySQL 隨著(zhù)連接數的增加性能是會(huì )下降的,可以讓開(kāi)發(fā)配合設置 thread pool,連接復用。在MySQL商業(yè)版中加入了thread pool這項功能,另外對于有的監控程序會(huì )讀取 information_schema 下面的表,可以考慮關(guān)閉下面的參數
innodb_stats_on_metadata=0set global innodb_stats_on_metadata=0
Top 2:(主從復制報錯類(lèi)型)
Last_SQL_Errno: 1062 (從庫與主庫數據沖突)
Last_Errno: 1062Last_Error: Could not execute Write_rows event on table test.t;Duplicate entry \'4\' for key \'PRIMARY\',the event\'s master log Mysql-bin.000014, end_log_pos 1505Error_code: 1062; handler error HA_ERR_FOUND_DUPP_KEY;
針對這個(gè)報錯,我們首先要考慮是不是在從庫中誤操作導致的。結果發(fā)現,我們在從庫中進(jìn)行了一條針對有主鍵表的 sql 語(yǔ)句的插入,導致主庫再插入相同 sql 的時(shí)候,主從狀態(tài)出現異常。發(fā)生主鍵沖突的報錯。
解決方法:
在確保主從數據一致性的前提下,可以在從庫進(jìn)行錯誤跳過(guò)。一般使用 percona-toolkit 中的 pt-slave-restart 進(jìn)行。
在從庫完成如下操作
[root@zs bin]# ./pt-slave-restart -uroot -proot1232017-07-20T14:05:30 p=...,u=root node4-relay-bin.000002 1506 1062之后最好在從庫中開(kāi)啟 read_only 參數,禁止在從庫進(jìn)行寫(xiě)入操作
Last_IO_Errno: 1593(server-id沖突)
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 workdoes not always make sense; please check the manual before using it)(or the --replicate-same-server-id option must be used on slave but this
#這個(gè)報錯出現之后,就看一目了然看到兩臺機器的 server-id 是一樣的。
在搭建主從復制的過(guò)程中,我們要確保兩臺機器的 server-id 是唯一的。這里再強調一下 server-id 的命名規則(服務(wù)器 ip 地址的最后一位+本 MySQL 服務(wù)的端口號)
解決方法:
在主從兩臺機器上設置不同的 server-id。
Last_SQL_Errno: 1032(從庫少數據,主庫更新的時(shí)候,從庫報錯)
Last_SQL_Error:Could not execute Update_rows event on table test.t; Can\'t find recordin \'t\', Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND; theevent\'s master log mysql-bin.000014, end_log_pos 1708
解決辦法:
根據報錯信息,我們可以獲取到報錯日志和position號,然后就能找到主庫執行的哪條sql,導致的主從報錯。
在主庫執行:
/usr/local/mysql/bin/mysqlbinlog --no-defaults -v -v --base64-output=decode-rows /data/mysql/mysql-bin.000014 |grep -A 10 1708 > 1.logcat 1.log #170720 14:20:15 server id 3 end_log_pos 1708 CRC32 0x97b6bdec Update_rows: table id 113 flags: STMT_END_F### @2=\'dd\' /* VARSTRING(60) meta=60 nullable=1 is_null=0 */### UPDATE `test`.`t` ### WHERE ### @1=4 /* INT meta=0 nullable=0 is_null=0 */ ### SET ### @1=4 /* INT meta=0 nullable=0 is_null=0 */#170720 14:20:15 server id 3 end_log_pos 1739 CRC32 0xecaf1922 Xid = 654### @2=\'ddd\' /* VARSTRING(60) meta=60 nullable=1 is_null=0 */ # at 1708 COMMIT/*!*/; DELIMITER ; # End of log file ROLLBACK /* added by mysqlbinlog */;/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
獲取到 sql 語(yǔ)句之后,就可以在從庫反向執行 sql 語(yǔ)句。把從庫缺少的 sql 語(yǔ)句補全,解決報錯信息。
在從庫依次執行:
mysql> insert into t (b) values (\'ddd\');Query OK, 1 row affected (0.01 sec)Query OK, 0 rows affected (0.00 sec)mysql> stop slave; mysql> exit Bye2017-07-20T14:31:37 p=...,u=root node4-relay-bin.000005 283 1032[root@node4 bin]# ./pt-slave-restart -uroot -proot123
Top 3:MySQL 安裝過(guò)程中的報錯
[root@zs data]# /usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf &[1] 3758[root@zs data]# 170720 14:41:24 mysqld_safe Logging to \'/data/mysql/error.log\'.170720 14:41:24 mysqld_safe Starting mysqld daemon with databases from /data/mysql17072014:41:25 mysqld_safe mysqld from pid file /data/mysql/node4.pid ended 170720 14:41:24 mysqld_safe Starting mysqld daemon with databases from /data/mysql2017-07-20(see documentation for more details)./usr/local/mysql/bin/mysqld:14:41:25 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option File \'/data/mysql/mysql-bin.index\' not found (Errcode: 13 - Permission denied)2017-07-20 14:41:25 4388 [ERROR] Aborting
解決思路:
遇到這樣的報錯信息,我們要學(xué)會(huì )時(shí)時(shí)去關(guān)注錯誤日志 error log 里面的內容??匆?jiàn)了關(guān)鍵的報錯點(diǎn)Permission denied。證明當前 MySQL 數據庫的數據目錄沒(méi)有權限。
解決方法:
[root@zs data]# chown mysql:mysql -R mysql[root@zs data]# /usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf &[1] 4402[root@zs data]# 170720 14:45:56 mysqld_safe Logging to \'/data/mysql/error.log\'.170720 14:45:56 mysqld_safe Starting mysqld daemon with databases from /data/mysql#啟動(dòng)成功。
如何避免這類(lèi)問(wèn)題,個(gè)人建議在安裝MySQL初始化的時(shí)候,一定加上—user=mysql,這樣就可以避免權限問(wèn)題。
./mysql_install_db --basedir=/usr/local/mysql/ --datadir=/data/mysql/ --defaults-file=/etc/my.cnf --user=mysql
Top 4:數據庫密碼忘記的問(wèn)題
[root@zs ~]# mysql -uroot -pEnter password:ERROR 1045 (28000): Access denied for user \'root\'@\'localhost\' (using password: YES)[root@zs ~]# mysql -uroot -p Enter password:
#我們有可能剛剛接手別人的 MySQL 數據庫,而且沒(méi)有完善的交接文檔。root 密碼可以丟失或者忘記了。
ERROR 1045 (28000): Access denied for user \'root\'@\'localhost\' (using password: YES)
解決思路:
目前是進(jìn)入不了數據庫的情況,所以我們要考慮是不是可以跳過(guò)權限。因為在數據庫中,mysql數據庫中user表記錄著(zhù)我們用戶(hù)的信息。
解決方法:
啟動(dòng) MySQL 數據庫的過(guò)程中,可以這樣執行:
/usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf --skip-grant-tables &
這樣啟動(dòng),就可以不用輸入密碼,直接進(jìn)入 mysql 數據庫了。然后在修改你自己想要改的root密碼即可。
update mysql.user set password=password(\'root123\') where user=\'root\';
Top 5:truncate 刪除數據,導致自動(dòng)清空自增ID,前端返回報錯 not found。
這個(gè)問(wèn)題的出現,就要考慮下truncate 和 delete 的區別了。
看下實(shí)驗演練:
#首先先創(chuàng )建一張表;CREATE TABLE `t` (`a` int(11) NOT NULL AUTO_INCREMENT,`b` varchar(20) DEFAULT NULL,) ENGINE=InnoDB AUTO_INCREMENT=300 DEFAULT CHARSET=utf8PRIMARY KEY (`a`), KEY `b` (`b`) #插入三條數據:Query OK, 1 row affected (0.00 sec)mysql> insert into t (b) values (\'aa\'); mysql> insert into t (b) values (\'bb\');Query OK, 1 row affected (0.00 sec)Query OK, 1 row affected (0.00 sec) mysql> insert into t (b) values (\'cc\'); mysql> select * from t; +-----+------+#先用 delete 進(jìn)行刪除全表信息,再插入新值。| a | b | +-----+------+ | 300 | aa | | 301 | bb | | 302 | cc | +-----+------+3 rows in set (0.00 sec)
結果發(fā)現truncate把自增初始值重置了,自增屬性從1開(kāi)始記錄了。當前端用主鍵id進(jìn)行查詢(xún)時(shí),就會(huì )報沒(méi)有這條數據的錯誤。
個(gè)人建議不要使用truncate對表進(jìn)行刪除操作,雖然可以回收表空間,但是會(huì )涉及自增屬性問(wèn)題。這些坑,我們不要輕易鉆進(jìn)去。
Top 6:阿里云 MySQL 的配置文件中,需要注意一個(gè)參數設置就是:
lower_case_table_names = 0;默認情況
lower_case_table_names = 1;是不區分大小寫(xiě) . 如果報你小寫(xiě)的表名找不到, 那你就把遠端數據庫的表名改成小寫(xiě) , 反之亦然 . 注意 Mybatis 的 Mapper 文件的所有表名也要相應修改
Top 7:數據庫總會(huì )出現中文亂碼的情況
解決思路:
對于中文亂碼的情況,記住老師告訴你的三個(gè)統一就可以。還要知道在目前的mysql數據庫中字符集編碼都是默認的UTF8
處理辦法:
1、數據終端,也就是我們連接數據庫的工具設置為 utf8
2、操作系統層面;可以通過(guò) cat /etc/sysconfig/i18n 查看;也要設置為 utf8
3、數據庫層面;在參數文件中的 mysqld 下,加入 character-set-server=utf8。
Emoji 表情符號錄入 mysql 數據庫中報錯。
Caused by: java.sql.SQLException: Incorrect string value: \'\\xF0\\x9F\\x98\\x97\\xF0\\x9F...\' for column \'CONTENT\' at row 1at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1074)at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4028)at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4096) at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2490)at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2155)at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2651) at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2734)at com.mysql.jdbc.PreparedStatement.execute(PreparedStatement.java:1379)
解決思路:針對表情插入的問(wèn)題,一定還是字符集的問(wèn)題。
處理方法:我們可以直接在參數文件中,加入
vim /etc/my.cnf[mysqld]init-connect=\'SET NAMES utf8mb4\'character-set-server=utf8mb4
注:utf8mb4 是 utf8 的超集。
Top 8:使用 binlog_format=statement 這種格式,跨庫操作,導致從庫丟失數據,用戶(hù)訪(fǎng)問(wèn)導致出現錯誤數據信息。
#當前數據庫二進(jìn)制日志的格式為:binlog_format=statement
在主庫設置binlog-do-db=mydb1(只同步mydb1這一個(gè)庫)
insert into mydb1.t1 values (\'bb\');這條語(yǔ)句不會(huì )同步到從庫。
在主庫執行use mydb2; 但是這樣操作就可以; use mydb1;
#在生產(chǎn)環(huán)境中建議使用binlog的格式為row,而且慎用binlog-do-db參數。
insert into mydb1.t1 values (\'bb\');因為這是在同一個(gè)庫中完成的操作。
Top 9:MySQL 數據庫連接超時(shí)的報錯
org.hibernate.util.JDBCExceptionReporter - SQL Error:0, SQLState: 08S01org.hibernate.util.JDBCExceptionReporter - The last packet successfully received from the server was43200 milliseconds ago.The last packet sent successfully to the server was 43200 milliseconds ago, which is longer than the server configured value of \'wait_timeout\'. You should consider either expiring and/or testing connection validity before use in your application, increasing the server configured values for client timeouts, or using the Connector/J connection \'autoReconnect=true\' to avoid this problem.org.hibernate.event.def.AbstractFlushingEventListener - Could not synchronize database state with session org.hibernate.exception.JDBCConnectionException: Could not execute JDBC batch update com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Connection.close() has already been called. Invalid operation in this state. org.hibernate.util.JDBCExceptionReporter - SQL Error:0, SQLState: 08003#大多數做 DBA 的同學(xué),可能都會(huì )被開(kāi)發(fā)人員告知,你們的數據庫報了這個(gè)錯誤了。趕緊看看是哪里的問(wèn)題。org.hibernate.util.JDBCExceptionReporter - No operations allowed after connection closed. Connection was implicitly closed due to underlying exception/error:** BEGIN NESTED EXCEPTION **
這個(gè)問(wèn)題是由兩個(gè)參數影響的,wait_timeout 和 interactive_timeout。數據默認的配置時(shí)間是28800(8小時(shí))意味著(zhù),超過(guò)這個(gè)時(shí)間之后,MySQL 數據庫為了節省資源,就會(huì )在數據庫端斷開(kāi)這個(gè)連接,Mysql服務(wù)器端將其斷開(kāi)了,但是我們的程序再次使用這個(gè)連接時(shí)沒(méi)有做任何判斷,所以就掛了。
解決思路:
先要了解這兩個(gè)參數的特性;這兩個(gè)參數必須同時(shí)設置,而且必須要保證值一致才可以。
我們可以適當加大這個(gè)值,8小時(shí)太長(cháng)了,不適用于生產(chǎn)環(huán)境。因為一個(gè)連接長(cháng)時(shí)間不工作,還占用我們的連接數,會(huì )消耗我們的系統資源。
解決方法:
可以適當在程序中做判斷;強烈建議在操作結束時(shí)更改應用程序邏輯以正確關(guān)閉連接;然后設置一個(gè)比較合理的timeout的值(根據業(yè)務(wù)情況來(lái)判斷)
Top 10 :can’t open file (errno:24)
有的時(shí)候,數據庫跑得好好的,突然報不能打開(kāi)數據庫文件的錯誤了。
解決思路:
首先我們要先查看數據庫的error log。然后判斷是表?yè)p壞,還是權限問(wèn)題。還有可能磁盤(pán)空間不足導致的不能正常訪(fǎng)問(wèn)表;操作系統的限制也要關(guān)注下;用 perror 工具查看具體錯誤!
linux:/usr/local/mysql/bin # ./perror 24OS error code 24: Too many open files
超出最大打開(kāi)文件數限制!ulimit -n查看系統的最大打開(kāi)文件數是65535,不可能超出!那必然是數據庫的最大打開(kāi)文件數超出限制!
在 MySQL 里查看最大打開(kāi)文件數限制命令:show variables like ‘open_files_limit’;
發(fā)現該數值過(guò)小,改為2048,重啟 MySQL,應用正常
處理方法:
repair table ;chown mysql權限#清理磁盤(pán)中的垃圾數據
今后還會(huì )繼續總結 MySQL 中的各種報錯處理思路與方法,希望跟各位老鐵們,同學(xué)們一起努力。多溝通多交流!
私信我:“資料”,可免費領(lǐng)取更多學(xué)習資料pos機錯誤碼r0什么意思?
POS機錯誤碼R0,出xiàn這個(gè)故障碼的意思就是金額沒(méi)有達到十塊,卡金額必須大于10塊,沒(méi)rèn證的磁條卡不能超過(guò)2千。
以上就是關(guān)于pos機錯誤null,Mysql最容易犯的錯誤TOP10的知識,后面我們會(huì )繼續為大家整理關(guān)于pos機錯誤null的知識,希望能夠幫助到大家!
