install mysql 5.7 on centos 7

自從mysql被移除後,要從centos7上面安裝mysql方法,變成了要去官網

1.安裝 官方rpm

sudo rpm -Uvh https://dev.mysql.com/get/mysql57-community-release-el7-9.noarch.rpm

2.安裝mysql

sudo yum install mysql-community-server

3.拿密碼

通常google出來的文件會告訴你要去執行mysql_secure_installation,但人生就是多了but…

mysql_secure_installation

Error: Access denied for user ‘root’@’localhost’ (using password: NO)

對,在5.7版他預設了一組臨時密碼,但是….他不會顯示給你看

在centos7也沒有mysqld_safe這個指令,所以要看到剛安裝好的預設密碼

要去mysqld.log看

sudo grep ‘temporary password’ /var/log/mysqld.log

就可以看到密碼了

[Note] A temporary password is generated for root@localhost: ,:qd5Gkl/yj2

登入後按照以下指令修改

 

ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass4!';


#官網有寫,記得看完喔
https://dev.mysql.com/doc/refman/5.7/en/linux-installation-yum-repo.html

 

 

Mac sierra with mysql 5.7 .Install mysql ,reset root password

1.不要用brew 安裝mysql,到mysql官方網站下載

2.安裝後,預設安裝系統位置在/usr/local/mysql-5.7.xxxxxx/

3.安裝後會顯示root的亂數密碼,請記得抄下,在這版本會自動產生root的亂數密碼

3.無法在/usr/local/mysql.x/bin/ 啟動mysqld,在mac下,啟動方式如下

shell> sudo launchctl start com.mysql.mysqld
shell> sudo launchctl stop com.mysql.mysqld

官方也會自動提供一個GUI tool安裝在mac上

4. 如果遺失root密碼,在mysql 5.7 已經取消了傳統的update root password方式,

在5.7版後更新方式如下

4-1:設定一個text檔案,內容如下

  1. MySQL 5.7.6 and later:
    ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass';
    

    MySQL 5.7.5 and earlier:

    SET PASSWORD FOR 'root'@'localhost' = PASSWORD('MyNewPass');
    
  2. 檔名要取名-init結尾,不帶副檔名,如mypass-init

4-2:在/usr/local/mysql-5.7.x/bin/執行

mysqld_safe --init-file=/{yourfloder}/mypass-init &

4-3:執行後就更新完畢

 

 

mysql扣庫存的動作

今天研究一個主題,扣庫存,看到一個關鍵詞組
“select for update mysql”
看了幾個人的寫法
整合起來就是這樣

table : tb1
欄位
id
stock

扣庫存

BEGIN;
select stock from tb1 where id=1 for update;
update tb1 set stock = stock -2 where id =1 and stock >=2;
commit;
故意用2…為了是顯示要扣庫存的條件,這裡的條件是扣兩件所以where stock>=2才能跑stock -2
使用transation時 測試的結果
開兩個視窗
conn a
conn b

conn a執行
BEGIN;
select stock from tb1 where id=1 for update;
update tb1 set stock = stock -1 where id =1 and stock >=1;

再來
conn b執行
update tb1 set stock = stock -1 where id =1 and stock >=1;

這時候conn b會等到conn a comit之後才會扣庫存
conn a 執行commit;
transcation結束
換執行 conn b
如果庫存被扣完 那就會更新失敗傳回0

現在的問題是
扣庫存要用哪一種語法呢?

stock = stock -1
還是
sotck = $a

前者看起來比較沒有庫存錯誤的問題,但必須配合transaction使用
至於$a的值也是從select來的,可能會有時間差的問題
mysql 官網在介紹for update這件事情的時候,是用stock = stock -1當範例的,終究這是最後的值,沒有經過select的時間差

最後這只有innodb才做的了….

mysql 內建取筆數的函數 FOUND_ROWS

我是看到這篇才發現的
http://www.thespanner.co.uk/2007/07/23/php-mysql-tips/
用法

1
2
SELECT SQL_CALC_FOUND_ROWS goods WHERE k='avs' LIMIT 10;
SELECT FOUND_ROWS();

一定要有SQL_CALC_FOUND_ROWS 當鋪陳

zrm for mysql

這是一套mysql的備份軟體 zrm for mysql
可以對innodb做 hotcopy

1.先安裝cpan
2.安裝所有的perl-xml-*
3.下載
http://www.zmanda.com/backup-mysql.html
4.設定
/etc/mysql-zrm/mysql-zrm.conf
# mysql-zrm-backup –backup-set dailybackup
dailybackup 是名稱
完整備份
mysql-zrm-scheduler –now –backup-set db1 –backup-level 0
增量備份
mysql-zrm-scheduler –now –backup-set db1 –backup-level 1
0是完整備份 1是增量備份 增量備份需要開啟binlog
完整備份回復
mysql-zrm –action restore –backup-set db1 \
–source-directory /mnt/sdg/dbbackup/db1/20110304022219
如果要指定回復某一個資料庫 用
–databases
增量備份回復
mysql-zrm –action restore –backup-set db1 \
–start-date=”20110304064500″ –stop-datetime “20110304064500” \
–source-directory /mnt/sdg/dbbackup/db1/20110304064500
另一個增量備份的回復方式
mysql-zrm –action restore –bin-logs /var/lib/mysql-zrm/backupset1/20060818121532/mysql-bin.[0-9]* /var/lib/mysql-zrm/backupset1/20060819121532/mysql-bin.[0-9]*
連結
http://wiki.zmanda.com/index.php/How_do_I_recover_data_when_there_is_a_failure_or_data_loss%3F

更換mysql data位置

如果mysql data所在位置的硬碟空間不夠的話
1.stop mysql service
2.copy to new place
3.修改my.cnf

[mysqld]
socket=/mnt/sdf/mysql/mysql.sock
datadir=mnt/sdf/mysql
[client]
socket=/mnt/sdf/mysql/mysql.sock
datadir是設定mysql data的地方
設定完以後 還要修改socket的所在
記住 client msyqld兩個都要
存檔後重新啟動即可
驗證的方法是
mysql -u root -p
如果可以進得去 就可以 不行的話
代表沒有設定對
如果都設定對 但是還是出現無法透過socket連線的話
a.stop service
b.砍掉所有的mysql process
c.把字砍掉 存檔
d.重新啟動
e.再修改為正確的
f.再重新啟動
4.修改php.ini
因為socket改過了 所以在php.ini的mysql.default_socket也要改
mysql.default_socket=/mnt/sdf/mysql/mysql.sock
存檔後重新啟動
5.查看phpinfo()
最後
那個socket是可以換到其他位置的,如果有其他的固定地方可以放,倒也不需要更動

Data truncated for column ‘co11’ at row 1

這是殺小?
這是一個mysql在5.0.2以上新加入的模式Strict Mode 造成的結果

mysql手冊中寫了如下的敘述

MySQL Manual wrote: n MySQL 5.0.2 and up, you can select stricter treatment of input values by using the STRICT_TRANS_TABLES or STRICT_ALL_TABLES SQL modes:

SET sql_mode = ‘STRICT_TRANS_TABLES’;
SET sql_mode = ‘STRICT_ALL_TABLES’;

STRICT_TRANS_TABLES enables strict mode for transactional storage engines, and also to some extent for nontransactional engines. It works like this:

*

For transactional storage engines, bad data values occurring anywhere in a statement cause the statement to abort and roll back.
*

For nontransactional storage engines, a statement aborts if the error occurs in the first row to be inserted or updated. (When the error occurs in the first row, the statement can be aborted to leave the table unchanged, just as for a transactional table.) Errors in rows after the first do not abort the statement, because the table has already been changed by the first row. Instead, bad data values are adjusted and result in warnings rather than errors. In other words, with STRICT_TRANS_TABLES, a wrong value causes MySQL to roll back all updates done so far, if that can be done without changing the table. But once the table has been changed, further errors result in adjustments and warnings.

For even stricter checking, enable STRICT_ALL_TABLES. This is the same as STRICT_TRANS_TABLES except that for nontransactional storage engines, errors abort the statement even for bad data in rows following the first row. This means that if an error occurs partway through a multiple-row insert or update for a nontransactional table, a partial update results. Earlier rows are inserted or updated, but those from the point of the error on are not. To avoid this for nontransactional tables, either use single-row statements or else use STRICT_TRANS_TABLES if conversion warnings rather than errors are acceptable. To avoid problems in the first place, do not use MySQL to check column content. It is safest (and often faster) to let the application ensure that it passes only legal values to the database.

With either of the strict mode options, you can cause errors to be treated as warnings by using INSERT IGNORE or UPDATE IGNORE rather than INSERT or UPDATE without IGNORE.

 

大意是這是對支援交易機制的一個新模式,簡單的說任何不合乎欄位設定的格式都會被幹掉

例如如果設定null的欄位,如果寫入的字串是”,那很抱歉 他會靠北出標題列那串字串給你

你一定要寫null才可以反之亦然,最機車的一點是,text屬性不得預設任何字元

是不是覺得很靠北..因為是針對交易機制引擎做的,但是如果好死不死你的程式不用交易(ex.用myisam的程式)那不就靠北了嗎?

如何判斷有沒有開啟這個模式呢

1
SHOW VARIABLES LIKE 'sql_mode'

如果出現

1
STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

那就恭喜你啦

解決方案

1.去my.ini or my.cnf改以下設定

1
sql-mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

2. 我比較推薦這個,因為有可能你動不了這台mysql server

在最初使的連線設定上設定空白

1
mysql_query("SET @@sql_mode = ''");

OK packet 6 bytes shorter than expected

不要害怕…這是php5.3的新問題
遙想當年,mysql出4.1的時候,php的mysql_connect的加密是走mysql4.0以前的
當時一堆php程式掛點,後來用old_password=1或者是重新設定舊編碼的方式去改變密碼的加密方式
現在,php5.3終於進化到跟php5一樣的新加密模組了,但是呢,當年的設定都跑掉了
解決的方法就是用PASSWORD 函數重新設定一次密碼,然後把old_password=1拿掉即可

 

1
2
3
4
5
6
my.cnf/my.ini
#old_password=1
#############################################################
command line
 
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('mypassword');

但是如果是共用的環境……………….就很難解了
看樣子php6的連線模式大勢底定是不會走舊式的加密了,大家就只好拋棄舊的connect 加密的方式,也比較安全些
我認為擁抱pdo會是比較好得方式,php6也會這樣走,不過呢,現行pdo推行有難度……