mysql的資料庫值問題,資料庫 問題

本文目錄一覽:

關於mysql資料庫裡面數據類型number的問題

MySQL 數據類型細分下來,大概有以下幾類:

數值,典型代表為 tinyint,int,bigint

浮點/定點,典型代表為 float,double,decimal 以及相關的同義詞

字元串,典型代表為 char,varchar

時間日期,典型代表為 date,datetime,time,timestamp

二進位,典型代表為 binary,varbinary

位類型

枚舉類型

集合類型

大對象,比如 text,blob

json 文檔類型

一、數值類型(不是數據類型,別看錯了)如果用來存放整數,根據範圍的不同,選擇不同的類型。

以上是幾個整數選型的例子。整數的應用範圍最廣泛,可以用來存儲數字,也可以用來存儲時間戳,還可以用來存儲其他類型轉換為數字後的編碼,如 IPv4 等。示例 1用 int32 來存放 IPv4 地址,比單純用字元串節省空間。表 x1,欄位 ipaddr,利用函數 inet_aton,檢索的話用函數 inet_ntoa。

查看磁碟空間佔用,t3 佔用最大,t1 佔用最小。所以說如果整數存儲範圍有固定上限,並且未來也沒有必要擴容的話,建議選擇最小的類型,當然了對其他類型也適用。root@ytt-pc:/var/lib/mysql/3305/ytt# ls -sihl總用量 3.0G3541825 861M -rw-r—– 1 mysql mysql 860M 12月 10 11:36 t1.ibd3541820 989M -rw-r—– 1 mysql mysql 988M 12月 10 11:38 t2.ibd3541823 1.2G -rw-r—– 1 mysql mysql 1.2G 12月 10 11:39 t3.ibd

二、浮點數 / 定點數先說 浮點數,float 和 double 都代表浮點數,區別簡單記就是 float 默認占 4 Byte。float(p) 中的 p 代表整數位最小精度。如果 p 24 則直接轉換為 double,占 8 Byte。p 最大值為 53,但最大值存在計算不精確的問題。再說 定點數,包括 decimal 以及同義詞 numeric,定點數的整數位和小數位分別存儲,有效精度最大不能超過 65。所以區別於 float 的在於精確存儲,必須需要精確存儲或者精確計算的最好定義為 decimal 即可。示例 3創建一張表 y1,分別給欄位 f1,f2,f3 不同的類型。mysql-(ytt/3305)-create table y1(f1 float,f2 double,f3 decimal(10,2));Query OK, 0 rows affected (0.03 sec)

三、字元類型字元類型和整形一樣,用途也很廣。用來存儲字元、字元串、MySQL 所有未知的類型。可以簡單說是萬能類型!

char(10) 代表最大支持 10 個字元存儲,varhar(10) 雖然和 char(10) 可存儲的字元數一樣多,不同的是 varchar 類型存儲的是實際大小,char 存儲的理論固定大小。具體的位元組數和字符集相關。示例 4例如下面表 t4 ,兩個欄位 c1,c2,分別為 char 和 varchar。mysql-(ytt/3305)-create table t4 (c1 char(20),c2 varchar(20));Query OK, 0 rows affected (0.02 sec)

所以在 char 和 varchar 選型上,要注意看是否合適的取值範圍。比如固定長度的值,肯定要選擇 char;不確定的值,則選擇 varchar。

四、日期類型日期類型包含了 date,time,datetime,timestamp,以及 year。year 占 1 Byte,date 占 3 Byte。 

time,timestamp,datetime 在不包含小數位時分別佔用 3 Byte,4 Byte,8 Byte;小數位部分另外計算磁碟佔用,見下面表格。

請點擊輸入圖片描述

請點擊輸入圖片描述

注意:timestamp 代表的時間戳是一個 int32 存儲的整數,取值範圍為 ‘1970-01-01 00:00:01.000000’ 到 ‘2038-01-19 03:14:07.999999’;datetime 取值範圍為 ‘1000-01-01 00:00:00.000000’ 到 ‘9999-12-31 23:59:59.999999’。

綜上所述,日期這塊類型的選擇遵循以下原則:

1. 如果時間有可能超過時間戳範圍,優先選擇 datetime。2. 如果需要單獨獲取年份值,比如按照年來分區,按照年來檢索等,最好在表中添加一個 year 類型來參與。3. 如果需要單獨獲取日期或者時間,最好是單獨存放,而不是簡單的用 datetime 或者 timestamp。後面檢索時,再加函數過濾,以免後期增加 SQL 編寫帶來額外消耗。

4. 如果有保存毫秒類似的需求,最好是用時間類型自己的特性,不要直接用字元類型來代替。MySQL 內部的類型轉換對資源額外的消耗也是需要考慮的。

示例 5

建立表 t5,對這些可能需要的欄位全部分離開,這樣以後寫 SQL 語句的時候就很容易了。

當然了,這種情形佔用額外的磁碟空間。如果想在易用性與空間佔用量大這兩點來折中,可以用 MySQL 的虛擬列來實時計算。比如假設 c5 欄位不存在,想要得到 c5 的結果。mysql-(ytt/3305)-alter table t5 drop c5, add c5 year generated always as (year(c1)) virtual;Query OK, 1 row affected (2.46 sec)Records: 1  Duplicates: 0  Warnings: 0

五、二進位類型

binary 和 varbinary 對應了 char 和 varchar 的二進位存儲,相關的特性都一樣。不同的有以下幾點:

binary(10)/varbinary(10) 代表的不是字元個數,而是位元組數。

行結束符不一樣。char 的行結束符是 \0,binary 的行結束符是 0x00。

由於是二進位存儲,所以字元編碼以及排序規則這類就直接無效了。

示例 6

來看這個 binary 存取的簡單示例,還是之前的變數 @a。

切記!這裡要提前計算好 @a 佔用的位元組數,以防存儲溢出。

六、位類型

bit 為 MySQL 里存儲比特位的類型,最大支持 64 比特位, 直接以二進位方式存儲,一般用來存儲狀態類的信息。比如,性別,真假等。具有以下特性:

1. 對於 bit(8) 如果單純存放 1 位,左邊以 0 填充 00000001。2. 查詢時可以直接十進位來過濾數據。3. 如果此欄位加上索引,MySQL 不會自己做類型轉換,只能用二進位來過濾。

示例 7

創建表 c1, 欄位性別定義一個比特位。mysql-(ytt/3305)-create table c1(gender bit(1));Query OK, 0 rows affected (0.02 sec)

mysql-(ytt/3305)-select cast(gender as unsigned)  ‘f1’ from c1;+——+| f1   |+——+|    0 ||    1 |+——+2 rows in set (0.00 sec)

過濾數據也一樣,二進位或者直接十進位都行。mysql-(ytt/3305)-select conv(gender,16,10) as gender \   – from c1 where gender = b’1′; +——–+| gender |+——–+| 1      |+——–+1 row in set (0.00 sec)    mysql-(ytt/3305)-select conv(gender,16,10) as gender \    – from c1 where gender = ‘1’;+——–+| gender |+——–+| 1      |+——–+1 row in set (0.00 sec)

其實這樣的場景,也可以定義為 char(0),這也是類似於 bit 非常優化的一種用法。

mysql-(ytt/3305)-create table c2(gender char(0));Query OK, 0 rows affected (0.03 sec)

那現在我給表 c1 簡單的造點測試數據。

mysql-(ytt/3305)-select count(*) from c1;+———-+| count(*) |+———-+| 33554432 |+———-+1 row in set (1.37 sec)

把 c1 的數據全部插入 c2。

mysql-(ytt/3305)-insert into c2 select if(gender = 0,”,null) from c1;Query OK, 33554432 rows affected (2 min 18.80 sec)Records: 33554432  Duplicates: 0  Warnings: 0

兩張表的磁碟佔用差不多。root@ytt-pc:/var/lib/mysql/3305/ytt# ls -sihl總用量 1.9G4085684 933M -rw-r—– 1 mysql mysql 932M 12月 11 10:16 c1.ibd4082686 917M -rw-r—– 1 mysql mysql 916M 12月 11 10:22 c2.ibd

檢索方式稍微有些不同,不過效率也差不多。所以說,字元類型不愧為萬能類型。

七、枚舉類型

枚舉類型,也即 enum。適合提前規劃好了所有已經知道的值,且未來最好不要加新值的情形。枚舉類型有以下特性:

1. 最大佔用 2 Byte。2. 最大支持 65535 個不同元素。3. MySQL 後台存儲以下標的方式,也就是 tinyint 或者 smallint 的方式,下標從 1 開始。4. 排序時按照下標排序,而不是按照裡面元素的數據類型。所以這點要格外注意。

示例 8

創建表 t7。mysql-(ytt/3305)-create table t7(c1 enum(‘mysql’,’oracle’,’dble’,’postgresql’,’mongodb’,’redis’,’db2′,’sql server’));Query OK, 0 rows affected (0.03 sec)

八、集合類型

集合類型 SET 和枚舉類似,也是得提前知道有多少個元素。SET 有以下特點:

1. 最大佔用 8 Byte,int64。2. 內部以二進位位的方式存儲,對應的下標如果以十進位來看,就分別為 1,2,4,8,…,pow(2,63)。3. 最大支持 64 個不同的元素,重複元素的插入,取出來直接去重。4. 元素之間可以組合插入,比如下標為 1 和 2 的可以一起插入,直接插入 3 即可。

示例 9

定義表 c7 欄位 c1 為 set 類型,包含了 8 個值,也就是下表最大為 pow(2,7)。

mysql-(ytt/3305)-create table c7(c1 set(‘mysql’,’oracle’,’dble’,’postgresql’,’mongodb’,’redis’,’db2′,’sql server’));Query OK, 0 rows affected (0.02 sec)

插入 1 到 128 的所有組合。

mysql-(ytt/3305)-INSERT INTO c7WITH RECURSIVE ytt_number (cnt) AS (        SELECT 1 AS cnt        UNION ALL        SELECT cnt + 1        FROM ytt_number        WHERE cnt pow(2, 7)    )SELECT *FROM ytt_number;Query OK, 128 rows affected (0.01 sec)Records: 128  Duplicates: 0  Warnings: 0

九、數據類型在存儲函數中的用法

函數里除了顯式聲明的變數外,默認 session 變數的數據類型很弱,隨著給定值的不同隨意轉換。

示例 10

定義一個函數,返回兩個給定參數的乘積。定義里有兩個變數,一個是 v_tmp 顯式定義為 int64,另外一個 @vresult 隨著給定值的類型隨意變換類型。

簡單調用下。

mysql-(ytt/3305)-select ytt_sample_data_type(1111,222) ‘result’;+————————–+| result                   |+————————–+| The result is: ‘246642’. |+————————–+1 row in set (0.00 sec)

總結

本篇把 MySQL 基本的數據類型做了簡單的介紹,並且用了一些容易理解的示例來梳理這些類型。我們在實際場景中,建議選擇適合最合適的類型,不建議所有數據類型簡單的最大化原則。比如能用 varchar(100),不用 varchar(1000)。

資料庫mysql創建表格老是出錯,看不懂英文提示?

來自:51CTO(作者:superZS)

我在剛開始學習資料庫的時候,沒少走彎路。經常會遇到各種稀奇古怪的 error 信息,遇到報錯會很慌張,急需一個解決問題的辦法。跟無頭蒼蠅一樣,會不加思索地把錯誤粘到百度上,希望趕緊查找一下有沒有好的處理問題的方法。我想這個應該是剛從事資料庫的小白,都會遇到窘境。

今天就給大家列舉 MySQL 資料庫中,最經典的十大錯誤案例,並附有處理問題的解決思路和方法,希望能給剛入行,或資料庫愛好者一些幫助,今後再遇到任何報錯,我們都可以很淡定地去處理。

學習任何一門技術的同時,其實就是自我修鍊的過程。沉下心,嘗試去擁抱數據的世界!

Top 1:

Too many connections(連接數過多,導致連接不上資料庫,業務無法正常進行)

問題還原

解決問題的思路:

1、首先先要考慮在我們 MySQL 資料庫參數文件裡面,對應的 max_connections 這個參數值是不是設置的太小了,導致客戶端連接數超過了資料庫所承受的最大值。

● 該值默認大小是151,我們可以根據實際情況進行調整。

● 對應解決辦法:set global max_connections=500

但這樣調整會有隱患,因為我們無法確認資料庫是否可以承擔這麼大的連接壓力,就好比原來一個人只能吃一個饅頭,但現在卻非要讓他吃 10 個,他肯定接受不了。反應到伺服器上面,就有可能會出現宕機的可能。

所以這又反應出了,我們在新上線一個業務系統的時候,要做好壓力測試。保證後期對資料庫進行優化調整。

2、其次可以限制 Innodb 的並發處理數量,如果 innodb_thread_concurrency = 0(這種代表不受限制) 可以先改成 16或是64 看伺服器壓力。如果非常大,可以先改的小一點讓伺服器的壓力下來之後,然後再慢慢增大,根據自己的業務而定。個人建議可以先調整為 16 即可。

MySQL 隨著連接數的增加性能是會下降的,可以讓開發配合設置 thread pool,連接復用。在MySQL商業版中加入了thread pool這項功能

另外對於有的監控程序會讀取 information_schema 下面的表,可以考慮關閉下面的參數

innodb_stats_on_metadata=0

set global innodb_stats_on_metadata=0

Top 2:(主從複製報錯類型)

Last_SQL_Errno: 1062 (從庫與主庫數據衝突)

Last_Errno: 1062

Last_Error: Could not execute Write_rows event on table test.t;

Duplicate entry ‘4’ for key ‘PRIMARY’,

Error_code: 1062; handler error HA_ERR_FOUND_DUPP_KEY;

the event’s master log mysql-bin.000014, end_log_pos 1505

針對這個報錯,我們首先要考慮是不是在從庫中誤操作導致的。結果發現,我們在從庫中進行了一條針對有主鍵表的 sql 語句的插入,導致主庫再插入相同 sql 的時候,主從狀態出現異常。發生主鍵衝突的報錯。

解決方法:

在確保主從數據一致性的前提下,可以在從庫進行錯誤跳過。一般使用 percona-toolkit 中的 pt-slave-restart 進行。

在從庫完成如下操作

[root@zs bin]# ./pt-slave-restart -uroot -proot123

2017-07-20T14:05:30 p=…,u=root node4-relay-bin.000002 1506 1062

之後最好在從庫中開啟 read_only 參數,禁止在從庫進行寫入操作

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 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 是唯一的。這裡再強調一下 server-id 的命名規則(伺服器 ip 地址的最後一位+本 MySQL 服務的埠號)

解決方法:

在主從兩台機器上設置不同的 server-id。

Last_SQL_Errno: 1032(從庫少數據,主庫更新的時候,從庫報錯)

Last_SQL_Error:

Could not execute Update_rows event on table test.t; Can’t find record

in ‘t’, Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND; the

event’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.log

cat 1.log

#170720 14:20:15 server id 3 end_log_pos 1708 CRC32 0x97b6bdec Update_rows: table id 113 flags: STMT_END_F

### UPDATE `test`.`t`

### WHERE

### @1=4 /* INT meta=0 nullable=0 is_null=0 */

### @2=’dd’ /* VARSTRING(60) meta=60 nullable=1 is_null=0 */

### SET

### @1=4 /* INT meta=0 nullable=0 is_null=0 */

### @2=’ddd’ /* VARSTRING(60) meta=60 nullable=1 is_null=0 */

# at 1708

#170720 14:20:15 server id 3 end_log_pos 1739 CRC32 0xecaf1922 Xid = 654

COMMIT/*!*/;

DELIMITER ;

# End of log file

ROLLBACK /* added by mysqlbinlog */;

/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;

/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;

獲取到 sql 語句之後,就可以在從庫反向執行 sql 語句。把從庫缺少的 sql 語句補全,解決報錯信息。

在從庫依次執行:

mysql insert into t (b) values (‘ddd’);

Query OK, 1 row affected (0.01 sec)

mysql stop slave;

Query OK, 0 rows affected (0.00 sec)

mysql exit

Bye

[root@node4 bin]# ./pt-slave-restart -uroot -proot123

2017-07-20T14:31:37 p=…,u=root node4-relay-bin.000005 283 1032

Top 3:MySQL安裝過程中的報錯

[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/mysql170720

14: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

14:41:25 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated.

Please use –explicit_defaults_for_timestamp server option

(see documentation for more details)./usr/local/mysql/bin/mysqld:

File ‘/data/mysql/mysql-bin.index’ not found (Errcode: 13 – Permission denied)

2017-07-20 14:41:25 4388 [ERROR] Aborting

解決思路:

遇到這樣的報錯信息,我們要學會時時去關注錯誤日誌 error log 裡面的內容。看見了關鍵的報錯點 Permission denied。證明當前 MySQL 資料庫的數據目錄沒有許可權。

解決方法:

[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

啟動成功。

如何避免這類問題,個人建議在安裝 MySQL 初始化的時候,一定加上–user=mysql,這樣就可以避免許可權問題。

./mysql_install_db –basedir=/usr/local/mysql/ –datadir=/data/mysql/ –defaults-file=/etc/my.cnf –user=mysql

Top 4:資料庫密碼忘記的問題

[root@zs ~]# mysql -uroot -p

Enter password:

ERROR 1045 (28000): Access denied for user ‘root’@’localhost’ (using password: YES)

[root@zs ~]# mysql -uroot -p

Enter password:

ERROR 1045 (28000): Access denied for user ‘root’@’localhost’ (using password: YES)

我們有可能剛剛接手別人的 MySQL 資料庫,而且沒有完善的交接文檔。root 密碼可以丟失或者忘記了。

解決思路:

目前是進入不了資料庫的情況,所以我們要考慮是不是可以跳過許可權。因為在資料庫中,mysql資料庫中user表記錄著我們用戶的信息。

解決方法:

啟動 MySQL 資料庫的過程中,可以這樣執行:

/usr/local/mysql/bin/mysqld_safe –defaults-file=/etc/my.cnf –skip-grant-tables

這樣啟動,就可以不用輸入密碼,直接進入 mysql 資料庫了。然後在修改你自己想要改的root密碼即可。

update mysql.user set password=password(‘root123′) where user=’root’;

Top 5:truncate 刪除數據,導致自動清空自增ID,前端返回報錯 not found。

這個問題的出現,就要考慮下 truncate 和 delete 的區別了。

看下實驗演練:

首先先創建一張表;

CREATE TABLE `t` (

`a` int(11) NOT NULL AUTO_INCREMENT,

`b` varchar(20) DEFAULT NULL,

PRIMARY KEY (`a`),

KEY `b` (`b`)

) ENGINE=InnoDB AUTO_INCREMENT=300 DEFAULT CHARSET=utf8

插入三條數據:

mysql insert into t (b) values (‘aa’);

Query OK, 1 row affected (0.00 sec)

mysql insert into t (b) values (‘bb’);

Query OK, 1 row affected (0.00 sec)

mysql insert into t (b) values (‘cc’);

Query OK, 1 row affected (0.00 sec)

mysql select * from t;

+—–+——+

| a | b |

+—–+——+

| 300 | aa |

| 301 | bb |

| 302 | cc |

+—–+——+

3 rows in set (0.00 sec)

先用 delete 進行刪除全表信息,再插入新值。

結果發現 truncate 把自增初始值重置了,自增屬性從1開始記錄了。當前端用主鍵id進行查詢時,就會報沒有這條數據的錯誤。

個人建議不要使用 truncate 對錶進行刪除操作,雖然可以回收表空間,但是會涉及自增屬性問題。這些坑,我們不要輕易鑽進去。

Top 6:

阿里雲 MySQL 的配置文件中,需要注意一個參數設置就是:

lower_case_table_names = 0;默認情況

lower_case_table_names = 1;是不區分大小寫 . 如果報你小寫的表名找不到, 那你就把遠端資料庫的表名改成小寫 , 反之亦然 . 注意 Mybatis 的 Mapper 文件的所有表名也要相應修改

Top 7:

有同學經常會問張老師,為什麼我的資料庫總會出現中文亂碼的情況。一堆????不知道怎麼回事。當向資料庫中寫入創建表,並插入中文時,會出現這種問題。此報錯會涉及資料庫字符集的問題。

解決思路:

對於中文亂碼的情況,記住老師告訴你的三個統一就可以。還要知道在目前的mysql資料庫中字符集編碼都是默認的UTF8

處理辦法:

1、數據終端,也就是我們連接資料庫的工具設置為 utf8

2、操作系統層面;可以通過 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 1

at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1074)

at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4096)

at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4028)

at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2490)

at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2651)

at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2734)

at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2155)

at com.mysql.jdbc.PreparedStatement.execute(PreparedStatement.java:1379)

解決思路:針對錶情插入的問題,一定還是字符集的問題。

處理方法:我們可以直接在參數文件中,加入

vim /etc/my.cnf

[mysqld]

init-connect=’SET NAMES utf8mb4′

character-set-server=utf8mb4

註:utf8mb4 是 utf8 的超集。

Top 8:使用 binlog_format=statement 這種格式,跨庫操作,導致從庫丟失數據,用戶訪問導致出現錯誤數據信息。

當前資料庫二進位日誌的格式為:binlog_format=statement

在主庫設置binlog-do-db=mydb1(只同步mydb1這一個庫)

在主庫執行use mydb2;

insert into mydb1.t1 values (‘bb’);這條語句不會同步到從庫。

但是這樣操作就可以;

use mydb1;

insert into mydb1.t1 values (‘bb’);因為這是在同一個庫中完成的操作。

在生產環境中建議使用binlog的格式為row,而且慎用binlog-do-db參數。

Top 9:MySQL 資料庫連接超時的報錯 ;

org.hibernate.util.JDBCExceptionReporter – SQL Error:0, SQLState: 08S01

org.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

org.hibernate.util.JDBCExceptionReporter – No operations allowed after connection closed. Connection was implicitly closed due to underlying exception/error:

** BEGIN NESTED EXCEPTION **

大多數做 DBA 的同學,可能都會被開發人員告知,你們的資料庫報了這個錯誤了。趕緊看看是哪裡的問題。

這個問題是由兩個參數影響的,wait_timeout 和 interactive_timeout。數據默認的配置時間是28800(8小時)意味著,超過這個時間之後,MySQL 資料庫為了節省資源,就會在資料庫端斷開這個連接,Mysql伺服器端將其斷開了,但是我們的程序再次使用這個連接時沒有做任何判斷,所以就掛了。

解決思路:

先要了解這兩個參數的特性;這兩個參數必須同時設置,而且必須要保證值一致才可以。

我們可以適當加大這個值,8小時太長了,不適用於生產環境。因為一個連接長時間不工作,還佔用我們的連接數,會消耗我們的系統資源。

解決方法:

可以適當在程序中做判斷;強烈建議在操作結束時更改應用程序邏輯以正確關閉連接;然後設置一個比較合理的timeout的值(根據業務情況來判斷)

Top 10 :can’t open file (errno:24)

有的時候,資料庫跑得好好的,突然報不能打開資料庫文件的錯誤了。

解決思路:

首先我們要先查看資料庫的 error log。然後判斷是表損壞,還是許可權問題。還有可能磁碟空間不足導致的不能正常訪問表;操作系統的限制也要關注下;用 perror 工具查看具體錯誤!

linux:/usr/local/mysql/bin # ./perror 24

OS error code 24: Too many open files

超出最大打開文件數限制!ulimit -n查看系統的最大打開文件數是65535,不可能超出!那必然是資料庫的最大打開文件數超出限制!

在 MySQL 里查看最大打開文件數限制命令:show variables like ‘open_files_limit’;

發現該數值過小,改為2048,重啟 MySQL,應用正常

處理方法:

repair table ;

chown mysql許可權

清理磁碟中的垃圾數據

資料庫(mysql)關鍵知識

Mysql是目前互聯網使用最廣的關係資料庫,關係資料庫的本質是將問題分解為多個分類然後通過關係來查詢。 一個經典的問題是用戶借書,三張表,一個用戶,一個書,一個借書的關係表。當需要查詢某個用戶借書情況或者是書被那些人借了,就用關係查詢來實現。

關係資料庫範式

來自英文Normal form,簡稱NF。要想設計—個好的關係,必須使關係滿足一定的約束條件,滿足這些規範的資料庫是簡潔的、結構明晰的,同時,不會發生插入(insert)、刪除(delete)和更新(update)操作異常。總共有六種範式:第一範式(1NF)、第二範式(2NF)、 第三範式 (3NF)、巴斯-科德範式(BCNF)、 第四範式 (4NF)和 第五範式 (5NF,又稱完美範式)。

1NF是指資料庫表的每一列都是不可分割的原子數據項。2NF必須滿足1NF,要求資料庫表中的每行記錄必須可以被唯一地區分。3NF在2NF基礎上,任何非主 屬性 不依賴於其它非主屬性(在2NF基礎上消除傳遞依賴)。BCNF是在3NF基礎上,任何非主屬性不能對主鍵子集依賴(在3NF基礎上消除對主碼子集的依賴), 滿足BCNF不再會有任何由於函數依賴導致的異常,但是我們還可能會遇到由於多值依賴導致的異常。4NF的定義很簡單:已經是BC範式,並且不包含多值依賴關係。5NF處理的是無損連接問題,這個範式基本沒有實際意義,因為無損連接很少出現,而且難以察覺。而域鍵範式試圖定義一個終極範式,該範式考慮所有的依賴和約束類型,但是實用價值也是最小的,只存在理論研究中。

Catalog和Schema

是資料庫對象命名空間中的層次,主要用來解決命名衝突的問題。從概念上說,一個資料庫系統包含多個Catalog,每個Catalog又包含多個Schema,而每個Schema又包含多個資料庫對象(表、視圖、欄位等)。但是Mysql的資料庫名就是Schema,不支持Catalog。

Mysql的資料庫引擎主要有兩種MyISAM和InnoDB,MyISAM支持全文檢索,InnoDB支持事務。

SQL中的通配符『%』代表任意字元出現任意次數。『_』代表任意字元出現一次。SQL與正則表達式結合查詢一般用在WHERE table_name REGEXP ‘^12.34’。子查詢是從裡到外執行。

資料庫聯結(join)涉及到外鍵,外鍵是指一個表的列是另一個表的主鍵,那麼它就是外鍵。笛卡爾積聯結(不指定聯結條件時)生成的記錄條目是單純的第一個表的行乘以第二個表的列數。用得最多的是等值聯結也叫內部聯結。

高級聯結還有自連接,是指查詢中的兩張表是同一張表,它通常作為外部語句用來代替從相同表中檢索數據時使用的子查詢。自然聯結使每個列只返回一次。外部聯結是指聯結包含了那些在相關表中沒有關聯行的行。例如列出所有產品及其訂購數量,包括沒有人訂購的產品。LEFT OUTER JOIN指選擇左邊表的所有行。

組合查詢是指採用UNION等將兩個查詢結果取並集。

視圖是查看存儲在別處的數據的一種工具,它本身並不包含數據,因此表的數據修改了,視圖返回的數據也將隨之修改,因此如果使用了複雜或嵌套視圖會對性能有較大的影響。視圖的作用之一是隱藏複雜的SQL通常會涉及到聯結查詢。

存儲過程類似於批處理,包含了一條或多條SQL語句。語法:

CREATE PROCEDURE name()

BEGIN

SQL

END

————————-

CALL name()//來調用存儲過程

游標有DECLARE定義,游標與存儲過程是綁定的,存儲過程處理完成,游標就會消失。游標被打開後可以使用FETCH語句訪問每一行。

觸發器是在某個時間發生時自動執行某條SQL語句。語法:

CREATE TRIGGER name AFTER INSERT ON talbe_name FOR EACH ROW

事務處理可以維護資料庫的完整性,保證批量的操作要麼完全執行,要麼完全不執行。包括事務、回退、提交、保留點幾個關鍵術語。ROLLBACK只能在一個事務處理內使用。他不能回退CREATE和DROP操作。使用COMMIT保證事務提交。複雜的事務處理需要部分提交或回退,因此我們需要使用保留點SAVEPOINT。可以使用ROLLBACK TO savepoint_name。保留點越多越好。保留點在事務執行完成後自動釋放。

MYSQL資料庫欄位默認值無效

ALTER

DATABASE

databasename

CHARACTER

SET

utf8;

CREATE

TABLE

xs(

sgjk

VARCHAR(20),

sfkzc

VARCHAR(2)

DEFAULT

‘否’

)ENGINE=INNODB

DEFAULT

CHARSET=utf8

注意設置資料庫的編碼,和表的編碼。一般情況下,你的資料庫是什麼編碼,如果表默認那就是和資料庫一樣的。這個問題應該是你在安裝資料庫的時候,沒有選擇utf-8編碼。

原創文章,作者:REIPP,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/331187.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
REIPP的頭像REIPP
上一篇 2025-01-16 15:47
下一篇 2025-01-16 15:47

相關推薦

  • 如何修改mysql的埠號

    本文將介紹如何修改mysql的埠號,方便開發者根據實際需求配置對應埠號。 一、為什麼需要修改mysql埠號 默認情況下,mysql使用的埠號是3306。在某些情況下,我們需…

    編程 2025-04-29
  • Python官網中文版:解決你的編程問題

    Python是一種高級編程語言,它可以用於Web開發、科學計算、人工智慧等領域。Python官網中文版提供了全面的資源和教程,可以幫助你入門學習和進一步提高編程技能。 一、Pyth…

    編程 2025-04-29
  • 如何解決WPS保存提示會導致宏不可用的問題

    如果您使用過WPS,可能會碰到在保存的時候提示「文件中含有宏,保存將導致宏不可用」的問題。這個問題是因為WPS在默認情況下不允許保存帶有宏的文件,為了解決這個問題,本篇文章將從多個…

    編程 2025-04-29
  • Python 常用資料庫有哪些?

    在Python編程中,資料庫是不可或缺的一部分。隨著互聯網應用的不斷擴大,處理海量數據已成為一種趨勢。Python有許多成熟的資料庫管理系統,接下來我們將從多個方面介紹Python…

    編程 2025-04-29
  • openeuler安裝資料庫方案

    本文將介紹在openeuler操作系統中安裝資料庫的方案,並提供代碼示例。 一、安裝MariaDB 下面介紹如何在openeuler中安裝MariaDB。 1、更新軟體源 sudo…

    編程 2025-04-29
  • Java Thread.start() 執行幾次的相關問題

    Java多線程編程作為Java開發中的重要內容,自然會有很多相關問題。在本篇文章中,我們將以Java Thread.start() 執行幾次為中心,為您介紹這方面的問題及其解決方案…

    編程 2025-04-29
  • Python操作MySQL

    本文將從以下幾個方面對Python操作MySQL進行詳細闡述: 一、連接MySQL資料庫 在使用Python操作MySQL之前,我們需要先連接MySQL資料庫。在Python中,我…

    編程 2025-04-29
  • Python爬蟲亂碼問題

    在網路爬蟲中,經常會遇到中文亂碼問題。雖然Python自帶了編碼轉換功能,但有時候會出現一些比較奇怪的情況。本文章將從多個方面對Python爬蟲亂碼問題進行詳細的闡述,並給出對應的…

    編程 2025-04-29
  • NodeJS 建立TCP連接出現粘包問題

    在TCP/IP協議中,由於TCP是面向位元組流的協議,發送方把需要傳輸的數據流按照MSS(Maximum Segment Size,最大報文段長度)來分割成若干個TCP分節,在接收端…

    編程 2025-04-29
  • 如何解決vuejs應用在nginx非根目錄下部署時訪問404的問題

    當我們使用Vue.js開發應用時,我們會發現將應用部署在nginx的非根目錄下時,訪問該應用時會出現404錯誤。這是因為Vue在刷新頁面或者直接訪問非根目錄的路由時,會認為伺服器上…

    編程 2025-04-29

發表回復

登錄後才能評論