2014年1月1日星期三

一個MySQL DBA著眼於PostgreSQL的第2部分:的MySQL改為PostgreSQL

Original post: http://anothermysqldba.blogspot.com/2014/01/a-mysql-dba-looks-at-postgresql-part2.html

所以我最近發表: 一個MySQL DBA著眼於PostgreSQL的 

這篇文章將探討從遷移的MySQLPostgreSQL的 。 我會盡快跟進與PostgreSQL的遷移回的MySQL 。 與這些職位的長期目標是要顯示的數據不同的數據庫中是如何工作的,以及如何解決每個數據庫中類似問題的時候應該出現了。 

對於遷移,我將使用經常使用的例子: 世界數據庫可在dev.mysql.com 。 

我也會承認這一點,我有更多的經驗豐富的MySQLPostgreSQL的 。 的PostgreSQL數據庫管理員可以編寫和推薦不同的解決方案這種情況。 這也是一個很簡單的例子。 

首先要保證這個過程從開始到結束: 


mysql> create database world;
Query OK, 1 row affected (0.00 sec

# mysql world < world_innodb.sql
mysql> show create table City;
CREATE TABLE `City` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`Name` char(35) NOT NULL DEFAULT '',
`CountryCode` char(3) NOT NULL DEFAULT '',
`District` char(20) NOT NULL DEFAULT '',
`Population` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`ID`),
KEY `CountryCode` (`CountryCode`),
CONSTRAINT `city_ibfk_1` FOREIGN KEY (`CountryCode`) REFERENCES `Country` (`Code`)
) ENGINE=InnoDB

mysql> select count(ID) from City\G
*************************** 1. row ***************************
count(ID): 4079 


所以,現在讓我得到了PostgreSQL的數據庫設置和準備。 

# su postgres
$ psql
psql (9.3.2)
Type "help" for help.

postgres=# CREATE DATABASE world;
CREATE DATABASE

# GRANT ALL ON DATABASE world TO testuser;
GRANT 


postgres=# \q 


這個簡單的perl腳本( mysql2pgsql.perl )有助於從遷移過程的MySQLPostgreSQL的 。 


# su testuser
$ cd
$ pwd
/home/testuser
$ wget http://pgfoundry.org/frs/download.php/1535/mysql2pgsql.perl 


收集的MySQL數據,並得到它準備好。 

mysqldump -u root -p world > mysql2postgresql.sql
$ ./mysql2pgsql.perl mysql2postgresql.sql mysql2postgresql.pgsql
table "city" will be dropped CASCADE
"city_id_seq"--
table "country" will be dropped CASCADE
table "countrylanguage" will be dropped CASCADE

$ psql world < mysql2postgresql.pgsql | more
DROP TABLE
DROP SEQUENCE
CREATE SEQUENCE
CREATE TABLE
INSERT 0 1 

..
INSERT 0 1
注意:下拉級聯到2其他對象
詳細信息:降級聯到約束countrylanguage_countrycode_fkey上表countrylanguage
瀑布跌落到約束city_countrycode_fkey上表城市
..
INSERT 0 1
INSERT 0 1
DROP TABLE
CREATE TABLE
INSERT 0 1
INSERT 0 1
..
INSERT 0 1
CREATE INDEX
ALTER TABLE


因此,讓我們看看我們所擁有的。 


$ psql -d world
psql (9.3.2)
Type "help" for help.

world=> \dt
List of relations
Schema | Name | Type | Owner
--------+-----------------+-------+----------
public | city | table | testuser
public | country | table | testuser
public | countrylanguage | table | testuser
(3 rows) 


從城市的世界=> SELECT COUNT(ID);
-------
4079
(1行)

世界=> SELECT * FROM城市限10;
ID |名稱|國家代碼|區|人口
---- + ------------------------------------- + ------- ------ + ---------------------- + ------------
1 |喀布爾| AFG | Kabol | 1780000
2 |坎大哈| AFG |坎大哈| 237500
3 |赫拉特| AFG |赫拉特| 186800
4 |馬扎裡 - 沙裡夫| AFG |巴爾赫| 127800
5 |阿姆斯特丹|民盟|北荷蘭省| 731200
6 |鹿特丹|民盟|南荷蘭省| 593321
7 |哈格|民盟|南荷蘭省| 440900
8 |烏得勒支|民盟|烏得勒支| 234323
9 |埃因霍溫|民盟|北布拉班特| 201843
10 |蒂爾堡|民盟|北布拉班特| 193238
(10行)

世界=> \ DT +城市
關係一覽表
架構|名稱|型號|業主|大小|說明
-------- + ------ + ------- + ---------- + -------- + ------ -------
公共|城市|表| TESTUSER | 432 KB |
(1行)


以及計數匹配和數據可用。 但現在我想看到的是MySQL版本的“SHOW CREATE TABLE”,請記住,在MySQL的 CREATE DATABASE和CREATE SCHEMA基本上是相同的東西。 


$ pg_dump -t city -s world
--
-- PostgreSQL database dump
--

SET statement_timeout = 0;
SET lock_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SET check_function_bodies = false;
SET client_min_messages = warning;

SET search_path = public, pg_catalog;

SET default_tablespace = '';

SET default_with_oids = false;

--
-- Name: city; Type: TABLE; Schema: public; Owner: testuser; Tablespace:
--

CREATE TABLE city (
id integer DEFAULT nextval('city_id_seq'::regclass) NOT NULL,
name character(35) DEFAULT ''::bpchar NOT NULL,
countrycode character(3) DEFAULT ''::bpchar NOT NULL,
district character(20) DEFAULT ''::bpchar NOT NULL,
population integer DEFAULT 0 NOT NULL
);


ALTER TABLE public.city OWNER TO testuser;

--
-- Name: city_pkey; Type: CONSTRAINT; Schema: public; Owner: testuser; Tablespace:
--

ALTER TABLE ONLY city
ADD CONSTRAINT city_pkey PRIMARY KEY (id);


--
-- Name: city_countrycode_idx; Type: INDEX; Schema: public; Owner: testuser; Tablespace:
--

CREATE INDEX city_countrycode_idx ON city USING btree (countrycode);


--
-- PostgreSQL database dump complete
-- 


正如你可以看到,看看表是一樣的的mysqldump命令 
$ mysqldump的 - ü根 - 對 - NO_DATA - 世界數據庫 - 表城 
更多的工作比一個典型的MySQL是用來不得不做只是為了看看表結構。 

但我們的數據和架構移到到PostgreSQL的MySQL的 。 

另一篇文章很快就來了... 移動回來。

2013年12月31日星期二

一個MySQL DBA著眼於PostgreSQL的

Original post: http://anothermysqldba.blogspot.com/2013/12/a-mysql-dba-looks-at-postgresql.html

所以這是/一之旅的MySQL DBA尋找到的PostgreSQL 。 這不是一個攻擊只是觀察和例子。 

使用的CentOS 6.5 64位: 

RPM-IVH http://yum.postgresql.org/9.3/redhat/rhel-6.5-x86_64/pgdg-centos93-9.3-1.noarch.rpm

百勝groupinstall“PostgreSQL數據庫服務器9.3 PGDG” 
--->包裝postgresql93.x86_64 0:9.3.2-1PGDG。RHEL6將安裝 
--->包裝postgresql93-contrib.x86_64 0:9.3.2-1PGDG。RHEL6將安裝 
--->包裝postgresql93-libs.x86_64 0:9.3.2-1PGDG。RHEL6將安裝 
 
--->包裝postgresql93-server.x86_64 0:9.3.2-1PGDG。RHEL6將安裝 

yum的安裝postgresql93服務器 

服務的PostgreSQL-9.3初始化數據庫 
初始化數據庫:[ 確定 ] 
服務的PostgreSQL-9.3啟動 
啟動PostgreSQL的-9.3服務:[ 確定 ] 
在chkconfig的postgresql-9.3 

下面所有的例子都是基於PostgreSQL的維基 
#蘇- Postgres的 
-bash的-4.1 $ psql的 
 
psql的(9.3.2) 

Postgres的=#CREATE USER testuser的密碼'1234'; 
CREATE ROLE 
Postgres的=#GRANT ALL ON SCHEMA測試,以testuser的; 
GRANT 

Postgres的=#GRANT ALL ON架構中測試,以testuser的所有表; 
GRANT 
Postgres的=#\ q
-bash的-4.1 $退出
註銷
#蘇testuser的

$ PWD 
/首頁/ testuser的 
$ psql的-D Postgres的 
psql的(9.3.2) 

鍵入“help”以獲得幫助。 
Postgres的=> CREATE TABLE test.test(COLTEST為varchar(20));
CREATE TABLE
Postgres的=>插入test.test(COLTEST)VALUES('它的工作原理!');
INSERT 0 1
Postgres的=> SELECT * FROM test.test;
COLTEST
-----------
它的工作原理!
(1行)

Postgres的=> DROP TABLE test.test;
DROP TABLE
Postgres的=>

我也注意到,這些GRANT語句9.3運作良好,但最初的發行版安裝了一個8 *版本和一些命令失敗。 

順便說一句......你當然還有功能,你會期望從一個穩定的RDBM系統。 誠然這些都是很簡單的例子。 

Postgres的=> EXPLAIN SELECT * FROM test.test; 
查詢計劃 
-------------------------------------------------- ------ 
序列掃描測試上(成本= 0.00 .. 19.20行= 920寬度= 58) 

顯示數據庫== \升 
Postgres的- > \升 
Postgres的| Postgres的| UTF8 |的en_US.UTF-8 |的en_US.UTF-8 | 
template0中| Postgres的| UTF8 |的en_US.UTF-8 |的en_US.UTF-8 | = C / Postgres的+ 
| | | | | Postgres的= CTC / Postgres的 
的template1 | postgres的| UTF8 |的en_US.UTF-8 |的en_US.UTF-8 | = C / Postgres的+ 

| | | | | Postgres的= CTC / Postgres的 

使用的是標準的SQL: 
Postgres的- >使用Postgres的 

列出所有模式: 

Postgres的- > \ DN 
公眾| Postgres的 

測試| Postgres的 

SHOW CREATE TABLE等是更多一點的工作。 授予一個MySQL DBA會看到它作為,因為我們是用來做更多的工作。PostgreSQL使用表空間超過MySQL用戶是用來做什麼。

  Postgres的=> CREATE TABLE sometable(somefield數據類型為varchar(255),anotherfield為varchar(150),DateField的日期); 
  CREATE TABLE 
  Postgres的=> INSERT INTO sometable(somefield,anotherfield,的DateField)VALUES('FUBAR','rabuf','2013-12-30'); 
  INSERT 0 1 
  Postgres的=> INSERT INTO sometable(somefield,anotherfield,的DateField)VALUES('FUBAR','rabuf',NOW()); 
  INSERT 0 1 
  Postgres的=> INSERT INTO sometable(somefield,anotherfield,的DateField)VALUES('fubar2','rabuf2',NOW()); 
  INSERT 0 1 
  Postgres的=>從sometable選擇*; 
   somefield | anotherfield |的DateField   
  ----------- + -------------- + ------------ 
   FUBAR | rabuf | 2013-12-30 
   FUBAR | rabuf | 2013-12-30 
   fubar2 | rabuf2 | 2013-12-30 
  (3行) 

Postgres的=> SELECT * FROM sometable WHERE somefield ='FUBAR'; somefield | anotherfield |的DateField ----------- + -------------- + ---- -------- FUBAR | rabuf | 2013-12-30 FUBAR | rabuf | 2013-12-30(2排)

Postgres的=> \? < -幫助將告訴您如何來瀏覽周圍。

顯示表== \ DT

Postgres的=> \ DT
關係一覽表
架構|名稱|型號|業主
-------- + ----------- + -------- + ----------
公共| sometable |表| TESTUSER

Postgres的=> ALTER TABLE sometable ADD COLUMN intfield的int [11]; ALTER TABLE

Postgres的=> SELECT * FROM sometable; somefield | anotherfield |的DateField | intfield ----------- + -------------- + -------- ---- + ---------- FUBAR | rabuf | 2013-12-30 | FUBAR | rabuf | 2013-12-30 | fubar2 | rabuf2 | 2013-12-30 |(3行)

SHOW CREATE TABLE == \ D +表名
Postgres的=> \ D + sometable
表“public.sometable”
專欄|類型|修飾語|存儲|統計指標|說明
-------------- + ------------------------ + ---------- - + ---------- + -------------- + -------------
somefield |字符改變(255)| |擴展| |
anotherfield |字符改變(150)| |擴展| |
的DateField |日期| |平原| |
intfield |整數[] | |擴展| |
擁有的OID:無


為了幫助更多的可以安裝pgAdmin的
yum的安裝pgadmin3_93

如果這能夠工作,它是如何工作可能是另一種整個博客文章。

到目前為止.... 我會堅持與MySQL但這是使用PostgreSQL的只是一個簡單的例子。 這可以讓你開始你可以評估自己。

下面有用的鏈接。 請參考這些,因為他們有更多的經驗與PostgreSQL的比我好。

2013年12月7日星期六

ERROR 1356(HY000)

Original post: http://anothermysqldba.blogspot.com/2013/12/error-1356-hy000.html

後一個錯誤來時要了解的最重要的事情是要花點時間和放鬆。 
有時,人們遇到一個錯誤運行,並成為慌亂和沮喪。 深呼吸和放鬆。 有時候,“ 瘋狂就像重力。所有這一切需要的是輕輕一推 “和” 有時,問題是複雜的,答案很簡單 。“ 

這是什麼一回事呢? 嗯比如我最近被要求幫助解決了困擾其它DBA的一個問題。 在尊重各沒什麼意思了DBA,但在匆忙的人只是被忽視的 答案 就是在他們面前的,而是螺旋式下降到 瘋狂  

下面是這種情況的一般概念。 

做一個數據庫的mysqldump在用戶移動到另一個數據庫為他人被測試。 導入工作就好了。 但是,用戶開始發現錯誤,當他們試圖從一個預先構建的視圖來查詢。 

的mysql> SELECT * FROM <View_name>限制1; 

ERROR 1356(HY000):查看'。<DB_NAME>的<Viewname>'引用了無效的表(S)或列(S)或函數(S)或視圖缺乏權利定義者/調用者使用它們 

第一反應是假設出事了與進口。 做了視圖或實際的相關表被損壞? 

 

為了解決這個錯誤的第一件事待辦事項是:MySQL的>顯示創建視圖<View_Name> \ G 

你可能會看到的東西,是這樣開始的: 
*************************** 1。 排*************************** 
查看:訪問者 
 
創建視圖:CREATE ALGORITHM = UNDEFINED DEFINER =`<Some_user>`@`<Some_host_or_IP>`SQL SECURITY DEFINER查看 

當你看到誰定義者是:`<Some_user>`@`<Some_host_or_IP>` 您可以查看贈款該用戶。 

MySQL的>展會補助`<Some_user>`@`<Some_host_or_IP>`; 

原來,該解決方案是擺在首位的錯誤只是說什麼:“ 來看缺乏權利定義者/調用者使用它們  

為了方便您可以在那裡已經工作了數據庫做一個節目的贈款和複製GRANT語句,或者你可以查看什麼類型的權限,你需要在新的數據庫來實現,以使視圖來收集所需的數據。 

為用戶和權限錯誤的一個簡單的更新不見了。 

 有時候,答案很簡單 。“ 

2013年11月30日星期六

從社區的戰略

Original post: http://anothermysqldba.blogspot.com/2013/11/a-strategy-from-community.html

我們已經看到了關於MariaDB的了Fedora,SUSE和Red Hat取代MySQL的消息。

而Oracle也不會高興這樣的消息,開源社區支持的重點放在一個“更多”開源落實到Linux解決方案。

有趣的事情,我們都可能在看的是,該決定或戰略,以從MySQL遷移到MariaDB的很可能不只是由上層管理紅帽。 這是更可能是來自開源社區的運動紅帽評估,他們聽。

考慮這一點,回頭一看在成龍Yeaney的( @ jackieyeaney )發布有關“ 民主化的企業戰略過程在紅帽 “(發布2011年11月10日),並學習如何帽子紅的作品。 我們利用現有網絡在開源社區,以”保持頭腦開放“和社交的想法紅帽之外。” 社會希望開放性和結果是轉會到MariaDB的紅帽,是關係到紅帽的開放戰略,在我的愚見很可能是肯定的。

吉姆·懷特赫斯特@ JWhitehurst )出現擁抱,因為金融收益的不只是開源社區它獎勵的公司,但也因為它是如何徹底改變了他們的工作,作出戰略決策,並從別人那裡索取輸入:“只要眼球足夠多,所有的bug很淺。“

花點時間與去年語句到MySQL。 如果你遵循的MySQL,那麼你也知道,甲骨文關閉(或有少開版了)的bugs.mysql.com網站。 雖然甲骨文有自己的企業的推理是,開源社區遵循“只要眼球足夠多,所有的錯誤都是淺。”

隨著MariaDB的成長,變得更加嵌入到Linux發行版作為默認數據庫的相關bug跟踪將是開放的,這將是有趣的,看看蟲子從長遠來看分成了瑪麗亞和MySQL。

所以,現在.. 有趣的方面是,而MySQL的過企業,由甲骨文擁有的社區版本,此舉仍然發生,因為MariaDB的的。 Oracle還擁有Java和相關的OpenJDK。 雖然我只是問這個作為一個局外人看著英寸.. 如果Java / OpenJDK的是跨足不是由甲骨文擁有的其他軟件包的話,我們很快就會看到一個替代的Java / OpenJDK的紅帽呢? 再次我是一個局外人Java世界,所以我只是問,因為相似的,它代表與MySQL。

2013年11月19日星期二

MariaDB的Linux發行版

Original post: http://anothermysqldba.blogspot.com/2013/11/mariadb-linux-distributions.html

所以現在很多人已經看過有關谷歌的消息,SUSE和Red Hat / Fedora的移動MariaDB的代替MySQL作為默認的數據庫。

MariaDB的SkySQL已經取得了非常富有成效的企業移動今年。 這究竟是什麼意思為MySQL社會各界和廣大開源社區?

對於初學者回想起什麼取得如此受歡迎的MySQL? 這是現成的所有頂級的Linux發行版。

openSUSE和Fedora的已經轉移到MariaDB的,所以推一個開放源碼的集中運動已經開始。 經過RHEL遷移MariaDB的默認數據庫,然後也意味著,很快就會有CentOS的默認數據庫MariaDB的。

可能很快跟進,將是Ubuntu和Debian的舉動。 我可能已經錯過了一個移動的消息了,但是我不這麼認為。

所有這一切都是大新聞和MariaDB的移動和開源社區的。 MariaDB的自然會開始看到更多的用戶接受和使用。 雖然甲骨文的MySQL仍然是一個開源軟件包大問題一直bugs.mysql.com的的網站,並跟踪mysql用戶的錯誤。 人們很快將開始跟踪更多MariaDB的錯誤呢?

MariaDB的也有開源的特點,模仿甲骨文的MySQL企業唯一的解決辦法。 因此,許多用戶會自然地拿起那些功能。

儘管甲骨文正在建設強大的功能和代碼,但在社會上有多少正在? MySQL 5.1中被大量使用,在社會上使用的Linux發行版,許多用戶可能只知道MySQL 5.1和5.5 MariaDB的這麼快。

接下來會發生什麼?
甲骨文決定做什麼仍是有待觀察。 甲骨文已經採取的Red Hat Linux建立自己的Oracle的Linux(OEL)。 所以,具有諷刺意味的MariaDB的分叉,這是從甲骨文的MySQL,將Red Hat Linux中為Oracle移除他們的OEL。 甲骨文將反擊以某種方式與Java?

Percona的怎麼辦? Percona的也是一個球員在這方面和有MariaDB的和甲骨文多年來互相尊重的關係。 當然,Percona的確實偏向了開源方面的東西,所以會好奇,看是否出現的任何舉動Percona的一部分。 MariaDB的功能,即將成為專注於更多的工具?

MariaDB的做什麼? 那麼, MariaDB的錯誤數據庫中的錯誤監測的增長率會幫助多少人開始採取MariaDB的。
瑪麗亞在一些點脫離MySQL的源代碼更新,並繼續構建社區和他們的工程師?

那麼接下來會發生什麼? 我們不知道。 它是由開源社區。 很多憤怒的聲音已經直指甲骨文多年來。 那些聲音那麼,如何才能改變或MariaDB的顯示支持,將很快可以看到。 他們許多人可能已經MariaDB的支持,它是採用的群眾,將顯示如何MariaDB的問候到MySQL。 許多公司都知道的名稱以及將MySQL猶豫移動到MariaDB的(這只是發生在我身上的一天。)。 因此,MariaDB的工作還沒有完成。
然而,這畢竟... 甲骨文,紅帽和谷歌仍然走到了一起,來幫助我們的政府