Tuesday, December 31, 2013

A DBA MySQL olha para PostgreSQL parte2: MySQL para o PostgreSQL

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

Então, eu recentemente postou: Um DBA MySQL olha para PostgreSQL 

Este post vai explorar a migração do MySQL para PostgreSQL . Em breve vou segui-lo com umPostgreSQL migração de volta para MySQL . O objetivo a longo prazo com estas mensagens é mostrar como os dados funciona dentro das diferentes bases de dados, bem como a forma de resolver problemas semelhantes em cada banco de dados, quando deveria surgir. 

Para as migrações Vou usar o exemplo usado com freqüência: banco de dados mundialdisponível em dev.mysql.com . 

Além disso, vou reconhecer isso, estou mais experiente, com MySQL de PostgreSQL .PostgreSQL DBAs pode escrever e recomendar soluções diferentes para tais situações. Este também é um exemplo muito simples. 

Primeiro para garantir este processo é do início ao fim: 


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 


Então, agora deixe-me ver o PostgreSQL banco de dados configurado e pronto. 

# 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 


Este script perl simples ( mysql2pgsql.perl ) ajuda o processo de migração do MySQL paraPostgreSQL . 


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


Reúna os MySQL dados e deixá-lo pronto. 

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 

..
INSERIR 0 1
AVISO: As cascatas de cair para dois outros objetos
DETALHE: Gota cascatas de restrição countrylanguage_countrycode_fkey na mesa countrylanguage
soltar cascatas de restrição city_countrycode_fkey na cidade de mesa
..
INSERIR 0 1
INSERIR 0 1
DROP TABLE
CREATE TABLE
INSERIR 0 1
INSERIR 0 1
..
INSERIR 0 1
CREATE INDEX
ALTER TABLE


Por isso, vamos ver o que temos. 


$ 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) 


mundo => select count (ID) da Cidade;
contar
-------
4079
(1 linha)

mundo => SELECT * FROM limite Cidade 10;
id | nome | countrycode | Distrito | população
---- + ------------------------------------- + ------- ------ + ---------------------- + ------------
1 | Cabul | AFG | Kabol | 1780000
2 | Kandahar | AFG | Kandahar | 237500
3 | Herat | AFG | Herat | 186800
4 | Mazar-e-Sharif | AFG | Balkh | 127800
5 | Amsterdam | NLD | Noord-Holland | 731200
6 | Rotterdam | NLD | Zuid-Holland | 593321
7 | Haag | NLD | Zuid-Holland | 440900
8 | Utrecht | NLD | Utrecht | 234323
9 | Eindhoven | NLD | Noord-Brabant | 201843
10 | Tilburg | NLD | Noord-Brabant | 193238
(10 linhas)

mundo => \ dt + Cidade
Lista de relações
Esquema | Nome | Tipo | Dono | Tamanho | Descrição
-------- + ------ + ------- + ---------- + -------- + ------ -------
pública | cidade | mesa | testuser | 432 KB |
(1 linha)


Bem as contagens corresponder e os dados estão disponíveis. Mas agora eu quero ver a versão do MySQL de um "SHOW CREATE TABLE"; Tenha em mente que em MySQL CREATE DATABASE e CREATE SCHEMA são basicamente a mesma coisa. 


$ 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
-- 


Como você pode ver para ver a tabela é o mesmo que um comando mysqldump 
$ Mysqldump-u root-p - NO_DATA - mundo de banco de dados - tabelas Cidade 
Mais trabalho do que um típico MySQL é usado para ter que fazer só para ver a estrutura da tabela. 

Mas os nossos dados eo esquema é movido sobre para PostgreSQL a partir de MySQL . 

Outro post que virá em breve ... Movendo-lo de volta.

Monday, December 30, 2013

A DBA MySQL olha para PostgreSQL

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

Portanto, esta é uma jornada do / a MySQL DBA olhando para PostgreSQL . Ele não é um ataque apenas observações e exemplos. 

Usando CentOS 6.5 64 bits: 

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

yum groupinstall "banco de dados PostgreSQL 9.3 Servidor PGDG" 
---> Pacote postgresql93.x86_64 0:9.3.2-1PGDG. RHEL6 será instalado 
---> Postgresql93-contrib.x86_64 Package 0:9.3.2-1PGDG. RHEL6 será instalado 
---> Postgresql93-libs.x86_64 Package 0:9.3.2-1PGDG. RHEL6 será instalado 
 
---> Pacote postgresql93-server.x86_64 0:9.3.2-1PGDG. RHEL6 será instalado 

yum install postgresql93-servidor 

serviço postgresql-9.3 initdb 
Banco de dados de Inicialização: [OK] 
postgresql-9.3 serviço de início 
Começando postgresql-9.3 serviço: [OK] 
chkconfig postgresql-9.3 em 

Todos os exemplos que se seguem são baseados no PostgreSQL Wiki 
# Su - postgres 
-Bash-4.1 $ psql 
 
psql (9.3.2) 

postgres = # CREATE USER testuser SENHA '1234 '; 
CREATE ROLE 
postgres = # GRANT ALL ON SCHEMA teste para Testuser; 
GRANT 

postgres = # GRANT ALL ON Todas as tabelas de teste de esquema para Testuser; 
GRANT 
postgres = # \ q
-Bash-4.1 $ exit
Sair
# Su testuser

$ Pwd 
/ Home / testuser 
$ psql-d postgres 
psql (9.3.2) 

Digite "help" para obter ajuda. 
postgres => CRIAR Test.Test TABLE (varchar COLTEST (20));
CREATE TABLE
postgres => inserir valores (COLTEST) ('que funciona! ") Test.Test;
INSERIR 0 1
postgres => SELECT * FROM Test.Test;
COLTEST
-----------
Ele funciona!
(1 linha)

postgres => DROP TABLE Test.Test;
DROP TABLE
postgres =>

Eu notei que estas declarações de concessão funcionou bem com 9.3, mas a distro originalmente instalado uma versão 8. * E alguns dos comandos falhou. 

Btw ... Você, naturalmente, ainda têm características que você esperaria de um sistema RDBM estável. Concedido estes são exemplos simples. 

postgres => EXPLAIN SELECT * from Test.Test; 
Plano de consulta 
-------------------------------------------------- ------ 
Seq Scan no teste (cost = 0.00 .. 19.20 rows = 920 width = 58) 

Mostrar bases de dados == \ l 
postgres-> \ l 
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 

USE é padrão SQL: 
postgres-> postgres uso 

Listar todos os esquemas: 

postgres-> \ dn 
públicas | postgres 

teste | postgres 

SHOW CREATE TABLE e etc são um pouco mais de trabalho. Concedido um DBA MySQL vai vê-lo como mais trabalho por causa do que estamos acostumados a fazer. O PostgreSQL utiliza tablespaces mais de usuários do MySQL estão acostumados a fazer.

  postgres => CRIAR sometable TABLE (varchar SomeField (255), varchar anotherfield (150), data datefield); 
  CREATE TABLE 
  postgres => INSERT INTO (SomeField, anotherfield, DateField) VALUES (SomeTable 'fubar', 'rabuf', '2013-12-30 '); 
  INSERIR 0 1 
  postgres => INSERT INTO (SomeField, anotherfield, DateField) VALUES (SomeTable 'fubar', 'rabuf', NOW ()); 
  INSERIR 0 1 
  postgres => INSERT INTO (SomeField, anotherfield, DateField) VALUES (SomeTable 'fubar2', 'rabuf2', NOW ()); 
  INSERIR 0 1 
  postgres => SELECT * FROM sometable; 
   SomeField | anotherfield | datefield   
  ----------- + -------------- + ------------ 
   fubar | rabuf | 2013-12-30 
   fubar | rabuf | 2013-12-30 
   fubar2 | rabuf2 | 2013-12-30 
  (3 linhas) 

postgres => SELECT * FROM sometable ONDE SomeField = 'fubar'; SomeField | anotherfield | datefield ----------- + -------------- + ---- -------- fubar | rabuf | 2013-12-30 fubar | rabuf | 2013-12-30 (2 linhas)

postgres => \? <- A ajuda irá mostrar-lhe como navegar ao redor.

Mostrar tabelas == \ dt

postgres => \ dt
Lista de relações
Esquema | Nome | Tipo | Dono
-------- + ----------- + ------- + ----------
pública | sometable | mesa | testuser

postgres => ALTER TABLE ADD COLUMN sometable 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 linhas)

SHOW CREATE TABLE == \ d + nometabela
postgres => \ d + sometable
Tabela "public.sometable"
Coluna | Tipo | Modificadores | Armazenamento | Estatísticas alvo | Descrição
-------------- + ------------------------ + ---------- - + ---------- + -------------- + -------------
SomeField | character varying (255) | | estendido | |
anotherfield | character varying (150) | | estendido | |
datefield | data | | simples | |
intfield | integer [] | | estendido | |
Tem OIDs: não


Para ajudar mais você pode instalar pgadmin
yum install pgadmin3_93

Conseguir que a trabalhar e como ele funciona pode ser todo um outro post do blog.

Até agora .... Eu vou ficar com MySQL, mas este é apenas um exemplo simples de usar PostgreSQL. Isso pode fazer com que você começou a se você pode avaliar por si mesmo.

Links úteis abaixo. Por favor, referir-se a estes como eles têm mais experiência com PostgreSQL do que eu.

Friday, December 6, 2013

ERROR 1356 (HY000)

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

A coisa mais importante para compreender quando chegando a um erro é tomar um momento e relaxar. 
Às vezes as pessoas se depara com um erro e tornar-se perturbado e frustrado. Respire fundo e relaxe. Às vezes, " A loucura é como a gravidade. Tudo o que precisa é de um empurrãozinho"e" Às vezes, as questões são complicadas e as respostas são simples . " 

O que é tudo isso? Bem, por exemplo, eu recentemente foi convidado para ajudar a resolver um problema que estava incomodando outro DBA. Nada quis dizer em desrespeito a todos para que DBA mas sendo com pressa as pessoas só têm vista para a resposta que está na frente deles e, em vez espiral para baixo em loucura . 

Aqui é o conceito geral da situação. 

Depois de fazer um mysqldump de um banco de dados que o usuário mudou-se para outro banco de dados para que outros possam ser os testes. A importação funcionou muito bem. No entanto, os usuários começaram a ver os erros quando eles tentaram consultar a partir de uma visão pré-construídos. 

mysql> SELECT * FROM <View_name> limite 1; 

ERROR 1356 (HY000): View '. <DB_NAME> <ViewName>' Referências mesa inválido (s) ou coluna (s) ou função (s) ou definidor / invoker de vista dos direitos falta usá-los 

A primeira reação foi assumir que o algo deu errado com a importação. Será que a vista ou, na verdade, as tabelas relacionadas corrompido? 

Não. 

Para resolver esse erro, a primeira coisa TODO era: mysql> show criar vista <View_Name> \ G 

Você provavelmente vai ver algo que começa assim: 
*************************** 1. linha *************************** 
Exibir: Visitantes 
 
Criar Exibição: CREATE ALGORITMO = DEFINER UNDEFINED = `<Some_user>` @ `<Some_host_or_IP>` SEGURANÇA SQL DEFINER VISTA 

Depois de ver que o definidor é: `<Some_user>` @ `<Some_host_or_IP>` você pode visualizar as subvenções para esse usuário. 

mysql> mostra bolsas para `<Some_user>` @ `<Some_host_or_IP>`; 

Acontece que a solução era exatamente o que o erro, disse em primeiro lugar: "definidor / solicitante de direitos vista a falta de usá-los" 

Para tornar mais fácil que você pode fazer um show subsídios no banco de dados onde já funciona e cópia da declaração de concessão, ou você pode analisar que tipo de permissões que você precisa para implementar no novo banco de dados para permitir a visão para coletar os dados necessários. 

Uma simples atualização de permissões para o usuário e que o erro se foi. 

" Às vezes, as respostas são simples . "